Zum Inhalt
wannacode

Gutscheincodes: von der Anfrage bis zur Freigabe

Kurz gesagt: Eine Anfrage, „ich will Gutscheincodes für den Herbst“, geht durch alles im Kurs. Die Fragen finden den Bedarf und die Menschen, die niemand fragt. Die Story wird nach ihren Regeln aufgeteilt, die Gültigkeitsdauer geht durch Example Mapping. Die Regeln des Codes werden zu Szenarien gegen ein System mit Fehlern, und weil die Änderung den Warenkorbwert berührt, wird auch die Lieferung vor Regression geschützt. Der gefangene Fehler wird zu einem Bericht, zwei Szenarien werden zu Code, und die Matrix sagt, was berührt wird, wenn sich die Anforderung ändert.

Problem

Die Anfrage

Der Inhaber des Shops schreibt an einem Montagmorgen:

„Ich will Gutscheincodes für den Herbst. 10 % Rabatt, bis Ende November. In zwei Wochen ist Freigabe.“

Drei Sätze. Sie enthalten mindestens fünf Regeln, die noch niemand ausgesprochen hat, ein offenes Thema mit Geld darin und einen Menschen, der von der Änderung erst erfährt, wenn er seine Arbeit nicht machen kann. In diesem Projekt gehst du den ganzen Weg: von den drei Sätzen zur freigegebenen und geprüften Änderung.

Die Idee

Der Weg

Jeder Schritt kommt aus einem Modul des Kurses:

  1. die Fragen: der Bedarf hinter der Anfrage und die Menschen, die gefragt werden müssen;
  2. die Story und das Aufteilen: Die Anfrage ist groß; sie wird nach ihren Regeln zerschnitten;
  3. Example Mapping: die Regeln, die Beispiele und die Fragen zur Gültigkeitsdauer des Codes;
  4. die Szenarien und die Tests: Die Regeln des Codes werden zu Szenarien; die Änderung berührt auch den Warenkorbwert, und die Lieferung hängt davon ab, also wird sie vor Regression geschützt;
  5. der Bericht: der Fehler, den die Änderung gebracht hat, so beschrieben, dass er beim ersten Mal behoben wird;
  6. die Automatisierung: Zwei Szenarien für den Gutscheincode werden zu Code in den vier Sprachen;
  7. die Matrix und die Änderung: was die Tests abdecken und was berührt wird, wenn sich die Anforderung ändert.
Genauer, für Neugierige

Im Browser laufen die Szenarien gegen ein System mit Fehlern. Für den Gutscheincode kennt es drei der Regeln: 10 %, reduzierte Produkte und welcher Rabatt beim Stammkundenstatus gilt. Die Gültigkeitsdauer und „Der Code wurde schon benutzt“ stehen nicht darin: Sie stehen in der Karte, in der Matrix und in der Automatisierung, wo die Szenarien mit den echten Werkzeugen laufen. Die Regression, die Tabelle und der Bericht gehören zur Lieferung: Die Änderung am Code verändert den Warenkorbwert, von dem die Lieferung abhängt, und die Lieferung muss richtig bleiben.

Probier es aus

Die Fragen

1. Was ist die erste Frage an den Inhaber?
2. Wen musst du außer dem Inhaber noch fragen?
3. Wird die Schwelle für kostenlose Lieferung vor dem Rabatt gezählt oder danach? Der Inhaber sagt: „Darüber habe ich nicht nachgedacht.“
4. Welche Frage ist suggestiv?

Die Idee

Die Antworten

