Я большой сторонник разработки, основанной на тестировании, в научных вычислениях. Его полезность на практике просто ошеломляет и действительно облегчает классические проблемы, известные разработчикам кода. Однако при тестировании научных кодов, которые не встречаются в общем программировании, есть определенные трудности, поэтому тексты TDD не очень полезны в качестве учебных пособий. Например:
Как правило, вы не знаете точного ответа на данную сложную проблему априори, так как вы можете написать тест?
Степень параллелизма меняется; Недавно я столкнулся с ошибкой, из-за которой использование задач MPI как кратного 3 не удавалось, но кратное 2 сработало. Кроме того, из-за самой природы MPI обычные инфраструктуры тестирования не кажутся очень удобными для MPI - вам нужно повторно выполнить тестовый двоичный файл, чтобы изменить количество задач.
Научные коды часто имеют много тесно связанных, взаимозависимых и взаимозаменяемых частей. Мы все видели унаследованный код и знаем, как заманчиво отказаться от хорошего дизайна и использовать глобальные переменные.
Часто численный метод может быть «экспериментом», или кодер не до конца понимает, как он работает, и пытается его понять, поэтому предвидеть результаты невозможно.
Некоторые примеры тестов, которые я пишу для научного кода:
Для временных интеграторов используйте простой ODE с точным решением и проверьте, что ваш интегратор решает его с точностью до заданной точности, а порядок точности правильный, тестируя с переменным размером шага.
Тесты на нулевую стабильность: убедитесь, что метод с 0 граничными / начальными условиями остается на 0.
Интерполяционные тесты: при наличии линейной функции убедитесь, что интерполяция правильная.
Устаревшая проверка: выделите фрагмент кода в унаследованном приложении, которое, как известно, является правильным, и извлеките некоторые дискретные значения для использования для тестирования.
До сих пор часто всплывает, что я не могу понять, как правильно протестировать данный фрагмент кода, кроме проб и ошибок вручную. Можете ли вы привести несколько примеров тестов, которые вы пишете для числового кода, и / или общих стратегий тестирования научного программного обеспечения?