Saya sedang mengerjakan sistem c ++ besar yang telah dikembangkan selama beberapa tahun sekarang. Sebagai bagian dari upaya untuk meningkatkan kualitas kode yang ada, kami terlibat dalam proyek refactoring jangka panjang yang besar.
Apakah Anda tahu alat yang bagus yang dapat membantu saya menulis unit test dalam C ++? Mungkin sesuatu yang mirip dengan Junit atau Nunit?
Adakah yang bisa memberikan saran yang bagus tentang metodologi tes unit menulis untuk modul yang ditulis tanpa pengujian unit dalam pikiran?
c++
unit-testing
refactoring
Sakin
sumber
sumber
Jawaban:
Menerapkan tes unit ke kode lama adalah alasan utama Bekerja Efektif dengan Kode Lama ditulis. Michael Feathers adalah penulisnya - sebagaimana disebutkan dalam jawaban lain, ia terlibat dalam pembuatan CppUnit dan CppUnitLite .
sumber
Google baru-baru ini merilis perpustakaan mereka sendiri untuk unit menguji aplikasi C ++, yang disebut Google Test.
Proyeksikan pada Google Code
sumber
Lihatlah perbandingan luar biasa antara beberapa suite yang tersedia. Penulis artikel itu kemudian mengembangkan UnitTest ++ .
Apa yang saya sukai khususnya (terlepas dari kenyataan bahwa ia menangani pengecualian, dll. Dengan baik) adalah bahwa ada 'administrasi' yang sangat terbatas di sekitar kasus uji dan definisi perlengkapan tes.
sumber
Boost memiliki pustaka Pengujian yang berisi dukungan untuk pengujian unit. Mungkin perlu dicoba.
sumber
Noel Llopis dari Games From Within adalah penulis dari Exploring the C ++ Unit Testing Framework , sebuah evaluasi komprehensif (namun sekarang sudah ketinggalan jaman) dari berbagai kerangka kerja C ++ Unit Testing, serta sebuah buku tentang pemrograman game.
Dia menggunakan CppUnitLite cukup lama, memperbaiki berbagai hal, tetapi akhirnya bergabung dengan penulis perpustakaan unit test lain, dan menghasilkan UnitTest ++ . Kami menggunakan UnitTest ++ di sini, dan saya sangat menyukainya, sejauh ini. Ia (bagi saya) memiliki keseimbangan kekuatan yang tepat dengan jejak kecil.
Saya telah menggunakan solusi buatan sendiri, CxxTest (yang membutuhkan Perl), dan tingkatkan :: test. Ketika saya menerapkan pengujian unit di sini di pekerjaan saya saat ini, itu cukup banyak turun ke UnitTest ++ vs boost :: test.
Saya sangat suka kebanyakan perpustakaan yang saya gunakan, tetapi IMHO, boost :: test agak terlalu berat. Saya terutama tidak suka itu mengharuskan Anda (AFAIK) untuk mengimplementasikan program utama harness uji menggunakan boost :: test macro. Saya tahu bahwa itu bukan TDD "murni", tetapi kadang-kadang kita perlu cara untuk menjalankan tes dari aplikasi GUI, misalnya ketika bendera uji khusus dilewatkan di baris perintah, dan boost :: test tidak dapat mendukung jenis ini skenario.
UnitTest ++ adalah kerangka uji paling sederhana untuk mengatur dan menggunakan yang saya temui dalam pengalaman (terbatas) saya.
sumber
Saya menggunakan Boost.Test library yang sangat baik dalam hubungannya dengan Turtle library yang kurang dikenal tetapi oh-begitu-mengagumkan : perpustakaan objek tiruan berdasarkan boost.
Sebagai contoh kode berbicara lebih baik daripada kata-kata, bayangkan Anda ingin menguji
calculator
objek yang berfungsi padaview
antarmuka (yaitu contoh pengantar Turtle):Lihat betapa mudah dan verbose itu menyatakan harapan pada objek tiruan? Jelas, tes gagal jika harapan tidak terpenuhi.
sumber
Saya baru saja mendorong kerangka kerja saya sendiri, CATCH , di luar sana. Ini masih dalam pengembangan tetapi saya percaya itu sudah melampaui sebagian besar kerangka kerja lainnya. Orang yang berbeda memiliki kriteria yang berbeda tetapi saya telah mencoba untuk menutupi sebagian besar tanpa terlalu banyak pertukaran. Lihatlah entri blog saya yang terhubung untuk pencicip. Lima fitur utama saya adalah:
Ini juga memiliki binding Objective-C.
sumber
CxxTest adalah kerangka yang ringan, mudah digunakan dan lintas platform JUnit / CppUnit / xUnit untuk C ++.
sumber
CppUnit adalah caranya. Lihat tautan di bawah:
http://cppunit.sourceforge.net/cppunit-wiki
http://en.wikipedia.org/wiki/CppUnit
sumber
UnitTest ++ , kecil & sederhana.
sumber
Saat ini saya sedang mencari unit test dan mock framework yang dapat digunakan di perusahaan kami untuk basis kode yang berumur panjang. Seperti yang Anda ketahui, daftar kerangka pengujian unit untuk c ++ panjang, jadi saya menerapkan beberapa filter untuk menguranginya menjadi hand-full yang dapat dilihat lebih dekat. Kriteria filter pertama adalah itu harus gratis. Kriteria kedua adalah aktivitas proyek. Saya juga mencari kerangka kerja mengejek karena Anda memerlukannya jika Anda ingin menulis unit-test.
Saya datang dengan daftar berikut (kurang-lebih) diurutkan berdasarkan aktivitas, aktivitas tertinggi di atas:
GoogleTest / GoogleMock: Banyak kontributor dan digunakan oleh Google sendiri. Ini mungkin akan berada di sini untuk beberapa waktu dan menerima pembaruan. Untuk basis kode pribadi saya, saya akan beralih ke kombinasi ini dengan harapan untuk naik kereta tercepat.
BoostTest + Turtle: Tidak diperbarui sesering itu, tetapi kerangka pengujian adalah bagian dari dorongan sehingga harus dipertahankan. Penyu di sisi lain dikelola terutama oleh satu orang, tetapi memiliki aktivitas yang membenci sehingga tidak mati. Saya membuat hampir semua pengalaman pengujian saya dengan kombinasi ini karena kami sudah menggunakan boost library di pekerjaan saya sebelumnya dan saat ini saya menggunakannya untuk kode pribadi saya.
CppUTest: Menyediakan pengujian dan ejekan. Proyek ini telah aktif dari 2008 hingga 2015 dan memiliki aktivitas yang cukup baru. Temuan ini sedikit mengejutkan karena banyak proyek dengan aktivitas yang jauh lebih sedikit muncul lebih sering ketika mencari di web (seperti CppUnit yang memiliki pembaruan terakhir pada 2013). Saya belum melihat lebih dalam tentang ini jadi saya tidak bisa mengatakan apa-apa tentang detailnya. Sunting (16.12.2015): Saya baru-baru ini mencoba ini dan menemukan kerangka kerja ini menjadi sedikit canggung dan "bergaya C", terutama ketika menggunakan kelas mock. Juga tampaknya memiliki variasi penegasan yang lebih kecil daripada kerangka kerja lainnya. Saya pikir kekuatan utamanya adalah dapat digunakan dengan proyek C murni.
QTest: Perpustakaan uji yang dikirimkan dengan kerangka kerja Qt. Maintanance harus dijamin untuk beberapa waktu, tetapi saya menggunakannya sebagai perpustakaan pendukung, karena tes-pendaftaran IMO lebih canggung daripada di kerangka kerja lain. Sejauh yang saya mengerti, itu memaksa Anda untuk memiliki satu test-exe per tes-fixture. Tetapi fungsi pembantu tes dapat digunakan dengan baik saat menguji kode Qt-Gui. Tidak memiliki ejekan.
Catch: Ini memiliki aktivitas terbaru tetapi terutama dikembangkan oleh satu orang. Yang menyenangkan tentang kerangka kerja ini adalah pendekatan fixture alternatif yang memungkinkan Anda menulis kode fixture yang dapat digunakan kembali dalam tes itu sendiri. Ini juga memungkinkan Anda menetapkan nama uji sebagai string yang bagus ketika Anda cenderung menulis seluruh kalimat sebagai nama uji. Saya berharap gaya ini akan robek dan dimasukkan ke googleTest ;-)
Kerangka Kerja Mock
Jumlah kerangka tiruan jauh lebih kecil daripada jumlah kerangka uji tapi di sini ada yang saya temukan memiliki aktivitas terbaru.
Hippomock : Aktif dari 2008 unitl sekarang tetapi hanya dengan intensitas rendah.
FakeIt : Aktif dari 2013 unitl sekarang tetapi lebih atau kurang dikembangkan oleh satu orang.
Kesimpulan
Jika basis kode Anda dalam jangka panjang, pilih antara BoostTest + Turtle dan GoogleTest + GoogleMock . Saya pikir keduanya akan memiliki pemeliharaan jangka panjang. Jika Anda hanya memiliki basis kode yang berumur pendek, Anda bisa mencoba Catch yang memiliki sintaks yang bagus. Maka Anda perlu juga memilih kerangka kerja mengejek. Jika Anda bekerja dengan Visual Studio, Anda dapat mengunduh adaptor pelari uji untuk BoostTest dan GoogleTest, yang memungkinkan Anda untuk menjalankan tes dengan GUI pelari uji yang terintegrasi ke dalam VS.
sumber
Lihat juga jawaban untuk pertanyaan terkait erat "memilih alat / kerangka pengujian unit c ++", di sini
sumber
Ada juga TUT , Template-Unit-Test, kerangka kerja berbasis template. Sintaksnya canggung (beberapa menyebutnya penyalahgunaan template), tetapi keuntungan utamanya adalah semuanya tersimpan dalam satu file header .
Anda akan menemukan contoh unit-test yang ditulis dengan TUT di sini.
sumber
Saya sudah mencoba CPPunit dan tidak terlalu ramah pengguna.
Satu-satunya alternatif yang saya tahu adalah menggunakan C ++. NET untuk membungkus kelas C ++ Anda dan menulis tes unit dengan salah satu kerangka pengujian unit .NET (NUnit, MBUnit dll.)
sumber
CppUTest adalah kerangka kerja ringan dan sangat baik untuk pengujian unit C dan C ++.
sumber
Michael Feathers dari ObjectMentor berperan penting dalam pengembangan CppUnit dan CppUnitLite.
Dia sekarang merekomendasikan CppUnitLite
sumber
Lihatlah CUnitWin32 . Ini ditulis untuk MS Visual C. Ini termasuk contoh.
sumber
Lihatlah cfix ( http://www.cfix-testing.org ), ini khusus untuk pengembangan Windows C / C ++ dan mendukung pengujian mode pengguna dan mode unit kernel.
sumber
Jika Anda menggunakan Visual Studio 2008 SP1, saya sangat merekomendasikan menggunakan MSTest untuk menulis tes unit. Saya kemudian menggunakan Google tiruan untuk menulis tiruan. Integrasi dengan IDE sangat ideal dan memungkinkan dan tidak membawa overhead CPPunit dalam hal mengedit tiga tempat untuk penambahan satu tes.
sumber
Saya pikir VisualAssert melakukan pekerjaan yang hebat dalam integrasi VS. Ini memungkinkan Anda menjalankan dan men-debug tes dari VS dan Anda tidak perlu membuat yang dapat dieksekusi untuk menjalankan tes.
sumber
Lihat fruktosa: http://sourceforge.net/projects/fructose/
Ini adalah kerangka kerja yang sangat sederhana, hanya berisi file header dan mudah dibawa-bawa.
sumber
Saya menggunakan Tes MS dengan Typemock Isolator ++ . Cobalah!
sumber