Automatické testování zápočtových úloh
Tato stránka slouží pro poznámky ohledně testování řešení zápočtových úloh, která mi odevzdají studenti, a způsobů, jak toto testování co nejvíce zautomatizovat. Každý program, který studenti dodají, má trochu jiné volání, volby atd. I když se proti tomu snažím bojovat tím, že v zadání poměrně přesně specifikuju, jak se má program ovládat, pořád si musím vždy znova vzpomínat, jakou specifikaci jsem pro tu kterou úlohu stanovil já sám. Pokud jde navíc o úlohu, u které chci otestovat úspěšnost na nějakých testovacích datech, musím si i pamatovat umístění testovacích dat a posloupnost kroků při testování.
Na KSVI už něco podobného řešili a mají nějaký webový systém pro sběr zápočtových úloh. Zatím o tom nic nevím, takže ani nevím, jestli bych to mohl používat mimo KSVI a jestli by to umělo pracovat s programy v Perlu.
Zatím jsem se dopracoval k jednomu Makefilu (/home/zeman/zapoctaky/Makefile
), který slouží jako archiv způsobů volání jednotlivých programů a současně mi umožňuje zopakovat test libovolného programu až po cílové hlášení o úspěšnosti. S automatickým nebo poloautomatickým spouštěním cizích programů jsou samozřejmě spojena také bezpečnostní rizika, viz též komentáře na začátku uvedeného Makefilu.
Ideálně by to celé mělo běžet ve virtuálním stroji, abych nedbale nebo zákeřně napsaným zápočťákem nemohl nic zničit. Ještě ideálněji by k tomu později přibylo webové rozhraní, jehož prostřednictvím by student mohl své řešení odevzdat a rovnou se dozvědět, co se s ním stalo (např. že v testovacím prostředí nefunguje). Testovací prostředí by volitelně mohlo mít vypnuté cesty k běžným linuxovým nástrojům, aby se zvýšila přenositelnost programu.
Pokud nedokážu zautomatizovat používání virtuálního stroje, hodil by se alespoň uživatel s minimálními právy zápisu na disk (a možná i pouštění programů).
Standardní perlové moduly Opcode a Safe umožňují zakázat Perlu provádět některé operace (pokud je zdroják obsahuje, dojde k chybě při kompilaci).
Mohl bych vytvořit “safe compartment”, v něm eval a v něm teprve přeložit a vykonat testovaný zápočťák.
Měl bych dovolit psaní pouze na STDOUT a STDERR. Zápis do pojmenovaného souboru by vyžadoval mnohem více kontrol a většinou ho nepotřebuju (někdy ale program štěpí výstup na dva a pak je to potřeba). Neměl bych dovolit chdir, protože tím se úplně mění kontext diskových operací. Stejně tak bych neměl dovolit mkdir a další zapisovací operace se systémem souborů. Proměnné prostředí bych měl více méně vyprázdnit, aby program neznal mé jméno, cestu k mému homu atd.