Testen im Factor-Track

Lerne, wie du deine Factor-Übungen auf Exercism testest


Wenn du eine Übung herunterlädst, speichert Exercism sie als eigenständigen Ordner, zum Beispiel ~/exercism/factor/hello-world. Dieser Ordner enthält einen Unterordner mit deiner Lösung und einen weiteren mit dem Test-Runner:

hello-world/
├── hello-world/
│   ├── hello-world.factor        <- your solution
│   └── hello-world-tests.factor  <- the tests
└── exercism-tools/               <- the bundled test runner

Wechsle mit cd in das oberste Verzeichnis dieses Ordners und führe die Tests so aus:

factor -roots=. -run=exercism-tools <exercise>

Ersetze <exercise> durch den Namen der Übung (denselben Namen wie der Ordner). Um zum Beispiel hello-world zu testen:

cd ~/exercism/factor/hello-world
factor -roots=. -run=exercism-tools hello-world

Führe den Befehl im obersten Verzeichnis des Übungsordners aus, also in dem Verzeichnis, das sowohl den Unterordner <exercise> als auch exercism-tools enthält.

Das sind dieselben Tests, die Exercism beim Einreichen ausführt. Sobald sie alle lokal bestehen, kannst du einreichen.

Ein Test nach dem anderen

Jede Übung beginnt damit, dass nur der erste Test aktiv ist. Die übrigen Tests werden durch eine STOP-HERE-Zeile in der Datei <exercise>-tests.factor zurückgehalten; der Test-Runner ignoriert alles darunter.

"year not divisible by 4 in common year" description
{ f } [ 2015 leap-year? ] unit-test

STOP-HERE

"year divisible by 2, not divisible by 4 in common year" description
{ f } [ 1970 leap-year? ] unit-test

Bring den ersten Test zum Bestehen, verschiebe dann STOP-HERE hinter den nächsten Test (oder lösche die Zeile, um alle zu aktivieren) und führe die Tests erneut aus. Arbeite dich so durch die Datei, bis alle Tests bestehen.

Wenn du einreichst, ignoriert der Test-Runner von Exercism STOP-HERE und führt jeden Test aus. Stelle also sicher, dass alle bestehen, bevor du einreichst.

Wenn die Tests bestehen

Der Test-Runner gibt jeden ausgeführten Test aus und beendet sich ohne weitere Ausgabe:

Unit Test: { { f } [ 2015 leap-year? ] }

Wenn ein Test fehlschlägt

Der Test-Runner zeigt den Test und dann den erwarteten Wert im Vergleich zu dem Wert, den dein Code produziert hat:

Unit Test: { { f } [ 2015 leap-year? ] }
--> test failed!
###FAIL_BEGIN###
leap/leap-tests.factor: 5
=== Expected:
f
=== Got:
t
###FAIL_END###

Hier hat der Test 2015 leap-year? ausgeführt und f auf dem Stack erwartet, aber t erhalten.

Einen Test lesen

Tests werden mit unit-test geschrieben. Das nimmt ein Array entgegen, das beschreibt, wie der Stack nach dem Ausführen einer Quotation aussehen soll:

{ 3 } [ 1 2 + ] unit-test

Dies führt [ 1 2 + ] aus und prüft, dass es 3 auf dem Stack hinterlässt. Ein leeres Array, { }, bedeutet, dass die Quotation den Stack leer hinterlassen soll. Die optionale Zeile description über einem Test gibt ihm einfach einen lesbaren Namen.

Weitere Details findest du in der Factor-Dokumentation zu Unit-Testing.