A tesztfuttatóknak egyetlen feladatuk van: átveszik a megoldást, lefuttatják az összes tesztet, és szabványosított kimenetet adnak vissza. Az Exercism weboldalával való minden kapcsolattartás automatikusan történik, és nem része ennek a specifikációnak.
two-fer)./tmp könyvtárat használni.results.json fájlt kell írnia a kimeneti könyvtárba.A tesztfuttató megoldásonként egy 20 másodperces időablakra 100% CPU-t és 3 GB memóriát kap. 20 másodperc után a folyamat leáll, és időtúllépést jelez.
Erősen ajánljuk, hogy kövesd a teljesítményre vonatkozó bevált gyakorlatokról szóló dokumentumot, hogy csökkentsd az időtúllépés esélyét.
A results.json fájlokban az alábbi mezők támogatottak:
kulcs:
version, típus:number, jelenlét: kötelező
verzió: 1, 2, 3
Annak a specifikációnak a verziója, amelyhez ez a fájl igazodik:
1: Olyan kurzusokhoz, amelyeknek a tesztfuttatója nem tud információt adni az egyes tesztekről.2: Olyan kurzusokhoz, amelyeknek a tesztfuttatója képes kiírni az egyes tesztek adatait. A tanulófeladatokkal rendelkező kurzusok minimálisan megkövetelt verziója.3: Olyan kurzusokhoz, amelyeknek a tesztfuttatója az egyes teszteket részfeladatokhoz tudja kapcsolni.kulcs:
status, típus:string, jelenlét: kötelező
verzió: 1, 2, 3
A következő átfogó állapotok érvényesek:
pass: Minden teszt sikeresfail: Legalább egy teszt állapota fail vagy error
error: Egyetlen teszt sem futott le (ez általában fordítási vagy szintaktikai hibát jelent)Az error állapotot csak akkor használd, ha az összes teszt hibázott.
Fordított nyelvek esetében ez általában annak a következménye, hogy a kód nem fordítható le.
Értelmezett nyelvek esetében ez futásidejű hiba, például egy szintaktikai hiba, amely megakadályozza a fájl feldolgozását.
kulcs:
message, típus:string, jelenlét: kötelező, hastatus=error, vagy hastatus=failésversion=1
verzió: 1, 2, 3
Ha az állapot error (egyetlen teszt sem futott le helyesen), akkor a legfelső szintű message kulcsot meg kell adni. Ez mutatja meg a felhasználónak a fellépő hibát. Mivel ez az egyetlen információ, amelyet a felhasználó a hibája kiderítéséhez kap, a lehető legvilágosabbnak kell lennie:
<solution-dir>/relative/path a /full/path/to helyett, mert utóbbi zavaró, ECR-specifikus adatokat is tartalmazRubyban szintaktikai hiba esetén a futásidejű hibát és a hívási vermet adjuk meg. Fordított nyelvek esetében a fordítási hibát kell megadni.
A legfelső szintű message érték legfeljebb 65535 karakter lehet.
A tényleges maximális hossz kevesebb, ha az érték többbájtos karaktereket tartalmaz.
Ha az állapot nem error, akkor vagy állítsd az értéket null-ra, vagy hagyd el teljesen a kulcsot.
kulcs:
tests, típus:array, jelenlét: kötelező, hastatus=failvagystatus=pass
verzió: 2, 3
Ez a teszteredmények tömbje, amelyet az alábbi „Tesztenkénti” szakasz ír le.
A teszteket KELL abban a sorrendben visszaadni, ahogyan a tesztfájlban szerepelnek. A véletlenszerű sorrendben tesztelő nyelvek esetében ez azt jelentheti, hogy az eredményeket a tesztfájlban megadott sorrendnek megfelelően újra kell rendezni.
Ennek az az oka, hogy a tanulóknak csak az első hibát mutatjuk meg, ezért fontos, hogy a helyes hiba jelenjen meg. Mivel a tesztfájlban a tesztek általában TDD-szemléletben vannak sorba rendezve, és mivel a gyakorlófeladatoknál a tanulók a szerkesztőben látják a tesztfájlt, elengedhetetlen az eredményeket a tesztfájlhoz igazítani.
kulcs:
name, típus:string, jelenlét: kötelező
verzió: 2, 3
Ez a teszt neve, ember által olvasható formátumban.
kulcs:
test_code, típus:string, jelenlét: kötelező, ha a feladat tanulófeladat
verzió: 2, 3
Tanulófeladatoknál ez KELL, hogy szerepeljen, gyakorlófeladatoknál pedig KELLENE.
A követelmény különbsége abból fakad, hogy a tanulófeladatoknál a tanulók nem látják a teszteket, így a test_code megjelenítése nélkül lehetetlen lehet megoldani a feladatot, a gyakorlófeladatoknál viszont a tesztek láthatók.
Ez a tesztelt parancs törzse. Például a következő Ruby-teszt:
def test_duplicate_items_uniqs_list
cart = ShoppingCart.new
cart.add(:STARIC)
cart.add(:MEDNEW)
cart.add(:MEDNEW)
assert_equal 'Newspaper, Rice', cart.items_list
end
esetén a test_code értékeként ezt kell visszaadni:
"cart = ShoppingCart.new
cart.add(:STARIC)
cart.add(:MEDNEW)
cart.add(:MEDNEW)
assert_equal 'Newspaper, Rice', cart.items_list"
(a sortöréseket \n helyettesíti, hogy a JSON érvényes legyen).
kulcs:
status, típus:string, jelenlét: kötelező
verzió: 2, 3
A következő tesztenkénti állapotok érvényesek:
pass: A teszt sikeres voltfail: A teszt sikertelen volterror: A teszt hibázott, azaz nem adott vissza értéketkulcs:
message, típus:string, jelenlét: kötelező, hastatusértékefailvagyerror
verzió: 2, 3
A tesztenkénti message kulcs arra szolgál, hogy visszaadja egy fail vagy error állapotú teszt eredményeit. A lehető leginkább ember által olvashatónak kell lennie. Amit ide írsz, az megjelenik a tanulónak, amikor a tesztje nem sikerül. Ha nincs hibát jelző üzenet vagy hibaüzenet, akkor vagy állítsd az értéket null-ra, vagy hagyd el teljesen a kulcsot. Az is megengedett, hogy ide írd a tesztsorozat kimenetét. A message érték hossza nincs korlátozva.
kulcs:
output, típus:string, jelenlét: opcionális
verzió: 2, 3
A tesztenkénti output kulcsot arra kell használni, hogy tárolja és megjelenítse mindazt, amit a felhasználó szándékosan kiír egy teszthez.
puts Rubyban, print Pythonban vagy Debug.WriteLine C#-ban), vagy biztosíthatsz egy metódust, amelyet a felhasználó használhat (pl. a Ruby-tesztfuttató biztosít a felhasználónak egy globálisan elérhető debug metódust, amely ugyanolyan tulajdonságokkal rendelkezik, mint a szabványos puts metódus).kulcs:
task_id, típus:number, jelenlét: opcionális
verzió: 3
Kapcsolj egy tesztet egy adott részfeladathoz annak azonosítóján keresztül, amely a részfeladat címsorának elején szereplő szám. Csak akkor kapcsolj egy tesztet egy részfeladathoz, ha az pontosan egy részfeladathoz kapcsolható.
Jelenleg csak a tanulófeladatoknak vannak jól meghatározott részfeladatai, amelyekhez teszteket kapcsolhatsz, de ez a jövőben változhat.
Például vegyük a következő instructions.md fájlt:
# Instructions
You're going to write some code to help Lucian cook an exquisite lasagna from his favorite cook book.
## 1. Define the expected oven time in minutes
...
## 2. Calculate the remaining oven time in minutes
...
Ezek az utasítások két részfeladatot határoztak meg:
A results.json fájl ekkor tartalmazhat egy ilyen bejegyzést:
{
"name": "Expected oven time in minutes",
"status": "pass",
"task_id": 1,
"test_code": "Assert.Equal(40, Lasagna.ExpectedMinutesInOven());"
}
Ez a teszt most az első részfeladathoz kapcsolódik: „Határozd meg a sütő várható idejét percben”. Vegyük észre, hogy a névnek nem kell megegyeznie a részfeladat leírásával.
Többféleképpen is megvalósíthatják ezt a kurzusok:
.meta/config.json fájljában), és olvaszd bele ezt az információt a generált results.json fájlba.Az alábbiakban arra látsz példákat, hogyan nézhet ki egy érvényes results.json fájl a különböző verziókban:
{
"version": 1,
"status": "fail",
"message": "Failed: test_answer\nExpected: 42, actual: 3"
}
{
"version": 2,
"status": "fail",
"message": null,
"tests": [
{
"name": "Test that the thing works",
"status": "fail",
"message": "Expected 42 but got 123123",
"output": "Debugging information output by the user",
"test_code": "assert_equal 42, answerToTheUltimateQuestion()"
}
]
}
{
"version": 3,
"status": "fail",
"message": null,
"tests": [
{
"name": "Test that the thing works",
"status": "fail",
"message": "Expected 42 but got 123123",
"output": "Debugging information output by the user",
"test_code": "assert_equal 42, answerToTheUltimateQuestion()",
"task_id": 1
}
]
}
Amikor egy tanuló megoldása elbukik egy teszten, valami ilyesmit kell megjelenítenie:
Test Code:
<test_code>
Test Result:
<message>
Amikor a megoldás átmegy egy teszten, valami ilyesmit kell megjelenítenie:
Test Code:
<test_code>
Minden út Rómába vezet, és nincs előírt minta, amivel ezt el lehet érni. Eddig többféle megközelítést alkalmaztak: