C ++ 'da sayısal uygulamalar için test paketleri?


13

Son zamanlarda, kodumu yazarken grubumu daha fazla test eklemeye zorluyorum. Muhtemelen konuşmaktan çok daha uzun süren birkaç büyük hata vardı, çünkü yerinde iyi bir test rejimimiz yoktu.

Ancak, süreci otomatikleştirmek (veya kolaylaştırmak için) için uygun araçlara sahip olmanın kesinlikle yararlı olacağını düşünüyorum. Öte yandan, C ++ test paketleri için çeşitli seçenekleri bilmiyorum ve aralarında nasıl karar verilir?

Ne arayacağınıza dair yönergeler var mı ve özellikle sayısal uygulamalara yönelik olanlar var mı?

Yanıtlar:


11

Sayısal kodları test etmeyle ilgili sorun, (i) her zaman kesin çıktıyı bilmeyebileceğiniz ve daha sonra karşılaştırmak için şimdi bir hesaplama sonucunu kaydedebilmeniz - yani regresyon testleri yapmak ve (ii) bu sonuçlar farklı yuvarlama nedeniyle farklı makinelerde küçük miktarlarda farklılık gösterebilir.

Nasıl bir anlaşma yaptığını görmek için II, buraya bir göz atın: http://www.dealii.org/developer/development/testsuite.html#regression_tests


Birim testin sınırlamaları hakkında iyi noktalar. Regresyon testi iyi bir şeydir (çıktı bilinmediği için kesinlikle test etmekten daha iyidir; hatalar hakkında uyarı işaretleri verebilir). Makine yuvarlama sorununa gelince, bunun hafifletilmesi deneme yanılma yoluyla iyi bir tolerans seçmeye dönüşüyor mu?
Geoff Oxberry

2
Sürekli bir acı. 10 yılı aşkın testlerimizde, bununla başa çıkmak için gerçekten iyi bir strateji geliştirmedik. Diff yerine numdiff kullanmak yardımcı olabilir, ancak sonuç olarak doğru sayı 0.39875 olduğunda başka bir makinede aldığınız "0.3988" yerine "0.3987" depoladığınız bir makine belirlemeniz gerekir. Eşiği nerede ayarlarsanız ayarlayın, yanlış yerde her zaman bir başkasını kesersiniz.
Wolfgang Bangerth

@WolfgangBangerth. Kayan nokta davranışını daha belirleyici yapan derleyiciye özgü bazı bayraklar vardır. Örneğin / fp: strict | precise ve / Qimf-arch-tutarlılığı: true (Intel derleyici) veya -fnounsafe-math-optimizations, -float-store (GCC) kodunuzu performans maliyetiyle platformlar arasında daha tutarlı ve tekrarlanabilir hale getirebilir . Bazı ince ayarlarla, bu özellikle test için kullanılabilen özel bir "tekrar üretilebilir" yapı sağlar.
André

@Andre - oh evet, hepsini denedik. Hala zor :-)
Wolfgang Bangerth

10

Son zamanlarda üzerinde çalıştığım birkaç sayısal kütüphaneyi test etmek için googletest kullanıyorum ve bundan çok memnun kaldım. Oldukça basit testleri çok hızlı bir şekilde yazabilir veya veri başlatma vb. Gerektiren karmaşık testler yazabilirsiniz. Ayrıca (diğerleri gibi eminim gibi) kolayca bitsel yerine kayan nokta karşılaştırmaları yapmak için yollar sağlar.


Googletest ile ilgili güzel bir şey, kaynak kodunu bir uygulamaya eklemeyi kolaylaştırmalarıdır, bu nedenle onu bağımlılık yapmanız gerekmez.
Geoff Oxberry

4

Kodunuzu CMake ile inşa ediyorsanız, o zaman test mekanizması açık bir seçim olacaktır. Kodunuzu komutla manuel olarak test etmenizi sağlar ctestve ayrıca CDash ile kapsamlı gece testlerini destekler .


1

Hesaplamalı biyoloji C ++ kütüphanemiz ( Chaste ) için http://cxxtest.com/ adresini kullanıyoruz . Bu kullanımı oldukça basittir, iyi çalışır, assert()stil ifadeleri ile test etmek için birkaç makro sağlar . Bilimsel hesaplama için bunlar genellikle basit doğrudan karşılaştırmalar TS_ASSERT_EQUALS(a,b)veya sayısal karşılaştırmalardır TS_ASSERT_DELTA(a,b,tolerance).

Ekstra makrolar kendi temel vektörlerinizi / seçtiğiniz matrisleri karşılaştırmak için bu temel olanları kullanarak kolayca yazılabilir. Yararlı bir şekilde, kodunuzun belirli durumlarda uygun uyarıları ve hata mesajlarını atıp atmadığını da kontrol edebilirsiniz. testKaynak kodumuzun klasörlerindeki bazı örneklere buradan göz atabilirsiniz : https://chaste.cs.ox.ac.uk/trac/browser/trunk

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.