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?
Jawaban:
Metode solusi buatan .
Verifikasi melalui studi perbaikan bahwa metode ini mencapai urutan akurasi teoretis.
Konservasi jawaban. Reproduksi sedikit-bijaksana dan norma-bijaksana solusi.
sumber
Bill telah membuat daftar beberapa metode untuk mengatasi masalah Anda.
Mengatasi poin ketiga Anda, tidak, tidak ada alasan untuk memperkenalkan kopling yang kuat antar bagian. Justru sebaliknya: jika fungsi atau kelas Anda memiliki antarmuka yang terdefinisi dengan baik, akan lebih mudah untuk bertukar misalnya pemecah linear untuk yang lain, atau skema loncatan waktu. Tolak saja, dan kemudian Anda akan dapat menguji komponen-komponen ini secara terpisah. Kami telah melakukan ini dengan kesepakatan. II selama beberapa dekade.
Ke poin keempat: jika metode Anda adalah eksperimen, percobaan Anda dengan metode tersebut merupakan ujian. Selama Anda tidak memiliki analisis, Anda harus mengambil hasil tes ini sebaik mungkin. Tetapi biasanya, Anda memiliki harapan misalnya untuk urutan metode, atau Anda akan tahu itu tepat untuk kelas solusi tertentu, misalnya polinomial hingga tingkat tertentu. Memverifikasi ini harus menjadi bagian dari eksperimen Anda, dan ketika analisis meningkat, tes dapat ditambahkan.
sumber
Saya baru-baru ini menemukan tesis ini pada TDD dalam Ilmu Komputasi. Saya belum membacanya jadi saya tidak tahu apakah itu bagus, tapi mudah-mudahan ini bisa membantu.
http://cyber.ua.edu/files/2014/12/u0015_0000001_0001551.pdf
sumber