Hesaplamalı bilim programlamamın çoğunun standart test çerçeveleri kapsamında olmayan test gereksinimlerine sahip olduğunu buldum:
Hesaplama süresi testi
- Algoritmaların yavaşlamadığından emin olmak için. Gibi bir şey yapabilirdim
assureSmallerEqual(RuntimeWrapper(algorithm),53)
ama algoritma üzerinde çalışırken 53 saniyelik eşiğin sürekli olarak azaltılmasını istiyorum, yaniassureSmallerEqual(RuntimeWrapper(algorithm),'previousbest+noisetolerance')
- Algoritmaların yavaşlamadığından emin olmak için. Gibi bir şey yapabilirdim
Performans testi
- Daha önce analitik bir çözüme iyi bir yaklaşım bulan bir algoritmanın hala en azından iyi veya daha iyi bir çözüm bulmasını sağlamak için. Yine, bu standart bir entegrasyon testi ile taklit edilebilir, ancak algoritmanın daha iyi ve daha iyi hale gelmesiyle toleransın sürekli olarak küçülmesini istiyorum. Yerine düşünün
assureAlmostEqual(foo(),1,places=3)
tarafındanassureAlmostEqual(foo(),1,places='previousbest')
- Daha önce analitik bir çözüme iyi bir yaklaşım bulan bir algoritmanın hala en azından iyi veya daha iyi bir çözüm bulmasını sağlamak için. Yine, bu standart bir entegrasyon testi ile taklit edilebilir, ancak algoritmanın daha iyi ve daha iyi hale gelmesiyle toleransın sürekli olarak küçülmesini istiyorum. Yerine düşünün
Fiziksel ihtiyaç testi
- Algoritmaların aniden daha fazla bellek / sabit disk alanına ihtiyaç duymadığından emin olmak için. 1'e çok benzer.
Soyut gereksinim testi
- Karesel yaklaşımlarla iyi sonuç veren bir algoritmanın aniden kübik yaklaşımlara ihtiyaç duymadığından veya zaman adımı 0.1 ile iyi sonuç veren bir algoritmanın aniden kararlılık için 0.01'e ihtiyaç duymadığından emin olmak için. Yine, bunlar standart entegrasyon testleri ile taklit edilebilir, ancak amaç, belirli bir hedefe ulaşan en küçük gereksinim parametresinin ne olduğunu hatırlamaktır, bu nedenle bu çok fazla manuel güncelleme gerektirir. Örneğin,
foo(10)
daha önce herhangi bir istisna atmadıysa, çerçeveninfoo(10)
hala çalıştığından emin olmak vefoo(9)
şimdi çalışıp çalışmadığını da denemek istiyorum (bu durumda gelecekteki tüm testlerfoo(9)
hala çalışmasını sağlayacaktır ).
- Karesel yaklaşımlarla iyi sonuç veren bir algoritmanın aniden kübik yaklaşımlara ihtiyaç duymadığından veya zaman adımı 0.1 ile iyi sonuç veren bir algoritmanın aniden kararlılık için 0.01'e ihtiyaç duymadığından emin olmak için. Yine, bunlar standart entegrasyon testleri ile taklit edilebilir, ancak amaç, belirli bir hedefe ulaşan en küçük gereksinim parametresinin ne olduğunu hatırlamaktır, bu nedenle bu çok fazla manuel güncelleme gerektirir. Örneğin,
İstediğim şey, ünite / entegrasyon testi anlamında testleri tanımlamıyor olabilir, çünkü artan çalışma süreleri, örneğin, diğer iyileştirmeler karşılığında kabul edilebilir olabilir.
Bununla birlikte, pratikte, yukarıdaki test işlevselliğine sahip olsaydım, hata ayıklama zamanından çok tasarruf edeceğimi biliyorum, çünkü vakaların% 95'inde getirdiğim hatalar nedeniyle gereksinimler ve performans kötüye gitti. Gerçekten de, harici sayısal yazılım kütüphaneleriyle bulduğum birçok hatanın (kendi kodumu kontrol etmek için çok fazla zaman harcadıktan sonra) yukarıdaki testlerin titizlikle uygulanması durumunda kaçınılmış olabileceğini biliyorum.
PS
Benzer adla adlandırılan /programming/34982863/framework-for-regression-testing-of-numerical-code , standart regresyon testi çerçevelerinde daha kolay ulaşılabilen işlevleri açıkladığı için bir kopya değildir.
Soru birim test ve test odaklı geliştirme stratejileri onları uygulamak yardımcı bir çerçeve (ve cevapları sağlanan benim görüşüme göre, burada tarif olandan farklıdır edilir / ifadesini sorar stratejiler) karşıt olarak stratejiler sorar.