Я виявив, що багато мого програмування з обчислювальної науки мають вимоги до тестування, які не охоплюються стандартними рамками тестування:
Тестування на час обчислення
- Щоб алгоритми не ставали повільнішими. Я міг би зробити щось на кшталт,
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-numerical-code не є дублікатом, оскільки описує функціональність, яку легше досягти за допомогою стандартних рамок тестування регресії.
Питання Стратегії для тестування одиниць і тестових розробок задають стратегії, а не рамки, які допомагають реалізувати їх (а стратегії, про які він запитує / які надаються у відповідях, на мій погляд, відрізняються від описаних тут).