Тестирование консольной программы с помощью bat-файла

Типичная ситуация: вы написали программу и хотите проверить ее работу. Проводить тесты вручную неудобно. Нужно как-то автоматизировать этот процесс. Что если использовать bat-файлы?

Простейший случай
Предположим, тестируемая программа имеет вид:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
  if(argc < 2)
  {
    printf("error\r\n");
    return -1; 
  }
  int val = atoi(argv[1]);
  return 2*val;
}

В этом случае, проверяющий ее работу bat-файл, будет иметь вид (здесь и далее, test — имя тестируемой программы):

test 56
if %ERRORLEVEL%==112 (
  echo success
) else (
  echo error
)

Типичный случай
Разумеется так, как показано выше программы никто не пишет. Переменная ERRORLEVEL содержит либо ноль (в случае успеха), либо код ошибки. В нашем случае он не представляет особого интереса. Обычный вид тестируемой программы показан ниже.

#include <stdio.h>

int main()
{
  printf("Enter number\r\n");
  int a = 0;
  scanf("%d",&a);
  printf("result = %d\r\n",2*a);
  return 0;
}

Сразу возникает два вопроса. Во-первых, как сэмулировать ввод числа в программу (ключи запуска не подходят, программа их даже не смотрит). Во-вторых, как проанализировать ее вывод (переменная ERRORLEVEL всегда будет равна нулю). На помощь приходит возможность перенаправления ввода/вывода.

Способ 1. 2 файла
Первый вариант основан на использовании двух текстовых файлов. Первый (назовем его in.txt) содержит значение, которое должно быть «прочитано» программой. Второй (назовем его out.txt) будет содержать вывод программы, то есть все то, что она выводит на консоль. Запуск программы будет выглядеть так

test <in.txt >out.txt

Если в файле in.txt содержится строка «83», то файл out.txt будет содержать текст:

Enter number
result = 166

Осталось только проанализировать его содержимое с помощью цикла for /F.

Способ 2. 1 файл
Недостатком первого способа является использование двух файлов. Если вы хотите проводить несколько тестов, то вам понадобится отдельный файл с входными данными для каждого теста. Способ 2 лишен этого недостатка. В нем тестируемая программа запускается так:

echo 55 | test > out.txt

Здесь в качестве входных данных для программы test выступает вывод команды echo 55, то есть число 55 в виде строки. вывод программы test как и в первом способе записывается в файл out.txt.

Если вы хотите провести несколько тестов, то можно написать так:

echo 55 | test >  out.txt
echo 84 | test >> out.txt
echo 13 | test >> out.txt

Оператор >> говорит о том, что файл out.txt не будет перезаписан. Весь вывод повторных запусков программы test.exe будет дописан в конец файла. Таким образом, он будет содержать:

Enter number
result = 110
Enter number
result = 168
Enter number
result = 26

Все что остается, это, как и в первом способе, проанализировать содержимое файла out.txt.

Способ 3. 0 файлов
Можно и вообще обойтись без файлов. Для этого нужно использовать команду find, осуществляющую поиск подстроки. Программа test выводит только одно число — результат своей работы. Этим мы и воспользуемся. Тестовый запуск выглядит так:

echo 55 | test | find "110" >nul

if ERRORLEVEL 1 (
  echo error
) else (
  echo success
)

Отличие от второго способа в том, что вывод тестируемой программы test направляется на вход утилите find, которая ищет в нём правильный результат работы. Если он найден, то переменная ERRORLEVEL устанавливается в единицу, если нет, то она равна нулю.

Чтобы find не выводила в консоль найденную строку, весь ее вывод направляется в фиктивное устройство nul, то есть попросту выбрасывается.

Заключение
Мы рассмотрели различные способы эмулирования ввода/вывода для тестирования ваших консольных программ. Какой способ выбрать, зависит от целей тестирования и ваших личных предпочтений.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *