SourceForge.net Logo
prevtopnext
Система тестирования izh_test
    Вопросы-тезисы

Для чего нужна эта система.

Система нужна для написания тестов всех видов и для всех языков и технологий. Универсальность достигается за счёт того, что результаты теста записываются в файл, который потом сравнивается с эталонным. Таким образом, тестировать можно любой исполняемый файл, любую программу, на любом языке.

Система содержит средства, позволяющие легко и быстро проводить серию тестов, получать общий результат тестирования, в случае неудачи быстро выяснять какие именно из тестов провалились, как именно результаты этих тестов отличаются от эталонных, а также, в случае если причиной провала теста являются просто устаревшие эталонные данные, быстро заменять эталоны на новые.

Предположим у нас есть классическая программа
int main()
{
  printf("Hello world!\n");
  return 0;
}
исполняемый файл которой называется hello_world.exe

Чтобы тестировать такую программу в традиционном стиле мы должны вынести отдельно метод составления сообщения и тестировать его
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


prevtopnext

SourceForge.net Logo