Skip to content
This repository has been archived by the owner on Jun 7, 2020. It is now read-only.

Automatické testy

Josef Kolář edited this page Oct 12, 2017 · 15 revisions

Použití

Celá funkce se 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:

$ python3 test.py ./ifj2017

kde ./ifj2017 je cesta ke kompilátoru, tedy například ~/school/fit/ifj/ifj2017. Takto spuštěný skript automaticky projde implictině složku tests a provede následující sekvenci příkazů (viz struktura testů níže):

  1. pomocí předaného kompilátoru spustí kompilaci testovaného kódu v jazyce IFJ17 do jazyka IFJcode17
  2. zkontroluje návratovou hodnotu
  3. v případě, že je navrácená nebo očekávaná hodnota kompilátoru nenulová, je běh testu ukončen
  4. spustí přibalený interpret jazyka IFJcode17, kterému volitelně předá na standardní vstup definovaný obsah
  5. zkontroluje návratový kód interpretu vůči požadovanému
  6. v případě, že je navrácená nebo očekávaná hodnota interpretu nenulová, je běh testu ukončen
  7. 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: screenshot

Struktura testů

Veškeré informace k definici a struktuře testů lze nalézt na stránce Definice testů.

Logování

Pro každý test spouštěč zaloguje soubor do logovací složku (výchozí log) výsledky z testu. Tento soubor obsahuje veškeré dostupné informace o běhu kompilátoru, jeho výstup v jazyce IFJcode17 i veškeré informace z běhu interpretu. 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ě vypíše 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  

Konfigurace spouštění

Spouštěč testů lze dále také konfigurovat pomocí příkazové řádky, viz nápověda po zadání argumentu -h:

./test.py -h 
usage: test.py [-h] [-i INTERPRETER] [-d TESTS_DIR] [-l LOG_DIR]
               [--command-timeout COMMAND_TIMEOUT]
               compiler

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
  -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
  --command-timeout COMMAND_TIMEOUT
                        maximal timeout for compiler and interpreter

Authors: Josef Kolář (xkolar71, @thejoeejoee), Son Hai Nguyen (xnguye16,
@SonyPony), GNU GPL v3, 2017
Clone this wiki locally