Lerne, wie du deine Arturo-Übungen auf Exercism testest
Der Arturo-Track verwendet für alle Übungstests das Unitt-3.0.0-Paket für Unit-Tests.
Dieses Paket bietet ein Test-Framework, das sowohl die moderne, von RSpec inspirierte Syntax als auch die alte, von XUnit inspirierte Syntax unterstützt.
Wenn du arturo tester.art oder exercism test aus deinem lokalen Übungsordner heraus ausführst, wird das Paket beim ersten Durchlauf aus dem Internet installiert.
Alternativ kannst du Unitt mit arturo --package install unitt 3.0.0 installieren.
Zunächst wird nur der erste Test ausgeführt und dir zurückgemeldet.
Sobald dieser Test bestanden ist, hebst du die Überspringung des nächsten Tests auf und führst die Tests erneut aus, bis jeder Test besteht.
Bei den RSpec- und XUnit-Setups ist das jeweils so einfach wie das Entfernen von .skip aus it.skip bzw. test.skip.
Sobald alle Tests bestehen, reiche deine Lösung ein. Beachte aber, dass der Test-Runner alle Tests ausführt, auch die übersprungenen.
Dein heruntergeladener Übungsordner enthält einige Dateien, aber diese drei sind die wesentlichen.
leap/
├── src/leap.art # Your solution file
├── tests/test-leap.art # Test cases for the exercise
└── tester.art # Test runner entry point
Wenn du arturo tester.art ausführst, wird Unitt eingerichtet und anschließend werden die Tests in tests/test-leap.art ausgeführt.
Die Tests importieren src/leap.art, wo deine Lösung liegt, und stellen dann eine Reihe von Assertions dazu auf, was deine Lösung für bestimmte Eingabewerte zurückgeben soll.
isLeap?: function [year][
panic "please implement the isLeap? function"
]
Wenn du eine Übung beginnst, enthält deine Lösungsdatei eine Vorlage mit der grundlegenden Struktur dessen, was erwartet wird.
In diesem Beispiel aus Leap enthält die Datei eine minimalistische Definition der erwarteten Funktion isLeap? und insbesondere ein panic, das die Testausführung stoppt.
Entferne die panic-Zeile und beginne dann mit der Implementierung von isLeap?.
import.version:3.0.0 {unitt}!
import {src/leap}!
describe "Leap" [
it "a year not divisible by 4 is a common year" [
expects.be:'false? @[isLeap? 2015]
]
it.skip "a year divisible by 4 and not divisible by 100 is a leap year" [
expects.be:'true? @[isLeap? 1996]
]
]
describe definiert einen Block von Testfällen, die etwas Gemeinsames prüfen. Diese können verschachtelt sein.it und it.skip definieren jeweils einen einzelnen Testfall, der ausgeführt bzw. übersprungen wird.expects leitet die Assertion ein, die im Mittelpunkt eines Testfalls steht. expects.be nimmt eine Prädikatfunktion entgegen, mit der die Assertion formuliert wird.In expects.be:'false? @[isLeap? 2015] behauptet die Testsuite, dass die Funktion isLeap? für das Jahr 2015 false zurückgeben soll.
Eine andere Schreibweise dafür ist expects.be:'equal? @[false isLeapYear? 2015], womit wir behaupten, dass der Rückgabewert von isLeapYear? 2015 gleich false ist.
Diese längere Form, die zwei Werte vergleicht, ist die häufigste Art von Assertion im Arturo-Track.
Der erwartete Wert steht im Block immer zuerst, vor dem Ergebniswert.
suite "Leap" [
test "a year not divisible by 4 is a common year" [
result: isLeap? 2015
assert -> false = result
]
test.skip "a year divisible by 4 and not divisible by 100 is a leap year" [
result: isLeap? 1996
assert -> true = result
]
]
Die XUnit-ähnliche API, die in Version 1 von Unitt eingeführt wurde, wird aus Gründen der Abwärtskompatibilität unterstützt und entspricht weitgehend der modernen RSpec-ähnlichen API, abgesehen von ihren weniger flexiblen Assertions.
suite definiert einen Block von Testfällen, die etwas Gemeinsames prüfen. Diese können verschachtelt sein.test und test.skip definieren jeweils einen einzelnen Testfall, der ausgeführt bzw. übersprungen wird.assert leitet die Assertion ein, die im Mittelpunkt eines Testfalls steht. Der Ausdruck auf der rechten Seite des folgenden -> muss wahr sein.Bei XUnit-Tests werden üblicherweise vor der assert-Zeile Variablen für das Ergebnis und optional für den erwarteten Wert angelegt.
Egal, ob du die RSpec- oder die XUnit-API verwendest, die Testausgabe ist weitgehend ähnlich.
Der einzige Unterschied ist, was unter jedem Testnamen ausgegeben wird.
XUnit meldet die Assertion mit den ausgewerteten Werten, du siehst also false = false.
RSpec hingegen meldet sie als false? false, weil wir die Funktion false? zusammen mit expects verwendet haben.
Ganz am Anfang meldet Arturo einen Fehler, wenn das panic aus der Startdatei nicht entfernt wurde, und wertet keinen einzigen Test aus.
Uncaught error in tests/test-leap.art:
#[
output: {
══╡ Program Error ╞═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ <script> ══
Please implement the isLeap? function
}
code: 1
]
Sobald das panic ersetzt ist, meldet Arturo den Status für jede Assertion innerhalb eines Tests.
Jetzt besteht der erste Test, aber der zweite Test wird übersprungen.
======== .unitt/tests/test-leap.art ========
Describe: Leap
✅ - assert that a year not divisible by 4 is a common year
✅: false? false
⏩ - assert that a year divisible by 4 and not divisible by 100 is a leap year
skipped!
========== Summary ==========
⏏️ TOTAL: 2 assertions
✅ PASSED: 1 assertion
⏩ SKIPPED: 1 assertion
❌ FAILED: 0 assertion
========== ======= ==========
Nachdem du die Überspringung des zweiten Tests manuell aufgehoben hast, werden beide Tests ausgeführt.
Die aktuelle Implementierung von isLeap? gibt jedoch nur false zurück, weshalb der zweite Test bei seiner Assertion fehlschlägt.
======== .unitt/tests/test-leap.art ========
Describe: Leap
✅ - assert that a year not divisible by 4 is a common year
✅: false? false
❌ - assert that a year divisible by 4 and not divisible by 100 is a leap year
❌: true? false
========== Summary ==========
⏏️ TOTAL: 2 assertions
✅ PASSED: 1 assertion
⏩ SKIPPED: 0 assertion
❌ FAILED: 1 assertion
========== ======= ==========
Dieser Vorgang wiederholt sich, während du die Überspringung weiterer Tests aufhebst. Sobald alle Tests bestehen, bist du mit der Übung fertig und kannst deine Lösung einreichen. Beachte, dass der Test-Runner alle Tests ausführt, egal ob sie lokal übersprungen werden oder nicht.