Школа179: Скрипты автоматического тестирования

https://server.179.ru/wiki     редакция: 20.08.2016 19:04:20
Информатика/Олимпиады/СкриптыАвтоматическогоТестирования

Windows


Примеры скриптов. Уберите пробелы внутри "% %"! Скрипты записывать в файл с расширением *.cmd.

Файлы с тестами называются 01, 02, 03, .... Файлы с правильными ответами называются 01.a, 02.a, 03.a.

Запускаемая программа: ..\a.exe. Имена входных-выходных файлов sum.in-sum.out.

Запустить программу на всех тестах, вывести на экран результат работы программы и правильный ответ
echo off
for % %f in (??) do echo TEST % %f & echo TEST % %f & copy  % %f sum.in > nul & ..\a.exe & echo Output: & type sum.out & echo Correct: & type % %f.a


Запустить программу на всех тестах, сравнить ответ с правильным при помощи команды fc, остановиться на первом тесте с неправильным ответом
echo off
for % %f in (??) do echo TEST % %f & copy  % %f sum.in > nul & ..\a.exe & fc /w % %f.a sum.out & if errorlevel 1 exit


Запустить программу на всех тестах, сравнить ответ с правильным при помощи check.exe, остановиться на первом тесте с неправильным ответом
echo off
for % %f in (??) do echo TEST % %f & copy  % %f sum.in > nul & ..\a.exe & check.exe sum.in sum.out % %f.a & if errorlevel 2 exit



Пример чекера

Чекер запускается из командной строки с тремя параметрами. Первый параметр – имя файла с входными данными, второй – имя файла с выводом программы, третий – имя файла с правильным ответом. Чекер возвращает 0, если ответ правильный, 2 – если ответ неправильный.

#include <iostream>
#include <fstream>

using namespace std;

int main(int narg, char ** argv)
{
    if (narg != 4)
    {
        cerr << "You must specify 3 args" << endl;
        return 1;
    }
    ifstream input(argv[1]);
    ifstream output(argv[2]);
    ifstream correct(argv[3]);
    int user_ans, correct_ans;
    output >> user_ans;
    correct >> correct_ans;
    if (user_ans == correct_ans)
    {
        cout << "OK" << endl;
        return 0;
    }
    else
    {
        cout << "WA" << endl;
        return 2;
    }
}