TDDI16 Datastrukturer och algoritmer
Ht1 2024
TestLab
TestLab är ett verktyg som försöker hjälpa till med testning av era lösningar till laborationerna i kursen. Det är inspirerat av artikeln Executable Examples for Programming Problem Comprehension. Detta är ett verktyg som vi har använt några år, och det fungerar bra till sitt ändamål. Det är dock inte obligatoriskt att använda, även om det underlättar testningsfasen.
Idé
Verktyget är tänkt att hjälpa till med skapandet av relevanta tester. Programmet läser in en uppsättning testfall och säger två saker: dels ifall testfallen är korrekta (dvs. att de matchar den specifikation som finns i laborationerna), och dels ifall testfallen är intressanta. Intressanta testfall är i det här fallet testfall som hittar buggar i en av de felaktiga implementationerna som verktyget känner till.
För att detta ska fungera, finns det alltså till varje laboration ett eller flera korrekta program, och ett eller flera felaktiga program. Målet för er är att skriva testfall som dels stämmer överens med de korrekta programmen, och dels hittar de problem som finns i de inkorrekta problemen. Lyckas ni med det så har ni skrivit en bra testsvit!
De korrekta programmen representerar olika möjliga korrekta implementationer. Anledningen till att det ibland finns flera är att vissa problem inte alltid bara har en godkänd lösning (exempelvis kan det finnas flera olika kortaste vägar). De inkorrekta programmen representerar logiska fel i olika delar av uppgiften, och försöker introducera fel på olika ställen för att ge en bra indikation om alla delar av problemet har testats ordentligt.
Hämta verktyget
Notera: Verktyget finns i dagsläget endast tillgängligt för Linux. Programmet fungerar på Debian-baserade system (Ubuntu, Linux Mint, etc.), och kanske på andra system också. Om inte annat går det att köra via ThinLinc.
På egen dator (Linux)
Du kan hämta verktyget till din egen dator med hjälp av kommandot scp
(byt
ut <liu-id>
mot ditt LiU-id):
scp -r <liu-id>@ssh.edu.liu.se:/courses/TDDI16/test ~/testlab
Efter detta kan testlab
köras med kommandot ~/testlab/testlab
, vilket
kan vara tillräckligt. Det går också att skapa ett alias för att kunna
använda testlab
i stället. Det görs genom att lägga till följande rad i
filen ~/.bashrc
:
alias testlab="~/testlab/testlab"
Sedan behöver skalet startas om för att ändringarna ska ha effekt.
Via ThinLinc
Verktyget finns på ThinLinc och på datorerna i SU-salarna i
mappen /courses/TDDI16/test/
. Det enklaste sättet att använda det på är att lägga
till modulen som finns genom att köra:
module add /courses/TDDI16/module
Detta gör att ni kommer åt kommandot testlab
i den terminalen där ni skrev
kommandot. Vill ni att programmet ska vara åtkomligt varje gång ni loggar in, och i alla
terminaler kan ni använda:
module initadd /courses/TDDI16/module
Det kan krävas att ni loggar ut och sedan in igen för att modulen ska laddas ordentligt.
TestLab kan sedan köras genom att skriva testlab
i terminalen.
Användning
Efter att du har konfigurerat ditt system enligt ovan kan du köra testlab
i
terminalen. Kommandot tar två parametrar enligt nedan:
testlab <lab> <testfil>
Där <lab>
är den lab ni vill testa, och <testfil>
är
namnet på er fil med testfall. För att testa de testfall som finns i
filen lab1_tests.txt
kan man alltså skriva:
testlab lab1 lab1_tests.txt
Det finns även ett grafiskt gränssnitt som kan köras med kommandot testlab-gui
(kräver Python 3 och PyGtk). Det grafiska gränssnittet gör det enklare att skriva korrekta
testfiler, och att köra testerna. Det går också att använda det grafiska gränssnittet för att
skapa testfiler och sedan köra dem via terminalen, eller andra kombinationer. Värt att notera är
att det grafiska gränssnittet tar bort kommentarer i testfilerna, så öppna inte testfiler med
viktiga kommentarer i i GUI versionen.
Testfall
Testfallen skrivs i en vanlig textfil med valfri texteditor. Filen består av ett eller flera
testfall avgränsade med en rad med minst två bindestreck (----
). Varje testfall
består i sin tur av en uppsättning parametrar. Parametrarna kan komma i vilken ordning som helst
och de skrivs antingen som:
nyckel: värde
eller som nedan ifall flera rader av data ska matas in:
key\
line1
line2
Notera indenteringen på raderna som följer key\
.
Varje laboration har sitt eget indataformat, vilket beskrivs här nedan:
Lab 1 - AVL-träd
Varje testfall ska innehålla två parametrar: insert
och remove
. Testramverket sätter först in alla värden som anges
efter insert
, och tar sedan bort de som står efter remove
. Sedan
kontrollerar det om trädet ser korrekt ut. Två enkla testfall kan se ut som nedan:
insert: 5 1 8
remove: 8
----
insert: 5 1 8
remove: 1
Lab 2 - Hitta dubbletter
Det finns ingen möjlighet att testa denna labb automatiskt ännu.
Lab 3 - Ordkedjor
Varje testfall kan innehålla följande parametrar:
dictionary
Namn på den fil som innehåller ordlistan som ska användas. Kan också vara en lista av ord som ska användas.from
Startordet i sökningen. Omfrom
utelämnas sker en sökning från alla ord tillto
to
Slutordet i sökningen.expected_length
Antal ord i den väg som vi förväntar oss att programmet hittar. Längden 0 motsvarar att ingen lösning finns.expected_first
Det ord vi förväntar oss är först i vägen vi hittar. Kan utelämnas omfrom
finns med.expected_last
Det ord vi förväntar oss är sist i vägen vi hittar. Kan utelämnas.
Testramverket kommer också att titta på den vägen som finns och se ifall det är en korrekt
ordkedja. Nedan finns ett par exempel på hur testfall kan se ut. Notera att rader som börjar med
en fyrkant (#
) är kommentarer:
dictionary: simple.txt
from: aaaa
to: aabb
expected_length: 3
# These are optional:
expected_first: aaaa
expected_last: aabb
----
dictionary: simple.txt
to: aaaa
expected_length: 4
expected_first: babb
# This is optional:
expected_last: aaaa
----
# It is possible to inline the dictionary as well.
dictionary\
aula
gula
gala
gama
jama
sten
to: aula
expected_length: 5
expected_first: jama
# This is optional.
expected_last: aula
----
dictionary\
aaaa
zzzz
from: aaaa
to: zzzz
# 0 means "no solution"
expected_length: 0
Lab 4 - Mönsterigenkänning
Varje testfall kan innehålla följande parametrar:
points
Antingen en lista av punkter (varje punkt på en egen rad), eller ett namn på en fil som innehåller punkter.tolerance
Tolerans som ska användas då punkter jämförs. Ompoints
är en fil så behövs inte denna parameter.lines
En lista av de linjer som programmet väntas producera. Endast de längsta linjerna behöver finnas med här. Testet kommer att räknas som godkänt även om kortare versioner av de linjer som finns med här matas ut av programmet.
points\
10 10
20 20
30 30
40 40
50 50
10 100
20 90
lines\
10 10 - 50 50
---
points: input7.txt
lines\
1000 1000 - 5000 5000
Testa er egen lösning
När ni har skapat många bra testfall som hittar alla buggarna i de felaktiga programmen har ni
en bra testsvit för att testa ert eget program. Det går såklart att göra genom att manuellt
testa de testfallen som finns i testfilen, men det är tråkigt och blir lätt fel. Därför
kan testlab
hjälpa till även med detta!
Du kan be testlab
att köra dina tester på din lösning genom att lägga till namnet
på din kompilerade fil sist i kommandoraden. Exempelvis:
testlab lab1 tests.txt avl_tree-test
eller
testlab lab3 tests.txt wordchains
Då kommer som sagt alla tester som finns i filen tests.txt
att köras mot din
implementation i stället för de referensimplementationer som finns. testlab
kommer
i slutändan att skriva ut alla testfall som misslyckades, och en liten förklaring till varför de
misslyckades.
Sidansvarig: Filip Strömbäck
Senast uppdaterad: 2024-09-06