Nach den Gesprächen mit dem Inhaber, dem Marketing und der Buchhaltung sieht die Anfrage so aus:

  • der Bedarf: mehr neue Kunden im Herbst. Maß: Erstbestellungen neuer Kunden pro Monat, verglichen mit dem letzten Herbst; gemessen Ende November;
  • die Regeln: Der Code gibt 10 % Rabatt; er gilt nicht für reduzierte Produkte; er wird in einer bezahlten Bestellung benutzt („Der Code wurde schon benutzt“); er gilt bis einschließlich zu seinem letzten Tag („Der Code ist abgelaufen“); er addiert sich nicht mit dem Stammkundenstatus, der größere gilt;
  • die Buchhaltung: will sehen, welcher Code jeden Rabatt gegeben hat;
  • offene Frage: Wird die Schwelle von 50 € für kostenlose Lieferung vor dem Rabatt gezählt oder danach? Der Inhaber entscheidet; bis dahin entscheidet niemand sonst.

Fünf Regeln in einer Story sind viel. Der nächste Schritt ist das Aufteilen.

Übung

Die Story und die Karte

1. Das Aufteilen. Die Story mit allen Regeln des Codes ist für eine Iteration zu groß.

Wähle das Muster, nach dem die Story zerschnitten wird, und baue dann das Aufteilen in der Reihenfolge, in der es gemacht wird.

Story

Als Kunde möchte ich einen Gutscheincode eingeben und einen Rabatt bekommen, damit ich günstiger kaufe.

Schritt 1: Nach welchem Muster wird geteilt?

2. Die Gültigkeitsdauer. Das erste Stück nach 10 % ist die Gültigkeitsdauer. Die Three Amigos haben sich mit den Karten hingesetzt.

Lege jede Karte an ihren Platz und entscheide dann, was die Story ist.

Story

Als Kunde möchte ich wissen, bis wann der Code gilt, damit ich ihn rechtzeitig benutze.

Klicke bei jeder Karte auf „Legen als…“ und wähle: Regel (wird zur Spalte), Beispiel zu einer Regel oder Frage. Die Pfeiltasten wechseln zwischen den Möglichkeiten, Esc schließt. Mit der Maus geht es auch: Zieh die Karte an ihren Platz.

Regeln

Noch keine Regeln. Lege eine Karte als Regel, und sie wird zur Spalte.

Fragen

  • Noch keine Fragen.

Nicht gelegte Karten

  • Ein abgelaufener Code wird mit „Der Code ist abgelaufen“ abgelehnt, und der Warenkorbwert bleibt ohne Rabatt

  • Eine Bestellung am 30. November mit HERBST10: Ein T-Shirt für 20,00 € kostet 18,00 €

  • Der Code wurde am 30. November um 23:50 eingegeben, und die Bestellung wurde am 1. Dezember um 00:10 bezahlt. Gilt er?

  • Der letzte Tag endet um Mitternacht nach wessen Uhr: der des Shops oder der des Kunden?

  • Der Code gilt bis einschließlich zu seinem letzten Tag

  • Eine Bestellung am 1. Dezember mit HERBST10: „Der Code ist abgelaufen“, das T-Shirt kostet weiter 20,00 €

  • HERBST10 gilt bis zum 30. November. Eine Bestellung am 15. November: Ein T-Shirt für 20,00 € kostet 18,00 €

Übung

Die Szenarien für den Code

Drei der Regeln aus dem Aufteilen laufen gleich hier: 10 %, reduzierte Produkte und der Stammkunde mit Code. Ein Szenario pro Beispiel, in der Sprache des Inhabers.

Schreibe die Szenarien für den Gutscheincode so, dass alle sechs Fehler rund um die Rabatte gefangen werden.

GherkinRabatte

Die Idee

Die Änderung berührt die Lieferung

Der Gutscheincode verändert den Warenkorbwert. Die Lieferung hängt vom Warenkorbwert ab: kostenlos ab 50,00 € einschließlich, sonst 4,90 €. Der Programmierer des Codes wird genau die Berechnung des Warenkorbwerts anfassen.

