Kerangka uji unit apa untuk game berbasis c ++? [Tutup]

13

Kombinasi alat pengujian manakah yang Anda rasa paling baik? Dengan kerangka / pustaka pilihan Anda, Anda dapat mempertimbangkan:


Catatan: Meskipun ini berpotensi pertanyaan umum seperti yang ada di SO, saya berpendapat bahwa pengembangan game biasanya terikat pada alur kerja tertentu yang memengaruhi pilihan untuk pengujian. Untuk perspektif level yang lebih tinggi, lihat pertanyaan Pengujian game secara otomatis .

jmp97
sumber
Meskipun saya tidak secara langsung melihat ada yang salah dengan pertanyaan ini, saya pikir itu akan bermanfaat jika dibuat Komunitas Wiki. Misalnya: gamedev.stackexchange.com/questions/480/…
Jesse Dorsey
Saya membuatnya CW. Namun, saya pikir pedoman kapan membuat pertanyaan CW tampak agak tidak jelas bagi saya sebagai pendatang baru, terutama karena ini diperdebatkan secara umum ( meta.stackexchange.com/questions/55888 ). Mungkin kita bisa secara eksplisit menyatakan kebijakan gamedev mengenai hal ini di FAQ?
jmp97

Jawaban:

7

Saya menemukan UnitTest ++ sangat mudah untuk dikerjakan. Saya masih harus mencoba amop bersama dengannya, yang disebut-sebut sebagai pendamping yang baik untuk UnitTest ++ untuk fungsionalitas objek tiruan. Kalau tidak, Google Mock adalah pilihan populer. Juga, Anda mungkin ingin membaca UnitTest ++ dan Objek Mock .

UnitTest ++ dapat diatur dengan pendekatan Integrasi Berkelanjutan Anda, misalnya dengan Hudson

Anda mungkin ingin membaca posting yang menginspirasi ini jika Anda tidak yakin pengujian unit dan permainan berjalan bersama dengan baik.

jmp97
sumber
UnitTest ++ adalah satu-satunya kerangka pengujian yang harus Anda butuhkan, terutama mengingat bahwa itu mudah untuk dimodifikasi dan diperluas. Jika Anda mendapati diri Anda melakukan pemrograman Java di lain waktu, JUnit akan memukul Anda berulang kali di wajah dengan palu dengan inelegance total yang ditampilkan.
dash-tom-bang
Untuk UnitTest ++, buka github.com/unittest-cpp/unittest-cpp. Segala sesuatu yang lain sudah ketinggalan zaman.
Markus
4

Pilihan lain untuk UnitTest ++ . Sangat mudah diintegrasikan, dikompilasi untuk platform tertanam target kami dengan sangat mudah, langsung dan mudah digunakan. Kami juga telah mengintegrasikannya dengan Hudson. Kami melihat GoogleTest tetapi menolaknya (saya pikir ada masalah saat menyusun platform target kami) tetapi ia memiliki rangkaian fitur yang sama dan mungkin cocok untuk Anda.

Selain itu Anda mungkin ingin melihat ke dalam semacam kerangka pengujian asap. Dalam pengalaman saya, sulit untuk mendapatkan cakupan tes yang cukup untuk permainan dengan tes unit saja. Terutama jika Anda memperkenalkan pengujian unit ke basis kode yang ada, dan bahkan lebih untuk tim besar. Pengujian asap akan menguji hal-hal tingkat tinggi seperti "pastikan semua level memuat". Teori saya adalah jika saya memiliki kedua jenis pengujian maka pada titik tertentu mereka mungkin bertemu di tengah dan memberikan converage yang layak. :)

Chris Howe
sumber
2

Kembali ketika saya bekerja di C ++ (disclaimer: ini sekitar 2005), saya menggunakan versi TUT yang sedikit dimodifikasi (Kerangka Uji Unit Templat) . Saya menyukainya karena sangat ringan, yang membuatnya mudah untuk dimodifikasi, dan berarti ada sangat sedikit "lem" yang diperlukan ketika menulis tes.

Ini adalah salah satu modifikasi sederhana yang saya buat, yang membuatnya lebih mudah / bersih untuk menulis tes:

static int BogusFunction() { return __COUNTER__; } // Increment the __COUNTER__ to the correct position for the begining of the tests
#define TEST template<> template<> void object::test<__COUNTER__>()
#define ENSURE(msg, cond) ensure(msg, cond, __FILE__, __LINE__)
#define ENSURE_EQUALS(msg, actual, expected) ensure_equals(msg, actual, expected, __FILE__, __LINE__)
#define ENSURE_DISTANCE(msg, actual, expected, distance) ensure_distance(msg, actual, expected, distance, __FILE__, __LINE__)
#define FAIL(msg) fail(msg, __FILE__, __LINE__)

Perubahan lain yang saya buat adalah untuk format outputnya, sehingga kegagalan tes akan muncul dengan benar dalam daftar kesalahan Visual Studios (ketika dijalankan sebagai bagian dari build), dapat diklik untuk pergi ke file dan garis tes gagal.

(Kemampuan untuk melakukan hal semacam ini berarti bahwa hal itu dapat dibuat agar sesuai dengan proses TDD / CI Anda, daripada memaksa Anda untuk masuk ke dalamnya.)

