Suite pengujian untuk aplikasi numerik dalam C ++?

13

Baru-baru ini, saya telah mendorong grup saya untuk memasukkan lebih banyak pengujian saat menulis kode mereka. Ada beberapa bug utama yang membutuhkan waktu lebih lama untuk ditangkap daripada yang mungkin diperlukan, karena kami tidak memiliki rezim pengujian yang baik.

Namun, saya menduga bahwa memiliki alat yang tepat untuk mengotomatisasi (atau membantu merampingkan) proses, tentu akan bermanfaat. Di sisi lain, saya tidak tahu berbagai opsi untuk suite pengujian C ++, dan bagaimana memutuskan di antara mereka?

Apakah ada pedoman untuk apa yang harus dicari — dan apakah ada yang secara khusus diarahkan pada aplikasi numerik?

aeismail
sumber

Jawaban:

11

Masalah dengan pengujian kode numerik adalah bahwa (i) Anda mungkin tidak selalu mengetahui output yang tepat dan Anda hanya akan dapat menyimpan hasil perhitungan sekarang untuk dibandingkan dengan nanti - yaitu, untuk melakukan tes regresi, dan (ii) hasil yang mungkin berbeda dengan jumlah kecil pada mesin yang berbeda karena pembulatan yang berbeda.

Untuk melihat bagaimana deal.II melakukannya, lihat di sini: http://www.dealii.org/developer/development/testsuite.html#regress_tests

Wolfgang Bangerth
sumber
Poin bagus tentang keterbatasan pengujian unit. Pengujian regresi adalah hal yang baik (tentu saja lebih baik daripada tidak menguji sama sekali karena output tidak diketahui; dapat memberikan tanda peringatan tentang bug). Adapun masalah pembulatan mesin, apakah mengurangi itu beralih ke memilih toleransi yang baik melalui trial and error?
Geoff Oxberry
2
Ini adalah rasa sakit yang konstan. Dalam lebih dari 10 tahun pengujian, kami tidak pernah menemukan strategi yang sangat bagus untuk menghadapinya. Menggunakan numdiff sebagai ganti diff dapat membantu, tetapi pada akhirnya Anda harus menetapkan satu mesin yang Anda simpan "0,3987" alih-alih "0,3988" yang Anda dapatkan di komputer lain ketika angka yang benar adalah 0,39875. Di mana pun Anda menetapkan ambang, Anda akan selalu memotong satu nomor dari yang lain di tempat yang salah.
Wolfgang Bangerth
@WolfgangBangerth. Ada beberapa flag spesifik compiler tertentu yang membuat perilaku floating point lebih deterministik. Misalnya / fp: ketat | presisi dan / Qimf-lengkung-konsistensi: true (Intel compiler) atau -fnounsafe-math-optimizations, -float-store (GCC) dapat membuat kode Anda lebih konsisten dan dapat diproduksi ulang di seluruh platform dengan biaya kinerja . Dengan beberapa penyesuaian, ini menyediakan build "reproducible" khusus, yang dapat digunakan secara khusus untuk pengujian.
André
@Andre - oh ya, kami mencoba semua ini. Masih sulit :-)
Wolfgang Bangerth
10

Saya baru-baru ini menggunakan googletest untuk menguji beberapa perpustakaan numerik yang saya kerjakan, dan sangat senang dengannya. Anda dapat menulis tes yang cukup sederhana dengan sangat cepat atau Anda dapat menulis tes rumit yang memerlukan inisialisasi data dan sebagainya. Ini juga menyediakan (seperti saya yakin banyak orang lain) cara untuk dengan mudah melakukan perbandingan floating point daripada bitwise.

tukang
sumber
Satu hal yang menyenangkan tentang googletest adalah mereka membuatnya mudah untuk memasukkan kode sumbernya dalam suatu aplikasi, jadi Anda tidak harus menjadikannya dependensi.
Geoff Oxberry
4

Jika Anda membuat kode dengan CMake, mekanisme ctest akan menjadi pilihan yang jelas. Ini memungkinkan Anda untuk menguji kode Anda secara manual melalui perintah ctest, dan juga mendukung pengujian malam yang luas melalui CDash .

Nico Schlömer
sumber
1

Untuk pustaka biologi C ++ komputasi kami ( Chaste ) kami menggunakan http://cxxtest.com/ . Ini cukup mudah digunakan, berfungsi dengan baik, ia menyediakan beberapa makro untuk pengujian dengan assert()pernyataan gaya. Untuk komputasi ilmiah ini umumnya perbandingan langsung dengan TS_ASSERT_EQUALS(a,b)atau perbandingan numerik TS_ASSERT_DELTA(a,b,tolerance).

Makro tambahan dapat dengan mudah ditulis menggunakan yang dasar ini untuk membandingkan vektor / matriks pilihan Anda sendiri juga. Berguna, Anda juga dapat memeriksa bahwa kode Anda memberikan peringatan dan pesan kesalahan yang sesuai dalam situasi tertentu. Anda dapat menelusuri beberapa contoh di testfolder kode sumber kami di sini: https://chaste.cs.ox.ac.uk/trac/browser/trunk

keajaiban
sumber