Jestem wielkim zwolennikiem rozwoju opartego na testach w informatyce naukowej. Jego użyteczność w praktyce jest po prostu oszałamiająca i naprawdę łagodzi klasyczne problemy, które znają twórcy kodu. Istnieją jednak nieodłączne trudności w testowaniu kodów naukowych, które nie występują w programowaniu ogólnym, więc teksty TDD nie są zbyt przydatne jako samouczki. Na przykład:
Zasadniczo nie znasz a priori dokładnej odpowiedzi na dany złożony problem, więc jak napisać test?
Zmienia się stopień równoległości; Niedawno napotkałem błąd polegający na tym, że użycie zadań MPI jako wielokrotności 3 nie powiedzie się, ale wielokrotność 2 zadziałała. Dodatkowo, wspólne ramy testowe nie wydają się zbyt przyjazne MPI z powodu samej natury MPI - musisz ponownie uruchomić testowy plik binarny, aby zmienić liczbę zadań.
Kody naukowe często zawierają wiele ściśle ze sobą powiązanych, współzależnych i wymiennych części. Wszyscy widzieliśmy starszy kod i wiemy, jak kuszące jest porzucenie dobrego projektowania i używania zmiennych globalnych.
Często metoda numeryczna może być „eksperymentem” lub koder nie w pełni rozumie, jak to działa i próbuje to zrozumieć, więc przewidywanie wyników jest niemożliwe.
Kilka przykładów testów, które piszę dla kodu naukowego:
W przypadku integratorów czasu użyj prostego ODE z dokładnym rozwiązaniem i sprawdź, czy twój integrator rozwiązuje go z określoną dokładnością, a kolejność dokładności jest poprawna, testując przy różnych wielkościach kroków.
Testy zerowej stabilności: sprawdź, czy metoda z 0 warunkami brzegowymi / początkowymi pozostaje na 0.
Testy interpolacyjne: biorąc pod uwagę funkcję liniową, upewnij się, że interpolacja jest poprawna.
Sprawdzanie poprawności starszej wersji: izoluj fragment kodu w starszej aplikacji, o której wiadomo, że jest poprawna, i wyciągnij z niej pewne dyskretne wartości, aby użyć ich do testowania.
Nadal często zdarza się, że nie potrafię poprawnie przetestować danego fragmentu kodu, oprócz ręcznej próby i błędów. Czy możesz podać kilka przykładów testów, które piszesz dla kodu numerycznego i / lub ogólnych strategii testowania oprogramowania naukowego?