Berikut ini adalah contoh uji (dari tumpukan perintah dari editor saya):

TEST // Undoing a command
{
    cs.AddCommand(new TestCommand);
    cs.AddCommand(new TestCommand(od));

    ENSURE("Undo success", cs.Undo());
    ENSURE_EQUALS("Stack size", cs.size(), 2);
    ENSURE_EQUALS("Command's Undo() was called", od.undo, 1);
    ENSURE_EQUALS("Command's Redo() not called", od.redo, 0);

    ACommandStack::const_iterator it = cs.end();
    ENSURE("Command is redoable", cs.GetUndoPos() == --it);
}

(Dalam kode di atas, csdan odmerupakan perlengkapan per-modul, dan TestCommandmerupakan objek tiruan.)

Andrew Russell
sumber
2

Ketika datang ke C ++, saya telah mencoba dan menggunakan kerangka kerja googletest, http://code.google.com/p/googletest/ . Mudah diatur, mudah digunakan, dan bekerja dengan sangat baik.

Simon
sumber
2

Saya bukan pengembang game profesional, tetapi saya adalah pengembang embedded profesional. Mungkin tidak persis suka game tapi dekat. Di tempat kerja saya, kami telah menggunakan beberapa.

Saya sangat suka tes google . Ini memiliki semua fitur terbaik dari kerangka kerja unit test baru-baru ini, sekaligus menjaganya tetap dalam antarmuka minimal stream stream.

Berikutnya dalam daftar saya adalah Tes Peningkatan . Api tes Google sedikit lebih modern daripada Boost.Test, tetapi Boost Test telah melakukan pekerjaan luar biasa untuk menambahkan fitur baru dan membuang paradigma CppUnit yang kasar.

Saya juga menggunakan CxxTest . Ini dilakukan dengan cukup baik tetapi Anda dapat mengatakan bahwa itu tidak semodern Boost.Test atau Google Test. Secara khusus, dukungannya untuk suite dan perlengkapan uji agak canggung.

Saya suka menggunakan fitur-fitur canggih, tetapi jika Anda seorang minimalis Anda tidak akan pernah melihat perbedaan antara ketiganya. Sebagian besar kolega saya akan senang dengan kerangka kerja unit test yang mendukung tes registrasi otomatis (secara deklaratif) dan memiliki semacam semacam CHECK_EQUALS (a, b) makro.

deft_code
sumber
1

Pustaka pengujian favorit saya adalah QuickCheck http://en.wikipedia.org/wiki/QuickCheck . Ada versi C ++ eksperimental, tetapi terlihat terlalu berat, tetapi bahkan tanpa perpustakaan khusus prinsip-prinsipnya mudah digunakan.

Semua kelas saya memiliki metode genArbitrary yang dapat menghasilkan contoh acak. Saya menggunakan ini untuk pengujian asap proses yang dapat dibalik, seperti memuat dan membongkar. Saya dapat menghasilkan ribuan adegan acak dan memeriksa bahwa berbagai properti tahan (seperti adegan yang saya serialkan sama dengan adegan yang saya deserialize).

Itu tidak menggantikan tes unit tradisional (itu memang mengurangi kebutuhan untuk banyak tes unit potensial), tetapi ini merupakan cara yang bagus untuk menemukan bug, dan itu membantu stres menguji strategi alokasi memori saya (bersama dengan Valgrind). Sangat bagus untuk mengawasi lebih dari satu juta alokasi keluar Valgrind murni :).

Saya biasa menggunakan CxxTest sebagai test harness, yang saya sukai. Sekarang semua tes saya adalah ongkos terpisah. Saya hanya memiliki folder bernama Test, dan pernah file yang dimulai dengan Test_ menjadi tes. Sejauh ini sangat ringan untuk melakukan tes.

Jonathan Fischoff
sumber
0

Dengan Java, ada begitu banyak pustaka yang bagus ... Tidak seperti C ++.

Untuk pengguna C ++, ada alat rantai dari Kitware yang sangat menarik:

  • CMake: membuat alat
  • CDash: alat integrasi berkelanjutan

Kitware menulis kode C ++ untuk Ilmu Komputer.

Untuk proyek pribadi, saya menggunakan perpustakaan uji unit Boost (pada platform Desktop). Untuk Integrasi Berkelanjutan, saya menggunakan Hudson:

  • instal mudah di Tomcat
  • skrip
Ellis
sumber
0

Saya akan kedua kerangka TUT (Template Unit Test) ; itu super ringan dan sangat fleksibel, belum lagi sangat mudah untuk diatur dan digunakan di luar kotak (termasuk satu header, sedikit kode utama / pengaturan, dan 24 baris kode uji nanti Anda memiliki unit test). Saya telah mengkombinasikannya dengan binfmtc (menjalankan program C ++ sebagai skrip) untuk prototyping cepat / TDD / templat pembelajaran untuk kesuksesan besar, termasuk pengembangan perangkat lunak tertanam. Karena mampu menghasilkan ke XML, itu juga cocok dengan Jenkins (CI) dan Sonar pada proyek-proyek saya yang berurutan.

Nathan Paul Simons
sumber