|
Система нужна для написания тестов всех видов и для всех языков и технологий. Универсальность достигается за счёт того, что результаты теста записываются в файл, который потом сравнивается с эталонным. Таким образом, тестировать можно любой исполняемый файл, любую программу, на любом языке.
Система содержит средства, позволяющие легко и быстро проводить серию тестов, получать общий результат тестирования, в случае неудачи быстро выяснять какие именно из тестов провалились, как именно результаты этих тестов отличаются от эталонных, а также, в случае если причиной провала теста являются просто устаревшие эталонные данные, быстро заменять эталоны на новые.
Предположим у нас есть классическая программа
int main() { printf("Hello world!\n"); return 0; } |
Чтобы тестировать такую программу в традиционном стиле мы должны вынести отдельно метод составления сообщения и тестировать его
inline const char * get_message() { return "Hello world!\n"; } void test_message() { Assert(get_message(),"Hello world!\n"); } int main() { printf(get_message()); return 0; } |
Чтобы тестировать программу в системе izh_test нам не нужно ничего менять в самой программе.. Описание теста будет выглядеть так:
<exec_check> <spec><fname>тест для программы hello_world.exe</fname></spec> <cmd>hello_world.exe</cmd> <out>hello_world_output.txt</out> </exec_check> |
А исполнение теста будет эквивалентно выполнению следующего .bat-файла:
hello_world.exe > hello_world_output.result.txt fc hello_world_output.etalon.txt hello_world_output.result.txt > hello_world_output.diff if %ERRORLEVEL% EQU 0 goto ok echo тест для программы hello_world.exe %TIME% [fail!] goto end :ok echo тест для программы hello_world.exe %TIME% [ok] del hello_world_output.result.txt del hello_world_output.diff :end |
Однократный запуск такого скрипта даст результат "fail" и оставит после себя файл hello_world_output.result.txt. После проверки содержимого этого файла мы можем просто переименовать его в hello_world_output.etalon.txt что заставит тест выполняться с результатом ok и не оставлять после себя лишних файлов.
Если мы вдруг изменим программу, для того чтобы выводить, например, "Hello wonderful world!\n" то тест снова выдаст fail и оставит после себя файл hello_world_output.result.txt с новым выводом программы, а также файл hello_world_output.diff с разницей между эталоном и реальным выводом.
Проверив что новый результат соответствует нашим ожиданиям, мы переписываем hello_world_output.result.txt поверх hello_world_output.etalon.txt и снова получаем работоспособный тест.
Таков вкратце общий алгоритм использования предлагаемой системы. С тем отличием, что файлов может быть гораздо больше, они гораздо сложнее. Вся система описывается простыми и понятными xml-описаниями не зависящими от платформы (не опирающимися на bat-файлы). Различные опции программы позволяют получать различный вид вывода и статистики. А предлагаемый ГУИ-интерфейс ещё более упрощает всю работу, позволяя быстро получать всю картину без сложной навигации по файлам, запускать только то что нужно, и быстро заменять эталонные данные на новые результаты.
P.S. описываемый подход переносится и на unix-системы.. на языке bash вышеприведённый алгоритм будет выглядеть примерно как
#!/bin/sh hello_world.exe > hello_world_output.result.txt diff hello_world_output.etalon.txt hello_world_output.result.txt > hello_world_output.diff if ["$!"!="0"] then echo " тест для программы hello_world.exe [fail!]" else echo " тест для программы hello_world.exe %TIME% [ok]" rm hello_world_output.result.txt rm hello_world_output.diff endif |
|