Я величезний прихильник тестових розробок наукових обчислень. Це корисність на практиці просто приголомшлива і дійсно полегшує класичні неприємності, про які знають розробники коду. Однак існують властиві труднощі при тестуванні наукових кодів, які не зустрічаються в загальному програмуванні, тому тексти TDD не дуже корисні як навчальні посібники. Наприклад:
Як правило, ви не знаєте точної відповіді на задану складну проблему апріорі, тож як можна написати тест?
Ступінь паралелізму змінюється; Нещодавно я стикався з помилкою, коли використання MPI-завдань як кратного 3 не вдалося, але множина 2 працювала. Крім того, загальні рамки тестування не виглядають дуже зручними для MPI через саму природу MPI - вам доведеться повторно виконати тестовий бінарний файл, щоб змінити кількість завдань.
Наукові коди часто мають багато щільно з'єднаних, взаємозалежних та взаємозамінних частин. Ми всі бачили застарілий код і знаємо, як заманливо відмовитися від хорошого дизайну та використовувати глобальні змінні.
Часто числовий метод може бути "експериментом", або кодер не повністю розуміє, як він працює, і намагається його зрозуміти, тому передбачити результати неможливо.
Деякі приклади тестів, які я пишу для наукового коду:
Для інтеграторів часу використовуйте простий ODE з точним рішенням і переконайтеся, що ваш інтегратор вирішує його в межах заданої точності, а порядок точності є правильним шляхом тестування з різними розмірами кроків.
Тести нульової стійкості: перевірте, чи метод з 0 граничними / початковими умовами залишається на рівні 0.
Інтерполяційні випробування: задавши лінійну функцію, переконайтеся, що інтерполяція правильна.
Перевірка застарілості: виділіть фрагмент коду в застарілому додатку, який, як відомо, є правильним, і витягніть деякі дискретні значення, щоб використовувати їх для тестування.
Все ще часто випливає, що я не можу зрозуміти, як правильно перевірити заданий фрагмент коду, окрім ручного пробного і помилкового. Чи можете ви навести кілька прикладів тестів, які ви пишете для чисельного коду, та / або загальних стратегій тестування наукового програмного забезпечення?