Unit testing untuk kode C ++ - Alat dan metodologi [ditutup]

134

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?

Sakin
sumber
1
Lihat pertanyaan ini: stackoverflow.com/questions/3150/…
Aardvark

Jawaban:

83

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 .

teks alternatif

Joe Schneider
sumber
4
Menambahkan thumbnail - terpilih. Buku ini membantu lebih dari alat apa pun.
Gishu
2
Saya pikir CPPUnit bisa membuatnya lebih mudah untuk menulis tes. Kami menggunakan CPPUnit, tetapi saya tidak puas. Saya perlu memperbarui dua file untuk setiap tes, dan menurut pendapat saya, tes harus semudah menulis: 'TEST ("testname") {ASSERT (1 == 1);}' Buku di sisi lain adalah suatu keharusan bagi semua orang, tidak hanya mereka yang bekerja dengan kode warisan, tetapi juga bagi mereka yang membuatnya;)
daramarak
9
Sejak kapan c ++ legacy ?!
Nils
9
Bukan C ++ yang merupakan warisan - jika saya ingat dengan benar, buku itu mendefinisikan proyek warisan sebagai proyek yang tidak ada, atau sangat sedikit unit test. Proyek-proyek seperti itu cenderung / sulit / untuk menulis unit test, karena pengembangan yang digerakkan oleh tes tidak pernah mempengaruhi basis kode sedemikian rupa sehingga sepele untuk menulisnya.
Arafangion
7
@Nils: Seperti yang dikatakan oleh salah satu pengulas buku Amazon, "kode lama adalah kode tanpa tes unit," yang merupakan pertanyaan sebenarnya.
David Johnstone
40

Google baru-baru ini merilis perpustakaan mereka sendiri untuk unit menguji aplikasi C ++, yang disebut Google Test.

Proyeksikan pada Google Code

agnul
sumber
1
apakah mungkin untuk menggunakan ini dengan VC ++
yesraaj
Tampaknya cukup ok, terutama cara mereka harus menambahkan deskripsi ke setiap pernyataan Di sisi bawah, saya pribadi lebih suka memiliki kelas Tes Unit daripada makro yang benar-benar tidak terlihat seperti kelas.
Wernight
3
Poin bagus lainnya adalah kemungkinan yang mengolok-olok: code.google.com/p/googlemock
Philipp
Saya menemukan ini JAUH lebih bagus daripada CPPUNIT yang membutuhkan banyak makro dan file ajaib untuk membuat tes bekerja
paulm
30

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.

andreas buykx
sumber
2
Bukankah itu kesalahan mendasar kita? Dia memiliki wawasan yang baik tentang proyek yang tersedia - tetapi alih-alih meningkatkannya, dia memulai proyeknya sendiri.
peterchen
@ Peterchen: ya; tetapi kemudian UnitTest ++ sangat kecil dan ringan sehingga memiliki nilai sebagai proyek yang terpisah - sangat mudah untuk berdiri dan berjalan.
TimStaley
24

Boost memiliki pustaka Pengujian yang berisi dukungan untuk pengujian unit. Mungkin perlu dicoba.

Jonas
sumber
4
Saya dapat merekomendasikan toolkit yang luar biasa ini.
Rob
1
Ya, meningkatkan adalah cara yang harus ditempuh. Tidak ada biaya overhead, hanya menguji dan pergi! Saya benar-benar bekerja pada kerangka kerja saya sendiri dalam keputusasaan ketika dorongan datang untuk menyelamatkan saya. Dorongan terima kasih (untuk semuanya!)
daramarak
Anda dapat memeriksa artikel yang saya tulis pengantar Boost Unit Testing beroux.com/english/articles/boost_unit_testing
Wernight
21

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.

Brian Stewart
sumber
17

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 calculatorobjek yang berfungsi pada viewantarmuka (yaitu contoh pengantar Turtle):

// declares a 'mock_view' class implementing 'view'
MOCK_BASE_CLASS( mock_view, view )
{
    // implements the 'display' method from 'view' (taking 1 argument)
    MOCK_METHOD( display, 1 )                   
};

BOOST_AUTO_TEST_CASE( zero_plus_zero_is_zero )
{
    mock_view v;
    calculator c( v );

    // expects the 'display' method to be called once with a parameter value equal to 0
    MOCK_EXPECT( v, display ).once().with( 0 ); 

    c.add( 0, 0 );
}

Lihat betapa mudah dan verbose itu menyatakan harapan pada objek tiruan? Jelas, tes gagal jika harapan tidak terpenuhi.

icecrime
sumber
14

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:

  • Hanya judul
  • Registrasi otomatis berdasarkan tes fungsi dan metode
  • Menguraikan ekspresi C ++ standar menjadi LHS dan RHS (jadi Anda tidak perlu seluruh keluarga makro pernyataan).
  • Dukungan untuk bagian bersarang dalam fixture berbasis fungsi
  • Tes nama menggunakan bahasa alami - nama fungsi / metode dihasilkan

Ini juga memiliki binding Objective-C.

philsquared
sumber
4
doctest adalah implementasi ulang saya dari Catch dengan fokus besar pada kecepatan kompilasi - checkout FAQ untuk melihat perbedaannya
onqtam
9

CxxTest adalah kerangka yang ringan, mudah digunakan dan lintas platform JUnit / CppUnit / xUnit untuk C ++.

David Sykes
sumber
7

UnitTest ++ , kecil & sederhana.

yrp
sumber
6

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.

Knitschi
sumber
3

Lihat juga jawaban untuk pertanyaan terkait erat "memilih alat / kerangka pengujian unit c ++", di sini

TonJ
sumber
3

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.

filant
sumber
2
Saya memasang perpustakaan hanya header yang menyediakan fungsi pembungkus makro TUT dan menguji kode deklarasi untuk menyederhanakannya dan memberikan informasi nomor file dan baris dalam kegagalan. Berikut ini tautan ke pos dengan contoh-contoh perbedaan dalam keluaran dan kode serta tautan ke proyek di github: codecrafter.wordpress.com/2012/12/19/tutadapter1
Josh Heitzman
2

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.)

Dror Helper
sumber
2

CppUTest adalah kerangka kerja ringan dan sangat baik untuk pengujian unit C dan C ++.

ratkok
sumber
1

Michael Feathers dari ObjectMentor berperan penting dalam pengembangan CppUnit dan CppUnitLite.

Dia sekarang merekomendasikan CppUnitLite

Seb Rose
sumber
1

Lihatlah CUnitWin32 . Ini ditulis untuk MS Visual C. Ini termasuk contoh.

Dushara
sumber
1

Lihatlah cfix ( http://www.cfix-testing.org ), ini khusus untuk pengembangan Windows C / C ++ dan mendukung pengujian mode pengguna dan mode unit kernel.

Johannes Passing
sumber
Terima kasih telah berbagi. Saya baru-baru ini mulai menggunakan perbaikan untuk tujuan pengujian. Saya sedang mencari cara untuk melihat tumpukan panggilan baik dalam kasus lulus dan gagal. Apakah ada cara dalam perbaikan untuk mencapai ini?
MencobaToLearn
1

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.

Jared
sumber
1

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.

Ohad Horesh
sumber