-
Notifications
You must be signed in to change notification settings - Fork 11
Automatické testy
Celá funkce je situována do jednoho skriptu v jazyce Python
. Pro výchozí funkci je nutno předat cestu ke spustitelnému kompilátoru jazyka IFJ17
do jazyka IFJcode17
, tedy například takto:
$ ifjcode17-tests ./ifj2017
kde ./ifj2017
je cesta ke kompilátoru, tedy například ~/school/fit/ifj/ifj2017
.
Takto spuštěný skript automaticky projde všechny dostupné testovací jednotky a provede následující sekvenci příkazů (viz struktura testů níže):
- přeskočí testy, které vyžadují rozšíření, které není aktivováno
- pomocí předaného kompilátoru spustí kompilaci testovaného kódu v jazyce
IFJ17
do jazykaIFJcode17
- zkontroluje návratovou hodnotu
- v případě, že je navrácená nebo očekávaná hodnota kompilátoru nenulová, je běh testu ukončen
-
spustí přibalený interpret jazyka
IFJcode17
s vygenerovaným kódem, kterému volitelně předá na standardní vstup definovaný obsah - zkontroluje návratový kód interpretu vůči požadovanému
- v případě, že je navrácená nebo očekávaná hodnota interpretu nenulová, je běh testu ukončen
- zkontroluje obsah vypsaný na standardní výstup vůči požadovanému
Ve všech případech jsou očekávané hodnoty i jejich reálné protějšky zalogovány.
Výsledek spuštění tedy poté může vypadat nějak takto:
Testy lze spouštět na základě jednoduchých selektorů. Je možné vybírat celé sekce, a to buď číselnými kódy, nebo přímo názvy. V rámci sekcí lze specifikovat i konkrétní testy:
ifjcode17-tests ./ifj [selekce ...]
Příklad:
-
01
vybírá celou sekci01_basic
-
functions
vybírá celou sekci02_sections
-
01/01
(nebobasic/01
) vybírá pouze test01
v sekci01_basic
-
01/03 66
spustí testy ze sekce66_errors
a test03
v sekci01
Veškeré informace k definici a struktuře testů lze nalézt na stránce Definice testů.
Pro každý test spouštěč vytvoří log s všemi dostupnými informacemi z běhu testu. Tento log obsahuje veškeré dostupné informace o běhu kompilátoru, jeho výstup v jazyce IFJcode17
i veškeré informace z běhu interpretu.
Umístění těchto testů se řídí cestou k předanému kompilátoru, na jeho úrovni je vytvořena složka log
, do které jsou dle sekcí tyto logy ukládány. Umístění složky lze konfigurovat podle parametru příkazové řádky, viz níže.
Soubor logu jako takový je validní zdrojový kód jazyka IFJcode17
, lze jej tedy přidat interpretu přímo (při standardní běhu je interpretu předáno pouze to, co reálně skutečně vygeneroval kompilátor). Struktura zalogovaných informací je následující, myslíme, že ji není třeba dodatečně popisovat:
# TEST: 01
# INFO: Basic test for scope without any statements.
# INTERPRETER STDIN:
#
#
# COMPILER STDERR:
#
# INTERPRETER STDERR:
# Executing instruction: IJUMP at line: 2 with following arguments:
# Executing instruction: ILABEL at line: 3 with following arguments:
#
#
# EXPECTED INTERPRETER STDOUT:
#
# CURRENT INTERPRETER STDOUT:
#
#
# EXPECTED COMPILER EXIT CODE: 0
# CURRENT COMPILER EXIT CODE: 0
# EXPECTED INTERPRETER EXIT CODE: 0
# CURRENT INTERPRETER EXIT CODE: 0
#
# ' Basic test for scope without any statements.
# SCOPE
# END SCOPE
# # # # # # # # # # # # # # # # # # # #
.IFJcode17
CALL scope
LABEL scope
Některé testy mohou definovat svoji závislost na specifickém rozšíření. Spouštěč automaticky hledá soubor rozsireni
ve složce kompilátoru, o složku výše a ještě jednou o složku výše. Cestu lze také předat pomocí argumentu příkazové řádky, viz níže. V případě, že je soubor nalezen, jsou z něj načtena aktivovaná rozšíření, dle kterých jsou následně spouštěny testy.
Spouštěč testů lze dále také konfigurovat pomocí příkazové řádky, viz nápověda po zadání argumentu -h
:
thejoeejoee@selene:~/projects/IFJ-VUT-BIT-2017-2018/cmake-build-debug$ ifjcode17-tests -h
usage: ifjcode17-tests [-h] [-i INTERPRETER] [-e EXTENSIONS_FILE] [-v]
[-d TESTS_DIR] [-l LOG_DIR] [-t TOKEN_FILE]
[--benchmark-url-target BENCHMARK_URL_TARGET]
[--command-timeout COMMAND_TIMEOUT] [--no-colors]
[--no-stdout-diff]
compiler
[wildcards]
Automatic test cases runner for IFJ17 compiler.
positional arguments:
compiler path to IFJ17 compiler binary
optional arguments:
-h, --help show this help message and exit
-i INTERPRETER, --interpreter INTERPRETER
path to IFJ17 interpreter binary
-e EXTENSIONS_FILE, --extensions-file EXTENSIONS_FILE
path to file with extensions 'rozsireni'
-v, --verbose enable verbose output
-d TESTS_DIR, --tests-dir TESTS_DIR
path to folder with tests to run
-l LOG_DIR, --log-dir LOG_DIR
path to folder with logs
-t TOKEN_FILE, --token-file TOKEN_FILE
path to token file (default .TOKEN in log dir)
--benchmark-url-target BENCHMARK_URL_TARGET
target hostname to send benchmark results
--command-timeout COMMAND_TIMEOUT
maximal timeout for compiler and interpreter
--no-colors disable colored output (for Windows CMD etc.)
--no-stdout-diff disable stdout log by difflib
Authors: Josef Kolář (xkolar71, @thejoeejoee), Son Hai Nguyen (xnguye16,
@SonyPony), GNU GPL v3, 2017