Was auch immer der Inhaber zur Schwelle vor oder nach dem Rabatt entscheidet, die Lieferregel aus dem Warenkorbwert muss richtig bleiben. Deshalb wird die Lieferung vor der Änderung vor Regression geschützt: Szenarien für die vereinbarten Beispiele und Tests für die technischen Fälle, die fehlschlagen, wenn rund um die Grenze etwas kaputtgeht.

Übung

Die Regression der Lieferung

1. Die Szenarien. Wenige Szenarien, eines für jedes vereinbarte Beispiel.

Schreibe die Lieferszenarien so, dass sie die fünf Fehler rund um die Grenze und den leeren Warenkorb fangen.

GherkinKostenlose Lieferung

2. Die technischen Fälle. Die Tabelle ist für den Test auf Komponentenebene: die Fälle, die das Geschäft nicht lesen will.

Schreibe die Fälle, die alle sechs Fehler fangen, einschließlich des Überbleibsels des alten Tarifs für große Bestellungen.

Die Regel: Die Lieferung ist ab einer Bestellung von 50 € (einschließlich) kostenlos, sonst kostet sie 4,90 €. Ein leerer Warenkorb kann nicht bestellt werden.

EingabeErwartetDas richtige System
#WarenkorbwertAbgelehntLieferung

Eine leere Ergebniszelle wird nicht geprüft. Beträge schreibt man wie 49,99.

Übung

Der gefangene Fehler

1. Der Bericht. Der Programmierer des Gutscheincodes berechnet den Warenkorbwert mit Bruchzahlen und rundet ihn auf ganze Euro. Das Szenario für 49,99 € schlägt fehl.

Finde einen Warenkorbwert, bei dem sich der Fehler zeigt, und schreibe den Bericht.

Der gefangene Fehler: Kostenlose Lieferung

bei Beträgen mit Cent knapp unter 50 €

Die Regel: Die Lieferung ist ab einer Bestellung von 50 € (einschließlich) kostenlos, sonst kostet sie 4,90 €. Ein leerer Warenkorb kann nicht bestellt werden.

Schritte zum Reproduzieren

  1. Noch keine Schritte. Füge sie aus dem Vokabular unten hinzu.

Die Schritte stammen aus dem Vokabular der Funktionalität, wie in den Szenarien. Die Werte stehen im Schritt selbst: den Betrag wie 50,00.

Erwartet (was laut Regel passieren soll)
Tatsächlich (was im System mit dem Fehler passiert)
Schweregrad (wie viel Schaden der Fehler anrichtet)
Priorität (wie schnell er behoben werden soll)

Die Idee

Zwei Szenarien automatisieren

Die zwei Szenarien zum Gutscheincode, die der Inhaber gelesen und abgenommen hat:

promo.feature
# language: de
Funktionalität: Gutscheincode
Der Gutscheincode gibt 10 % Rabatt bis einschließlich zu seinem letzten Tag.
Szenario: Der Code gibt 10 %
Angenommen ein Warenkorb von 20,00 €
Wenn ich den Code HERBST10 anwende
Dann beträgt die Summe 18,00 €
Szenario: Abgelaufener Code
Angenommen ein Warenkorb von 20,00 €
Und der Code HERBST10 ist abgelaufen
Wenn ich den Code HERBST10 anwende
Dann sehe ich, dass der Code abgelaufen ist
Dann beträgt die Summe 20,00 €

Die Klasse, die den Code anwendet. Der Warenkorbwert ist in Cent, und der Tag ist eine Eingabe, nicht „heute“: Das ist die Antwort auf die Frage nach Mitternacht aus der Karte und auf die Lektion über Tests in der CI:

src/main/java/shop/PromoCode.java
package shop;
import java.time.LocalDate;
public class PromoCode {
private final String code;
private final LocalDate lastDay;
public PromoCode(String code, LocalDate lastDay) {
this.code = code;
this.lastDay = lastDay;
}
// 10 % von der Summe in Cent. Ein abgelaufener Code wird abgelehnt.
public int apply(int total, LocalDate day) {
if (day.isAfter(lastDay)) {
throw new IllegalArgumentException("Der Code ist abgelaufen");
}
return total - total / 10;
}
}

