Testen im YAMLScript-Track

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


Exercism-Übungslösungen, die in YAMLScript geschrieben sind, zu testen, ist extrem einfach. Leicht auszuführen und leicht zu verstehen.

Du führst einfach make test im Verzeichnis der Übung aus.

Wenn du make test zum ersten Mal ausführst, schlagen alle Tests fehl. Ganz einfach deshalb, weil du noch keinen Code geschrieben hast, der die Tests löst.

Beim normalen Entwickeln einer Übung startest du mit make test und konzentrierst dich dann auf jeweils einen Test, indem du Code schreibst, damit dieser Test durchläuft. Wenn alle Tests durchlaufen, bist du fertig!

Als Bonus stellt make test außerdem sicher, dass die richtige Version des ys-YAMLScript-Interpreters (die, die die aktuelle Übung benötigt) am richtigen Ort installiert ist (in /path/to/exercism/yamlscript/.local/). Das heißt, du musst ys nicht einmal vorher installieren, um loszulegen!

Aufbau eines Übungsverzeichnisses

Wenn du an einer Übung namens the-great-exercise arbeitest, erstellt exercism download --exercise=the-great-exercise --track=yamlscript das Verzeichnis /path/to/exercism/yamlscript/the-great-exercise.

In diesem Verzeichnis heißt die Testdatei the-great-exercise-test.ys und die Datei mit dem Lösungsprogramm the-great-exercise.ys. Außerdem gibt es eine README.md-Datei mit der Beschreibung der Übung und eine HELP.md-Datei mit hilfreichen Informationen, falls du nicht weiterkommst.

Für make gibt es zwei Dateien: Makefile und GNUmakefile. Damit wird (ohne Wortspiel) sichergestellt, dass du zum Ausführen der Tests GNU make verwendest und nicht irgendeinen anderen make-Befehl, der auf deinem System installiert sein könnte. Die GNUmakefile ist die eigentliche Datei, und GNU make bevorzugt sie immer gegenüber der Makefile. Andere make-Befehle verwenden die Makefile, die mit einer Fehlermeldung abbrechen sollte, die dir sagt, dass du GNU make verwenden sollst!

Anatomie einer Testdatei

YAMLScript-Tests sind natürlich in YAMLScript geschrieben! Da YAMLScript YAML ist und YAML Daten sind, sind die Tests im Grunde einfach Daten.

Hier ist ein Beispiel für eine einfache Testdatei. Es sind tatsächlich die ersten drei Tests aus der Übung acronym. :-)

#!/usr/bin/env ys-0

use ys::taptest: :all
load: 'acronym.ys'

test::
- name: Basic
  code: abbreviate('Portable Network Graphics')
  want: PNG

- name: Lowercase words
  code: abbreviate('Ruby on Rails')
  want: ROR

- name: Punctuation
  code: abbreviate('First In, First Out')
  want: FIFO

done: 3

Die erste Zeile ist eine Shebang-Zeile. Sie weist den Befehl prove (der vom Makefile ausgeführt wird) an, zum Ausführen der Tests den YAMLScript-Interpreter ys zu verwenden statt perl, das die Standardeinstellung von prove ist.

Die zweite Zeile ist eine use-Anweisung, die die YAMLScript-Testbibliothek ys::taptest für TAP lädt.

Hinweis: TAP ist eine einfache textbasierte Schnittstelle zwischen Testskripten und Test-Harnesses, und prove ist der Standard-Harness zum Ausführen von TAP-Tests in Perl. Da Perl so allgegenwärtig ist, sind TAP und prove am Ende eine sehr gute Wahl für Testsuiten in vielen Sprachen (auch in YAMLScript).

Die use-Anweisung lädt das Lösungsprogramm acronym.ys, damit diese Testdatei es testet.

Alle unsere Tests stehen in einer YAML-Sequenz unter dem Schlüssel test.

Die letzte Zeile done: ist erforderlich und teilt dem Test-Harness mit, dass alle Tests tatsächlich ausgeführt wurden. Die Zahl (sie ist optional) ist die Anzahl der Tests, die wir erwartet haben.

Jeder Test (unter dem Schlüssel test) ist ein Mapping mit diesen Schlüssel-Wert-Paaren:

  • name: - Die Testbezeichnung, die prove -v ausgibt.
  • code: - Der auszuführende YAMLScript-Code. Dieser Code ruft eine Funktion im Lösungsprogramm auf, an dem wir gerade arbeiten.
  • what: - Bei Tests, die einen Fehler erwarten, ist der Wert error. Bei normalen Tests fehlt das Paar.
  • want: - Das erwartete Ergebnis des Tests. Das ist ein YAML-Wert und kann ein String, eine Zahl, ein boolescher Wert, eine Sequenz oder ein Mapping sein. Wenn what: den Wert error hat, ist dieser Wert die erwartete Fehlermeldung.
  • SKIP: - Setze das auf true, um diesen Test zu überspringen.
  • ONLY: - Setze das auf true, um nur diesen Test auszuführen. Wenn du mehr als einen ONLY:-Test hast, werden alle davon ausgeführt.

Das sollte alles sein, was du wissen musst, um testgetriebene Entwicklung in YAMLScript für Exercism-Übungen zu machen!

Die Bibliothek ys::taptest hat weitere Funktionen, mit denen du komplexere Tests schreiben kannst, aber die Exercism-Tests sind schon für dich geschrieben. Wenn du mehr über die Bibliothek ys::taptest erfahren möchtest, schau in die Dokumentation.