Test Runner haben eine einzige Aufgabe: Sie nehmen eine Lösung entgegen, führen alle Tests aus und geben eine standardisierte Ausgabe zurück. Die gesamte Interaktion mit der Exercism-Website läuft automatisch ab und ist nicht Teil dieser Spezifikation.
two-fer)./tmp für temporäre Dateien zu verwenden (z. B. zum Kompilieren von Quellcode).results.json in das Ausgabeverzeichnis schreiben.Der Test Runner erhält 100 % CPU und 3 GB Arbeitsspeicher für ein Zeitfenster von 20 Sekunden pro Lösung. Nach 20 Sekunden wird der Prozess angehalten und meldet einen Timeout.
Wir empfehlen dir dringend, unser Dokument mit den Best Practices zur Performance zu befolgen, um die Wahrscheinlichkeit von Timeouts zu verringern.
Die folgenden Felder werden in results.json-Dateien unterstützt:
Schlüssel:
version, Typ:number, Präsenz: erforderlich
version: 1, 2, 3
Die Version der Spezifikation, an die sich diese Datei hält:
1: Für Tracks, deren Test Runner keine Informationen zu einzelnen Tests liefern kann.2: Für Tracks, deren Test Runner Informationen zu einzelnen Tests ausgeben kann. Minimal erforderliche Version für Tracks mit Concept Exercises.3: Für Tracks, deren Test Runner einzelne Tests mit einer Aufgabe verknüpfen kann.Schlüssel:
status, Typ:string, Präsenz: erforderlich
version: 1, 2, 3
Die folgenden Gesamtstatus sind gültig:
pass: Alle Tests bestandenfail: Mindestens ein Test hat den Status fail oder error
error: Kein Test wurde ausgeführt (das bedeutet meist einen Kompilierfehler oder einen Syntaxfehler)Der Status error sollte nur verwendet werden, wenn bei allen Tests ein Fehler auftrat.
Bei kompilierten Sprachen ist das in der Regel die Folge davon, dass der Code nicht kompiliert werden kann.
Bei interpretierten Sprachen ist das ein Laufzeitfehler, etwa ein Syntaxfehler, der das Parsen der Datei verhindert.
Schlüssel:
message, Typ:string, Präsenz: erforderlich, wennstatus=error, oder wennstatus=failundversion=1
version: 1, 2, 3
Wenn der Status error ist (kein Test wurde korrekt ausgeführt), sollte der message-Schlüssel auf oberster Ebene angegeben werden. Er sollte dem Nutzer den aufgetretenen Fehler mitteilen. Da es die einzige Information ist, die ein Nutzer zur Fehlersuche erhält, muss er so klar wie möglich sein:
<solution-dir>/relative/path statt /full/path/to, da Letzteres nutzlose, ECR-spezifische Daten enthältIn Ruby geben wir bei einem Syntaxfehler den Laufzeitfehler und den Stacktrace an. Bei kompilierten Sprachen sollte der Kompilierfehler angegeben werden.
Der Wert von message auf oberster Ebene ist auf 65535 Zeichen beschränkt.
Die effektive maximale Länge ist geringer, wenn der Wert Mehrbyte-Zeichen enthält.
Wenn der Status nicht error ist, setze den Wert entweder auf null oder lasse den Schlüssel ganz weg.
Schlüssel:
tests, Typ:array, Präsenz: erforderlich, wennstatus=failoderstatus=pass
version: 2, 3
Dies ist ein Array der Testergebnisse, wie im Abschnitt „Pro Test" weiter unten beschrieben.
Die Tests MÜSSEN in der Reihenfolge zurückgegeben werden, in der sie in der Testdatei angegeben sind. Bei Sprachen, die Tests in zufälliger Reihenfolge ausführen, kann das bedeuten, dass du die Ergebnisse an die in der Testdatei angegebene Reihenfolge anpassen musst.
Der Grund dafür ist, dass Lernenden nur der erste Fehlschlag angezeigt wird, und deshalb ist es wichtig, dass der richtige Fehlschlag angezeigt wird. Da die Tests in der Testdatei in der Regel nach TDD geordnet sind und die Lernenden bei Practice Exercises die Testdatei im Editor sehen, ist es entscheidend, die Ergebnisse an die Testdatei anzugleichen.
Schlüssel:
name, Typ:string, Präsenz: erforderlich
version: 2, 3
Dies ist der Name des Tests in einem menschenlesbaren Format.
Schlüssel:
test_code, Typ:string, Präsenz: erforderlich, wenn die Übung eine Concept Exercise ist
version: 2, 3
Dies MUSS bei Concept Exercises vorhanden sein und SOLLTE bei Practice Exercises vorhanden sein.
Der Unterschied bei dieser Anforderung kommt daher, dass den Lernenden bei Concept Exercises die Tests nicht angezeigt werden, sodass das Lösen der Übung ohne die Anzeige des test_code unmöglich sein kann, während die Tests bei Practice Exercises angezeigt werden.
Dies ist der Rumpf des Befehls, der getestet wird. Zum Beispiel sollte der folgende Ruby-Test:
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
einen test_code-Wert von:
"cart = ShoppingCart.new
cart.add(:STARIC)
cart.add(:MEDNEW)
cart.add(:MEDNEW)
assert_equal 'Newspaper, Rice', cart.items_list"
liefern (wobei Zeilenumbrüche durch \n ersetzt werden, damit das JSON gültig ist).
Schlüssel:
status, Typ:string, Präsenz: erforderlich
version: 2, 3
Die folgenden Status pro Test sind gültig:
pass: Der Test war erfolgreichfail: Der Test ist fehlgeschlagenerror: Der Test ist mit einem Fehler abgebrochen, das heißt, er hat keinen Wert zurückgegebenSchlüssel:
message, Typ:string, Präsenz: erforderlich, wennstatusfailodererrorist
version: 2, 3
Der message-Schlüssel pro Test wird verwendet, um die Ergebnisse eines Tests mit dem status fail oder error zurückzugeben. Er sollte so menschenlesbar wie möglich sein. Was hier geschrieben wird, wird dem Lernenden angezeigt, wenn der Test nicht besteht. Wenn es keine Fehlschlagmeldung oder Fehlermeldung für den Test gibt, setze den Wert entweder auf null oder lasse den Schlüssel ganz weg. Es ist auch zulässig, hier die Ausgabe der Testsuite auszugeben. Der Wert von message ist in seiner Länge nicht begrenzt.
Schlüssel:
output, Typ:string, Präsenz: optional
version: 2, 3
Der output-Schlüssel pro Test sollte verwendet werden, um alles zu speichern und auszugeben, was ein Nutzer absichtlich für einen Test ausgibt.
puts in Ruby, print in Python oder Debug.WriteLine in C#), oder eine Methode bereitstellen, die der Nutzer verwenden kann (z. B. stellt der Ruby Test Runner dem Nutzer eine global verfügbare debug-Methode zur Verfügung, die er verwenden kann und die dieselben Eigenschaften wie die Standardmethode puts hat).Schlüssel:
task_id, Typ:number, Präsenz: optional
version: 3
Verknüpfe einen Test über die ID der Aufgabe mit einer bestimmten Aufgabe. Die ID ist die Nummer, die am Anfang der Aufgabenüberschrift steht. Verknüpfe einen Test nur dann mit einer Aufgabe, wenn er sich genau einer Aufgabe zuordnen lässt.
Derzeit haben nur Concept Exercises klar definierte Aufgaben, mit denen du Tests verknüpfen kannst, aber das könnte sich in Zukunft ändern.
Betrachte zum Beispiel die folgende Datei instructions.md:
# 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
...
Diese Anweisungen definieren zwei Aufgaben:
Die Datei results.json könnte dann einen Eintrag wie diesen enthalten:
{
"name": "Expected oven time in minutes",
"status": "pass",
"task_id": 1,
"test_code": "Assert.Equal(40, Lasagna.ExpectedMinutesInOven());"
}
Dieser Test ist jetzt mit der ersten Aufgabe verknüpft: „Die erwartete Backofenzeit in Minuten definieren". Beachte, dass der Name nicht mit der Beschreibung der Aufgabe übereinstimmen muss.
Es gibt verschiedene Möglichkeiten, wie Tracks das umsetzen könnten:
.meta/config.json der Übung) und führe diese Informationen mit der erzeugten Datei results.json zusammen.Dies sind Beispiele dafür, wie eine gültige Datei results.json für die verschiedenen Versionen aussehen kann:
{
"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
}
]
}
Wenn die Lösung eines Lernenden bei einem Test fehlschlägt, sollte etwa Folgendes angezeigt werden:
Test Code:
<test_code>
Test Result:
<message>
Wenn die Lösung einen Test besteht, sollte etwa Folgendes angezeigt werden:
Test Code:
<test_code>
Alle Wege führen nach Rom, und es gibt kein vorgeschriebenes Vorgehen, um dorthin zu gelangen. Bislang wurden mehrere Ansätze gewählt: