Saya seorang penganjur besar pengembangan yang digerakkan oleh tes dalam komputasi ilmiah. Utilitas dalam praktiknya hanya mengejutkan, dan benar-benar mengurangi masalah klasik yang diketahui pengembang kode. Namun, ada kesulitan yang melekat dalam pengujian kode ilmiah yang tidak ditemukan dalam pemrograman umum, sehingga teks TDD tidak terlalu berguna sebagai tutorial. Sebagai contoh:
Secara umum Anda tidak tahu jawaban pasti untuk masalah kompleks yang diberikan a priori, jadi bagaimana Anda bisa menulis tes?
Tingkat paralelisme berubah; Saya baru-baru ini menemukan bug di mana menggunakan tugas MPI sebagai kelipatan 3 akan gagal, tetapi kelipatan 2 bekerja. Selain itu, kerangka kerja pengujian umum tampaknya tidak terlalu ramah-MPI karena sifat dasar MPI - Anda harus menjalankan kembali biner uji untuk mengubah jumlah tugas.
Kode ilmiah sering memiliki banyak bagian yang saling berhubungan erat, saling tergantung dan dipertukarkan. Kita semua telah melihat kode lawas, dan kita tahu betapa menggoda untuk melupakan desain yang baik dan menggunakan variabel global.
Seringkali metode numerik dapat berupa "eksperimen", atau pembuat kode tidak sepenuhnya memahami cara kerjanya dan mencoba memahaminya, sehingga mengantisipasi hasil tidak mungkin.
Beberapa contoh tes yang saya tulis untuk kode ilmiah:
Untuk integrator waktu, gunakan ODE sederhana dengan solusi yang tepat, dan uji integrator Anda menyelesaikannya dalam akurasi yang diberikan, dan urutan akurasi benar dengan menguji dengan ukuran langkah yang bervariasi.
Tes stabilitas nol: periksa apakah metode dengan 0 batas / kondisi awal tetap pada 0.
Tes interpolasi: diberi fungsi linier, pastikan interpolasi benar.
Validasi legacy: mengisolasi sepotong kode dalam aplikasi legacy yang diketahui benar, dan menarik beberapa nilai diskrit untuk digunakan untuk pengujian.
Masih sering muncul bahwa saya tidak tahu bagaimana cara benar menguji sepotong kode yang diberikan, selain dari coba-coba manual. Bisakah Anda memberikan beberapa contoh tes yang Anda tulis untuk kode numerik, dan / atau strategi umum untuk menguji perangkat lunak ilmiah?