Testujesz pakiety dla aplikacji numerycznych w C ++?

13

Ostatnio naciskałem na moją grupę, aby włączyła więcej testów podczas pisania swojego kodu. Było kilka poważnych błędów, których złapanie zajęło dużo więcej czasu, niż prawdopodobnie mówienie było konieczne, ponieważ nie mieliśmy dobrego reżimu testowania.

Podejrzewam jednak, że posiadanie odpowiednich narzędzi do automatyzacji (lub usprawnienia) procesu z pewnością byłoby przydatne. Z drugiej strony nie znam różnych opcji pakietów testowych C ++ i jak się między nimi decydować?

Czy istnieją wytyczne dotyczące tego, czego należy szukać - i czy istnieją takie, które są specjalnie dostosowane do zastosowań numerycznych?

eeismail
źródło

Odpowiedzi:

11

Problem z testowaniem kodów numerycznych polega na tym, że (i) nie zawsze możesz znać dokładne dane wyjściowe i będziesz mógł teraz zapisać wynik obliczeń, aby porównać je później - tj. Wykonać testy regresji, oraz (ii) wyniki mogą się różnić niewielkimi ilościami na różnych maszynach z powodu różnych zaokrągleń.

Aby zobaczyć, jak robi to deal.II, spójrz tutaj: http://www.dealii.org/developer/development/testsuite.html#regression_tests

Wolfgang Bangerth
źródło
Dobre punkty na temat ograniczeń testów jednostkowych. Testowanie regresji jest dobrą rzeczą (z pewnością lepsze niż całkowite nie testowanie, ponieważ dane wyjściowe są nieznane; może dawać znaki ostrzegawcze przed błędami). Jeśli chodzi o kwestię zaokrąglenia maszyny, czy złagodzenie tego przekształca się w wybór dobrej tolerancji metodą prób i błędów?
Geoff Oxberry
2
To ciągły ból. Przez ponad 10 lat testów nigdy nie opracowaliśmy naprawdę dobrej strategii radzenia sobie z tym. Użycie numdiff zamiast diff może pomóc, ale ostatecznie musisz wyznaczyć jedną maszynę, dla której przechowujesz „0.3987” zamiast „0.3988”, którą dostajesz na innej maszynie, gdy poprawna liczba to 0.39875. Bez względu na to, gdzie ustawisz próg, zawsze odetniesz jedną liczbę innej w niewłaściwym miejscu.
Wolfgang Bangerth,
@WolfgangBangerth. Istnieją pewne flagi specyficzne dla kompilatora, które sprawiają, że zachowanie zmiennoprzecinkowe jest bardziej deterministyczne. Np. / Fp: ścisłe | precyzyjne i / Qimf-arch-spójność: true (kompilator Intel) lub -fnounsafe-matematyka-optymalizacje, -ffloat-store (GCC) może sprawić, że kod będzie bardziej spójny i odtwarzalny na różnych platformach kosztem wydajności . Z pewnymi poprawkami, zapewnia to specjalną „odtwarzalną” kompilację, której można użyć specjalnie do testowania.
André
@Andre - och tak, próbowaliśmy wszystkich z nich. Wciąż jest to trudne :-)
Wolfgang Bangerth,
10

Ostatnio korzystam z googletest do testowania kilku bibliotek numerycznych, nad którymi pracuję, i jestem z tego bardzo zadowolony. Możesz napisać dość proste testy bardzo szybko lub możesz napisać skomplikowane testy wymagające inicjalizacji danych i tak dalej. Zapewnia również (podobnie jak wielu innych) sposoby na łatwe porównywanie zmiennoprzecinkowe, a nie bitowe.

specjalista
źródło
Zaletą googletest jest to, że ułatwiają dołączanie kodu źródłowego do aplikacji, dzięki czemu nie trzeba uzależniać go.
Geoff Oxberry
4

Jeśli budujesz swój kod za pomocą CMake, oczywistym wyborem byłby mechanizm ctest . Pozwala przetestować kod ręcznie za pomocą polecenia ctest, a także obsługuje obszerne testy nocne za pomocą CDash .

Nico Schlömer
źródło
1

Do naszej biblioteki C ++ z biologii obliczeniowej ( Chaste ) używamy http://cxxtest.com/ . Jest to dość prosty w użyciu, działa dobrze, zapewnia kilka makr do testowania za pomocą assert()instrukcji stylu. W przypadku obliczeń naukowych są to na ogół proste bezpośrednie porównania TS_ASSERT_EQUALS(a,b)lub porównania numeryczne z TS_ASSERT_DELTA(a,b,tolerance).

Za pomocą tych podstawowych makr można łatwo napisać dodatkowe makra, aby porównać własne wektory / macierze. Przydatnie możesz także sprawdzić, czy Twój kod wyświetla odpowiednie ostrzeżenia i komunikaty o błędach w danych sytuacjach. Możesz przeglądać niektóre przykłady w testfolderach naszego kodu źródłowego tutaj: https://chaste.cs.ox.ac.uk/trac/browser/trunk

miramy
źródło