Der Schritt „Wenn“ wendet den Code an, und der Schritt „Dann“ prüft die Meldung:

src/test/java/shop/PromoSteps.java
@When("ich den Code {word} anwende")
public void apply(String code) {
try {
total = new PromoCode(code, LAST_DAY).apply(total, today);
} catch (IllegalArgumentException e) {
refusal = e.getMessage();
}
}
src/test/java/shop/PromoSteps.java
@Then("sehe ich, dass der Code abgelaufen ist")
public void toldExpired() {
assertEquals("Der Code ist abgelaufen", refusal);
}

Die ganze Datei mit den Schritten, mit dem echten Werkzeug ausgeführt. Beide Szenarien bestehen:

src/test/java/shop/PromoSteps.java
package shop;
import io.cucumber.java.ParameterType;
import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;
import java.time.LocalDate;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class PromoSteps {
// Der letzte Tag des Codes in den Szenarien.
private static final LocalDate LAST_DAY = LocalDate.of(2026, 11, 30);
private int total;
private LocalDate today = LocalDate.of(2026, 11, 15);
private String refusal;
@ParameterType(name = "Betrag", value = "\\d+,\\d{2}")
public int amount(String text) {
return Integer.parseInt(text.replace(",", ""));
}
@Given("ein Warenkorb von {Betrag} €")
public void cart(int cents) {
total = cents;
}
@Given("der Code {word} ist abgelaufen")
public void expired(String code) {
today = LAST_DAY.plusDays(1);
}
@When("ich den Code {word} anwende")
public void apply(String code) {
try {
total = new PromoCode(code, LAST_DAY).apply(total, today);
} catch (IllegalArgumentException e) {
refusal = e.getMessage();
}
}
@Then("beträgt die Summe {Betrag} €")
public void totalIs(int cents) {
assertEquals(cents, total);
}
@Then("sehe ich, dass der Code abgelaufen ist")
public void toldExpired() {
assertEquals("Der Code ist abgelaufen", refusal);
}
}
Ausgabe
OK Abgelaufener Code
OK Der Code gibt 10 %
Szenarien: 2, bestanden: 2, fehlgeschlagen: 0

Und wenn der Programmierer die Gültigkeitsdauer vergisst, gibt der abgelaufene Code immer noch 10 % Rabatt, und das Szenario „Abgelaufener Code“ schlägt fehl:

src/main/java/shop/PromoCode.java
package shop;
import java.time.LocalDate;
public class PromoCode {
private final String code;
private final LocalDate lastDay;
public PromoCode(String code, LocalDate lastDay) {
this.code = code;
this.lastDay = lastDay;
}
// 10 % von der Summe in Cent. Ein abgelaufener Code wird abgelehnt.
public int apply(int total, LocalDate day) {
return total - total / 10;
}
}
Ausgabe
FEHLER Abgelaufener Code: expected: <Der Code ist abgelaufen> but was: <null>
OK Der Code gibt 10 %
Szenarien: 2, bestanden: 1, fehlgeschlagen: 1
Genauer, für Neugierige

Diese Szenarien stehen nicht im Vokabular des Motors des Kurses, also werden sie im Browser nicht gegen ein System mit einem Fehler geprüft. Sie laufen mit Cucumber-JVM, Reqnroll, behave und cucumber-js, wie im Modul „Automatisierung“, und ihre Ausgabe wird verifiziert. Der Rabatt wird auf einen ganzen Cent abgerundet (total / 10 bei ganzen Zahlen); bei Beträgen wie 20,00 € macht das keinen Unterschied, aber es ist eine Entscheidung, die die Buchhaltung bestätigen muss.

Übung

Die Matrix und die Änderung

