it-swarm-id.com

Unit testing untuk kode C++ - Alat dan metodologi

Saya sedang mengerjakan sistem c ++ besar yang telah dikembangkan selama beberapa tahun sekarang. Sebagai bagian dari upaya untuk meningkatkan kualitas kode yang ada, kami melakukan 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 penulisan unit test untuk modul yang ditulis tanpa memikirkan unit testing?

134
Sakin

Menerapkan tes unit ke kode lawas adalah alasan sangatBekerja Efektif dengan Kode Legacy ditulis. Michael Feathers adalah penulisnya - sebagaimana disebutkan dalam jawaban lain, ia terlibat dalam penciptaan baik CppUnit dan CppUnitLite .

alt text

78
Joe Schneider

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

Proyek dengan Google Code

38
agnul

Lihat perbandingan 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 jumlah 'administrasi' yang sangat terbatas di sekitar kasus uji dan definisi perlengkapan tes. 

30
andreas buykx

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

24
Jonas

Noel Llopis dari Games From Within adalah penulis dari Menjelajahi Kerangka Uji Coba Unit C++ , evaluasi komprehensif (namun sekarang sudah usang) dari berbagai kerangka kerja Unit Pengujian C++, serta 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 mengimplementasikan 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, tapi 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 membutuhkan cara untuk menjalankan tes dari aplikasi GUI, misalnya ketika bendera uji khusus dilewatkan pada 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 saya (terbatas). 

21
Brian Stewart

Saya menggunakan perpustakaan Boost.Test yang sangat baik dalam hubungannya dengan perpustakaan yang kurang dikenal tetapi oh-sangat-mengagumkan Penyu : perpustakaan obyek tiruan berdasarkan dorongan.

Sebagai contoh kode berbicara lebih baik daripada kata-kata, bayangkan Anda ingin menguji objek calculator yang bekerja pada antarmuka view (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.

17
icecrime

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 tapi saya sudah mencoba untuk menutupi sebagian besar tanah tanpa terlalu banyak trade-off . Lihatlah entri blog saya yang ditautkan untuk pengecap. 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.

14
philsquared

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

9
David Sykes
7
Jorge Ferreira

UnitTest ++ , kecil & sederhana.

7
yrp

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 tahu daftar kerangka kerja 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 saya saat ini gunakan 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 detail .Edit (16.12.2015): Saya baru-baru ini mencoba ini dan menemukan kerangka kerja ini menjadi sedikit canggung dan "C- stylish ", terutama saat menggunakan kelas tiruan. Juga tampaknya memiliki variasi pernyataan yang lebih kecil daripada kerangka kerja lainnya. Saya pikir kekuatan utamanya adalah dapat digunakan dengan proyek C murni.

  • QTest: Pustaka 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. Ia 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 kerja 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 singkat, Anda dapat mencoba Tangkap yang memiliki sintaksis 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.

5
Knitschi

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

3
TonJ

Ada juga TUT , Template-Unit-Test, kerangka kerja berbasis template. Sintaksnya canggung (ada yang menyebutnya penyalah-templat), tetapi keunggulan utamanya adalah semuanya ada di file single header

Anda akan menemukan contoh unit-test yang ditulis dengan TUT di sini. 

3
philant

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

2
ratkok

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

2
Dror Helper

Jika Anda menggunakan Visual Studio 2008 SP1, saya akan sangat menyarankan menggunakan MSTest untuk menulis tes unit. Saya kemudian menggunakan Google tiruan untuk menulis tiruan. Integrasi dengan IDE ideal dan memungkinkan dan tidak membawa overhead CPPunit dalam hal mengedit tiga tempat untuk penambahan satu tes.

1
Jared

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

1
Johannes Passing

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

Dia sekarang merekomendasikan CppUnitLite

1
Seb Rose

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.

1
Ohad Horesh

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

1
Dushara

Lihat fruktosa: http://sourceforge.net/projects/fructose/

Ini adalah kerangka kerja yang sangat sederhana, hanya berisi file header dan mudah dibawa-bawa.

0
rik

Saya menggunakan MS Test dengan Typemock Isolator ++ . Cobalah!

0
Sam