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