Кросс-платформенное числовое тестирование?
Мне нужно протестировать числовое программное обеспечение, которое работает на Linux и Windows. Тесты включают сравнение результатов с хорошо известными результатами и т. Д., Аналогично тому, что описано в численном регрессионном тестировании. Чтобы уточнить, выходные данные не обязательно являются числовыми - они могут быть категориальными предсказаниями классификатора или текста. В Linux это разница; в Windows это нечто иное, но моя цель - написать каждый тест только один раз. Я знаю, что CMake/CTest можно использовать для генерации кроссплатформенных тестов, но, похоже, они ограничены проверкой ненулевого состояния выхода. Существует ли программное обеспечение, которое может автоматически выбрать правильный "diff" на каждой платформе? Может быть модуль / пакет CTest, о котором я не знаю?
1 ответ
CMake и CTest не предоставляют сложной тестовой оценки. В основном различают проходящие тесты, пропущенные тесты, неудачные тесты (ненулевое возвращаемое значение, исключение, SIGTERM).
Используйте FAIL / PASS_REGULAR_EXPRESSION, чтобы оценить вывод. Вы можете использовать регулярные выражения для обоих свойств. Регулярные выражения довольно ограничены; особенно для оценки числовых ошибок регулярные выражения бесполезны. Можно написать более сложную функцию CMake, которая расширила бы возможности CMake. Я не знаю ни о каком проекте, делающем это.
Вы можете использовать внешние инструменты, специализирующиеся на модульном тестировании. Значение результата от этих инструментов оценивается CTest. В зависимости от языка возможные внешние инструменты: googletest, JUnit, Python unittest или даже diff.
Напишите свой собственный скрипт оценки выходных данных. Например, Perl или Python просты в использовании и имеют хорошие качества синтаксического анализа. Вы добавляете скрипт с фактическим тестом в качестве параметра через
add_test
, Скрипт запускает тест, сравнивает вывод и сообщает результат CTest.
Поэтому вам необходимо установить дополнительный языковой интерпретатор, такой как Perl или Python, или сторонний вспомогательный инструмент. Или придерживайтесь написания вашей оценки для каждой платформы.