Bilimsel hesaplamada test odaklı geliştirmenin büyük bir savunucusuyum. Pratikte faydası sadece şaşırtıcı ve kod geliştiricilerin bildiği klasik sorunları gerçekten hafifletiyor. Bununla birlikte, genel programlamada karşılaşılmayan bilimsel kodları test etmede doğal zorluklar vardır, bu nedenle TDD metinleri öğreticiler olarak çok yararlı değildir. Örneğin:
Genel olarak, belirli bir karmaşık problem için a priori kesin bir cevap bilmiyorsunuz, bu yüzden nasıl bir test yazabilirsiniz?
Paralellik derecesi değişir; Geçenlerde MPI görevlerini 3'ün katları olarak kullanmanın başarısız olacağı, ancak 2'nin katlarının çalıştığı bir hatayla karşılaştım. Ek olarak, ortak test çerçeveleri MPI'nin doğası gereği çok MPI dostu görünmüyor - görev sayısını değiştirmek için bir test ikili dosyasını yeniden yürütmeniz gerekiyor.
Bilimsel kodlar çoğu zaman sıkıca bağlı, birbirine bağımlı ve değiştirilebilir parçalara sahiptir. Hepimiz eski kodu gördük ve iyi tasarımdan vazgeçmenin ve global değişkenleri kullanmanın ne kadar cazip olduğunu biliyoruz.
Genellikle sayısal bir yöntem bir "deney" olabilir veya kodlayıcı nasıl çalıştığını tam olarak anlamıyor ve anlamaya çalışıyor, bu nedenle sonuçları tahmin etmek imkansız.
Bilimsel kod için yazdığım bazı test örnekleri:
Zaman entegratörleri için, kesin bir çözümle basit bir ODE kullanın ve entegratörünüzün verilen bir doğrulukta çözdüğünü test edin ve doğruluk sırası, değişen adım boyutlarıyla test ederek doğrudur.
Sıfır kararlılık testleri: 0 sınır / başlangıç koşullarına sahip bir yöntemin 0'da kaldığını kontrol edin.
İnterpolasyon testleri: doğrusal bir fonksiyon verildiğinde, enterpolasyonun doğru olduğundan emin olun.
Eski doğrulama: doğru olduğu bilinen eski bir uygulamada bir kod parçasını izole edin ve test için kullanmak üzere bazı ayrık değerleri çekin.
Hala el ile deneme ve hata dışında, belirli bir kod yığınını nasıl düzgün bir şekilde test edemediğimi ortaya çıkıyor. Sayısal kod için yazdığınız bazı test örnekleri ve / veya bilimsel yazılımı test etmek için genel stratejiler sağlayabilir misiniz?