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

Automatické testy

hamyhamz edited this page Dec 6, 2017 · 15 revisions

Použití

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):

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

Selekce testů ke spuštění

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 sekci 01_basic
  • functions vybírá celou sekci 02_sections
  • 01/01 (nebo basic/01) vybírá pouze test 01 v sekci 01_basic
  • 01/03 66 spustí testy ze sekce 66_errors a test 03 v sekci 01

Struktura testů

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

Logy z 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  

Aktivovaná rozšíření

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.

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:

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