Я обнаружил, что во многих моих научных вычислительных программах есть требования к тестированию, которые не охватываются стандартными тестовыми средами:
Тестирование времени вычислений
- Чтобы убедиться, что алгоритмы не становятся медленнее. Я мог бы сделать что-то вроде,
assureSmallerEqual(RuntimeWrapper(algorithm),53)
но я бы хотел, чтобы порог в 53 секунды непрерывно уменьшался, когда я работаю над алгоритмом, то есть что-то вродеassureSmallerEqual(RuntimeWrapper(algorithm),'previousbest+noisetolerance')
- Чтобы убедиться, что алгоритмы не становятся медленнее. Я мог бы сделать что-то вроде,
Тестирование производительности
- Чтобы убедиться, что алгоритм, который ранее нашел хорошее приближение к аналитическому решению, все же находит решение, которое по крайней мере так же хорошо или лучше. Опять же, это может быть эмулировано стандартным интеграционным тестом, но я бы хотел, чтобы допуск постоянно уменьшался, поскольку алгоритм становится все лучше и лучше. Подумайте о замене
assureAlmostEqual(foo(),1,places=3)
наassureAlmostEqual(foo(),1,places='previousbest')
- Чтобы убедиться, что алгоритм, который ранее нашел хорошее приближение к аналитическому решению, все же находит решение, которое по крайней мере так же хорошо или лучше. Опять же, это может быть эмулировано стандартным интеграционным тестом, но я бы хотел, чтобы допуск постоянно уменьшался, поскольку алгоритм становится все лучше и лучше. Подумайте о замене
Тестирование физических требований
- Чтобы убедиться, что алгоритмам внезапно не понадобится больше памяти / места на жестком диске. Очень похоже на 1.
Тестирование абстрактных требований
- Чтобы убедиться, что для алгоритма, работавшего с квадратичными приближениями, внезапно не требуются кубические приближения, или для алгоритма, который справился с шагом 0,1, внезапно не нужны 0,01 для устойчивости. Опять же, они могут быть эмулированы стандартными интеграционными тестами, но цель состоит в том, чтобы запомнить, какой наименьший параметр требования был для достижения определенной цели, поэтому для этого потребовалось бы много ручного обновления. Например, если
foo(10)
ранее не было никаких исключений, я бы хотел, чтобы фреймворк по-foo(10)
прежнему работал, а также пытался, еслиfoo(9)
сейчас работает (в этом случае все будущие тесты будут обеспечиватьfoo(9)
работу).
- Чтобы убедиться, что для алгоритма, работавшего с квадратичными приближениями, внезапно не требуются кубические приближения, или для алгоритма, который справился с шагом 0,1, внезапно не нужны 0,01 для устойчивости. Опять же, они могут быть эмулированы стандартными интеграционными тестами, но цель состоит в том, чтобы запомнить, какой наименьший параметр требования был для достижения определенной цели, поэтому для этого потребовалось бы много ручного обновления. Например, если
Можно утверждать, что то, о чем я прошу, не описывает тесты в смысле модульного / интеграционного тестирования, поскольку, например, увеличение времени выполнения может быть приемлемым в обмен на другие улучшения.
На практике, однако, я знаю, что я бы сэкономил много времени на отладку, если бы у меня была вышеописанная функциональность тестирования, потому что в 95% случаев требования и производительность менялись из-за ошибок, которые я представил. Действительно, я точно знаю, что многих ошибок, которые я обнаружил (после того, как потратил много времени на проверку своего собственного кода) с внешними цифровыми библиотеками программного обеспечения, можно было бы тривиально избежать, если бы вышеприведенные тесты применялись строго.
PS
Вопрос с таким же названием /programming/34982863/framework-for-regression-testing-of-numeric-code не является дубликатом, поскольку он описывает функциональность, которую легче реализовать с помощью стандартных структур регрессионного тестирования.
Вопрос Стратегии для модульного тестирования и управляемой тестированием разработки требует стратегий, а не структуры, которая помогает их реализовать (и стратегии, которые он запрашивает / которые приведены в ответах, отличаются от того, что я описываю здесь, на мой взгляд).