Tests
Die Auswertung kann über verschiedene Wege getestet werden, ohne dass Subato aufgesetzt werden muss.
Manuell
Playground
Es gibt ein webbasiertes Demosystem (eva.playground
), welches mit Streamlit
gebaut wurde. Hiermit kann die Lösungsauswertung getestet werden. Es ermöglicht die Auswahl von
STEF-Aufgaben und erlaubt die temporäre Veränderung der Dateien. Das System kann lokal mit
dem Befehl python -m streamlit run app.py
im Verzeichnis eva.playground/eva/playground
gestartet
werden.
Streamlit bietet für die lokale Entwicklung ein Auto-Reload Feature, womit Quelldateien bei
Änderungen neu geladen werden können. Es kommt allerdings bei der Deserialisierung der Session zu
Problemen, wenn auf Reload
gedrückt wird:
pydantic_core._pydantic_core.ValidationError: 6 validation errors for EvalRequest
solution_files.0
Input should be a valid dictionary or instance of EvaFile [type=model_type, input_value=EvaFile(path='Zeit.java',...nute+min)%60);\n
Streamlit verwendet
pickle
,
wodurch das
Problem
entsteht. In dem Fall einfach die Seite einmal neu laden. Das betrifft nur die lokale Entwicklung,
beim regulären Betrieb gibt es das Problem nicht.
Jupyter Notebooks
Alternativ können Jupyter Notebooks verwendet werden. Für ein Beispiel siehe
exceptions.ipynb.
Hierfür muss cd eva.pltform && poetry install --with test
ausgeführt werden, damit Jupyter
installiert wird. Anschließend:
jupyter notebook /home/fischer/Repositories/SLS/eva2/eva.pltform/tests/integration/coverage/exceptions.ipynb
Automatisch
In den Komponenten des Systems (Dispatcher,
Registry, ...) werden Unit-Tests im jeweiligen tests
Verzeichnis
organisiert. Übergreifende Integration- bzw. Systemtests, welche die korrekte Funktionsweise der
Evaluators sicherstellen, werden unter eva.pltform/tests/integration
organisiert.
Integration-Tests
Damit die Integration-Tests aufgerufen werden können, muss das Poetry-Projekt eingerichtet werden:
cd eva.pltform && poetry install --with test
Es wird pytest
als Testframework verwendet. Die Tests lassen sich so starten:
poetry run pytest tests/integration/evaluator -v
Unter "Settings" -> "Python Integrated Tools" muss eventuell der Testrunner auf pytest
umgestellt
werden. Auch gibt es aktuell einen Bug, bei fehlschlagenden Asserts manchmal nicht die Message
ausgegeben wird (PY-50396). Workaround:
--tb=short
in der Run Configuration als Argument für pytest
mitgeben.
Sollen vorher die Umgebungen im environments
-Verzeichnis gebaut werden, muss --build
mitgegeben
werden. Zusätzlich kann über --log_level
das Logging konfiguriert werden. Mit DEBUG
sieht man
alle Befehle mit deren Ausgaben, die der Evaluator auf der Umgebung ausführt.
Man kann natürlich auch nur bestimmte Testfälle aufrufen und weiter eingrenzen:
poetry run pytest --env java19 tests/integration/evaluator/java/compile.py -v
Die Fixtures für die Tests werden unter tests/integration/fixtures
organisiert. Dabei sollten
jeweils minimale Beispiele für Lösungen und Testfälle verwendet werden. Zudem sollte darauf geachtet
werden, die Funktionsweise der Evaluators als Blackbox zu sehen und nicht jedes Detail separat zu
testen um Komplexität zu reduzieren. Detailierte Tests von Schnittstellen gehören in die
entsprechenden Komponenten, nicht in die übergreifenden Tests.