1. Überdeckung und Auswirkung. Der Herbst ist vorbei. Das Maß hat gezeigt, dass die meisten Codes von Bestandskunden benutzt wurden, und der Inhaber ändert die Regel: Der Code gilt nur für die erste Bestellung des Kunden.

Markiere die Verbindungen. Wähle dann im zweiten Schritt, welche Tests für die Änderung überprüft werden müssen.

Tests

  • T-1: Ein neuer Kunde, ein T-Shirt für 20,00 € mit HERBST10: 18,00 €.
  • T-2: Ein neuer Kunde, eine reduzierte Jeans für 40,00 € mit HERBST10: 40,00 €.
  • T-3: Ein neuer Kunde, ein T-Shirt für 20,00 € und eine reduzierte Jeans für 40,00 € mit HERBST10: 58,00 €.
  • T-4: Der Kunde hat schon eine Bestellung mit HERBST10 bezahlt. In einer neuen Bestellung gibt er HERBST10 ein: „Der Code wurde schon benutzt“.
  • T-5: Ein neuer Kunde gibt HERBST10 am 1. Dezember ein, nach dem letzten Tag: „Der Code ist abgelaufen“.
  • T-6: Ein Stammkunde mit HERBST10, ein T-Shirt für 20,00 €: 18,00 €, nicht 17,00 €.
  • T-7: Ein neuer Kunde gibt HERBST10 am 30. November ein, dem letzten Tag: Ein T-Shirt für 20,00 € kostet 18,00 €.

Klicke auf die Zelle, in der der Test die Anforderung prüft; noch einmal, um die Verbindung zu entfernen. Die Pfeiltasten wechseln zwischen den Zellen, Leertaste oder Enter markiert.

AnforderungenT-1: Ein neuer Kunde, ein T-Shirt für 20,00 € mit HERBST10: 18,00 €.T-2: Ein neuer Kunde, eine reduzierte Jeans für 40,00 € mit HERBST10: 40,00 €.T-3: Ein neuer Kunde, ein T-Shirt für 20,00 € und eine reduzierte Jeans für 40,00 € mit HERBST10: 58,00 €.T-4: Der Kunde hat schon eine Bestellung mit HERBST10 bezahlt. In einer neuen Bestellung gibt er HERBST10 ein: „Der Code wurde schon benutzt“.T-5: Ein neuer Kunde gibt HERBST10 am 1. Dezember ein, nach dem letzten Tag: „Der Code ist abgelaufen“.T-6: Ein Stammkunde mit HERBST10, ein T-Shirt für 20,00 €: 18,00 €, nicht 17,00 €.T-7: Ein neuer Kunde gibt HERBST10 am 30. November ein, dem letzten Tag: Ein T-Shirt für 20,00 € kostet 18,00 €.Abgedeckt durch
R-1 Ein Gutscheincode gibt 10 % Rabatt.0
R-2 Ein Gutscheincode gilt nicht für reduzierte Produkte.0
R-3 Ein Code kann in einer bezahlten Bestellung benutzt werden. Ein zweiter Versuch: „Der Code wurde schon benutzt“.0
R-4 Ein Code gilt bis einschließlich zu seinem letzten Tag. Danach: „Der Code ist abgelaufen“.0
R-5 Rabatte addieren sich nicht: Der größere gilt.0
R-6 Die Bestellung zeigt, welcher Code den Rabatt gegeben hat.0
Prüft0000000

Test

Teste dich

1. Die Anfrage geht um den Gutscheincode. Warum hat das Projekt auch Szenarien und Tests für die Lieferung?
2. Was macht die Matrix in diesem Projekt nützlich, wenn sich die Anforderung ändert?
3. Was davon ist „fertig“ für die Gutscheincodes?
4. Die Frage „nach wessen Zeit endet der letzte Tag“ aus der Karte erwies sich auch im Code als wichtig. Wo?

Erstellt von Ivo Gergov im Rahmen der Kampagne von Evo Tech für zugängliche Programmierausbildung ·