Spock und AsciiDoc – Vom Test zur Spezifikation und zurück

Spock und AsciiDoc – Vom Test zur Spezifikation und zurück

Frankfurter Entwicklertag 2020

https://entwicklertag.de/frankfurt/2020/spock-und-asciidoc-%E2%80%93-vom-test-zur-spezifikation-und-zur%C3%BCck-level-advanced

Spock ist ein Testframework für Webanwendungen, mit dem man unter Anderem den Behavior Driven Development Ansatz, kurz BDD, verfolgen kann. Der Product-Owner beschreibt das Verhalten einer Applikation und der Entwickler überprüft es über einen automatischen Test.

Dem Entwickler reicht die Ausgabe "PASSED" oder "FAILED", denn er kennt ja den Code seiner Tests. Wäre es nicht cool, wenn auch der Product Owner ein verständliches Dokument bekäme?

Kein Problem! Wir generieren Sie über ein Template einfach einen Test-Report in AsciiDoc und fügen weitere erklärende Texte hinzu um eine les- und ausführbare Spezifikation zu erhalten. Screenshots aller wichtigen Schritte bereichern die Spezifikation weiter.

Sollte aber die Spezifikation nicht am Anfang stehen? Und warum Spezifikation, wenn wir agil sein wollen?

Richtig! Stellen wir also eine iterative Feature-Beschreibung an den Anfang und verfeinern diese mit automatischen Tests um am Ende eine gut lesbare und verifizierbare Spezifikation des Verhaltens unseres Systems zu erhalten!

Die Vorteile liegen auf der Hand - die Vorgehensweise verbessert die Kommunikation zwischen Product-Owner und Entwicklern und am Ende bekommen wir ein Dokument welches Ihre wertvolle Software korrekt und überprüfbar beschreibt.

Cc5f3bf8b3cb91c985ed4fd046aa451d?s=128

Ralf D. Müller

February 20, 2020
Tweet

Transcript

  1. ein perfektes Paar DB Systel GmbH | Ralf D. Müller,

    (Christian Fischer) Spock und AsciiDoc + =
  2. Ralf D. Müller Software Architect @ DB Systel mit Schwerpunkt

    Web-Technologien Qualität (Security, Testautomation) Produktivität (Gradle, Groovy, Grails) Prozessoptimierung In der Freizeit Geek, arc42 Contributor & Maintainer von docToolchain DB Systel GmbH @DBSystel | Ralf D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 2
  3. Was ist Spock? DB Systel GmbH @DBSystel | Ralf D.

    Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 3 Leonard Brüning
  4. Was ist Spock? DB Systel GmbH @DBSystel | Ralf D.

    Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 4 void testeAdditionJUnit() { Calculator calculator = new Calculator() BigDecimal result = calculator.plus( 3, 4) assertEquals(7, result, 0.1) }
  5. Was ist Spock? DB Systel GmbH @DBSystel | Ralf D.

    Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 5 void "Rechner kann addieren Spock I"() { given: Calculator calculator = new Calculator() when: BigDecimal result = calculator.plus( 3, 4) then: assertEquals(7, result, 0.1) }
  6. Was ist Spock? DB Systel GmbH @DBSystel | Ralf D.

    Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 6 void "Rechner kann addieren Spock II"() { given: "ein Caclulator Objekt" Calculator calculator = new Calculator() when: "zwei Zahlen addiert werden" BigDecimal result = calculator.plus( 3, 4) then: "erhalte ich das richtige Ergebnis" assertEquals(7, result, 0.1) }
  7. Was ist Spock? DB Systel GmbH @DBSystel | Ralf D.

    Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 7 void "Rechner kann addieren Spock III"() { given: "ein Caclulator Objekt" Calculator calculator = new Calculator() when: "#a und #b addiert werden" BigDecimal result = calculator.plus( a, b) then: "erhalte ich #expected" assertEquals(expected, result, 0.1) where: "Beispieldaten" a | b || expected 3 | 4 || 7 4 | 3 || 7 -5 | 7 || 2 -7 | 5 || -2 }
  8. Was ist Spock? DB Systel GmbH @DBSystel | Ralf D.

    Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 8 void "Rechner kann addieren Spock IV"() { given: "ein Caclulator Objekt" def calculator = new Calculator() when: "#a und #b addiert werden" def result = calculator.plus( a, b) then: "erhalte ich #expected" result == expected where: "Beispieldaten" a | b || expected 3 | 4 || 7 4 | 3 || 7 -5 | 7 || 2 -7 | 5 || -2 }
  9. Was ist AsciiDoc? DB Systel GmbH @DBSystel | Ralf D.

    Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 9
  10. Was ist AsciiDoc? DB Systel GmbH @DBSystel | Ralf D.

    Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 10 = AsciiDoc *AsciiDoc* ist ein Dokumentationsformat, welches mit Hilfe des Tools *Asciidoctor* in verschiedene andere Formate wie z.B. HTML gewandelt werden kann. AsciiDoc hat den Vorteil, dass man es einfach wie eine eMail schreiben kann und sich wie Sourceode versionieren lässt. Sie auch https://asciidoctor.org[asciidoctor.org] AsciiDoc AsciiDoc ist ein Dokumentationsformat, welches mit Hilfe des Tools Asciidoctor in verschiedene andere Formate wie z.B. HTML gewandelt werden kann. AsciiDoc hat den Vorteil, dass man es einfach wie eine eMail schreiben kann und sich wie Sourceode versionieren lässt. Sie auch asciidoctor.org
  11. AsciiDoc – Special Features: Includes DB Systel GmbH @DBSystel |

    Ralf D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 11
  12. AsciiDoc – Special Features: Tabellen DB Systel GmbH @DBSystel |

    Ralf D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 12
  13. AsciiDoc – Special Features: Diagramme DB Systel GmbH @DBSystel |

    Ralf D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 13
  14. ? DB Systel GmbH @DBSystel | Ralf D. Müller @RalfDMueller

    | Frankfurter Entwicklertag | 20.02.2020 14
  15. Nochmal ein Blick auf Spock… DB Systel GmbH @DBSystel |

    Ralf D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 15 void "Rechner kann addieren Spock IV"() { given: "ein Caclulator Objekt" def calculator = new Calculator() when: "#a und #b addiert werden" def result = calculator.plus( a, b) then: "erhalte ich #expected" result == expected where: "Beispieldaten" a | b || expected 3 | 4 || 7 4 | 3 || 7 -5 | 7 || 2 -7 | 5 || -2 }
  16. Was liefern die Tests als Ausgabe? DB Systel GmbH @DBSystel

    | Ralf D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 16
  17. Was liefern die Tests als Ausgabe? DB Systel GmbH @DBSystel

    | Ralf D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 17
  18. Was liefern die Tests als Ausgabe? DB Systel GmbH @DBSystel

    | Ralf D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 18
  19. Was liefern die Tests als Ausgabe? DB Systel GmbH @DBSystel

    | Ralf D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 19
  20. Was liefern die Tests als Ausgabe? DB Systel GmbH @DBSystel

    | Ralf D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 20 Tilman Ginzel
  21. Was liefern die Tests als Ausgabe? DB Systel GmbH @DBSystel

    | Ralf D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 21
  22. Was liefern die Tests als Ausgabe? DB Systel GmbH @DBSystel

    | Ralf D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 22
  23. Was können wir jetzt damit machen? DB Systel GmbH @DBSystel

    | Ralf D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 23
  24. Was können wir jetzt damit machen? DB Systel GmbH @DBSystel

    | Ralf D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 24 = Spezifikation :pathToSpec: ../../build/spock-reports/ :numbered: Dieses Projekt soll den Benutzer durch zusätzliche Features länger auf der Suchseite halten um höhere Werbeinnahmen zu generieren. == Story: Taschenrechner Als Benutzer möchte ich bei Eingabe des Suchbegriffs "Rechner" oder bei der Eingabe einer Mathematischen Rechnung einen Taschenrechner als Web-Anwendung angezeigt bekommen, so daß ich nicht die Suche Verlassen muss === Akzeptanztest include::{pathToSpec}demo.WebCalcSpec.adoc[tag=Bing- Rechner_aufrufen]
  25. Was können wir jetzt damit machen? DB Systel GmbH @DBSystel

    | Ralf D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 25
  26. Was haben wir erreicht? DB Systel GmbH @DBSystel | Ralf

    D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 26 Anwendung Tests Test- Report Spec
  27. Was haben wir erreicht? Was wollen wir erreichen? DB Systel

    GmbH @DBSystel | Ralf D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 27 Anwendung Tests Test- Report Spec
  28. Zusammenfassung DB Systel GmbH @DBSystel | Ralf D. Müller @RalfDMueller

    | Frankfurter Entwicklertag | 20.02.2020 Feature-Spec (draft) implementierte Tests Acceptance-Test (Ziel) Test-Gerüst
  29. Zusammenfassung DB Systel GmbH @DBSystel | Ralf D. Müller @RalfDMueller

    | Frankfurter Entwicklertag | 20.02.2020 Acceptance-Test (Ziel) Test-Gerüst implementierte Tests Unvollständige Test-Liste Test schreiben Test begrünen refactor Tests ergänzen
  30. Zusammenfassung DB Systel GmbH @DBSystel | Ralf D. Müller @RalfDMueller

    | Frankfurter Entwicklertag | 20.02.2020 Feature-Spec (draft) implementierte Features getestete Spec (final) Acceptance Test(s) (final) implementierte Tests Acceptance-Test (Ziel) Test-Gerüst selektierte Tests
  31. Also schreiben wir eine Spezifikation… DB Systel GmbH @DBSystel |

    Ralf D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 31 = Spezifikation include::config.adoc[] Dieses Projekt soll den Benutzer durch zusätzliche Features länger auf der Suchseite halten um höhere Werbeinnahmen zu generieren. == Story: Taschenrechner Als Benutzer möchte ich bei Eingabe des Suchbegriffs "Rechner" oder bei der Eingabe einer Mathematischen Rechnung einen Taschenrechner als Web-Anwendung angezeigt bekommen, so daß ich nicht die Suche Verlassen muss === Acceptancetests ==== User calls Calculator [cols="1,10"] |=== | Given | User is on the main page | When | User enters 'calc' as search-term and submits the form | Then | the search result displays a calculator |===
  32. …welche durch das einfache Format maschinenlesbar ist DB Systel GmbH

    @DBSystel | Ralf D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 32 = Spezifikation include::config.adoc[] Dieses Projekt soll den Benutzer durch zusätzliche Features länger auf der Suchseite halten um höhere Werbeinnahmen zu generieren. == Story: Taschenrechner Als Benutzer möchte ich bei Eingabe des Suchbegriffs "Rechner" oder bei der Eingabe einer Mathematischen Rechnung einen Taschenrechner als Web-Anwendung angezeigt bekommen, so daß ich nicht die Suche Verlassen muss === Acceptancetests ==== User calls Calculator [cols="1,10"] |=== | Given | User is on the main page | When | User enters 'calc' as search-term and submits the form | Then | the search result displays a calculator |===
  33. Das Testgerüst wird extrahiert… DB Systel GmbH @DBSystel | Ralf

    D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 33 = Spezifikation include::config.adoc[] Dieses Projekt soll den Benutzer durch zusätzliche Features länger auf der Suchseite halten um höhere Werbeinnahmen zu generieren. == Story: Taschenrechner Als Benutzer möchte ich bei Eingabe des Suchbegriffs "Rechner" oder bei der Eingabe einer Mathematischen Rechnung einen Taschenrechner als Web-Anwendung angezeigt bekommen, so daß ich nicht die Suche Verlassen muss === Acceptancetests ==== User calls Calculator [cols="1,10"] |=== | Given | User is on the main page | When | User enters 'calc' as search-term and submits the form | Then | the search result displays a calculator |=== @Ignore("not implemented") def "User calls Calculator"() { given: "User is on the main page" when: "User enters 'calc' as search-term and submits the form" then: "the search result displays a calculator" }
  34. … und ausgeführt wird DB Systel GmbH @DBSystel | Ralf

    D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 34
  35. …wodurch die Spezifikation den echten Test zeigt DB Systel GmbH

    @DBSystel | Ralf D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 35 = Spezifikation include::config.adoc[] Dieses Projekt soll den Benutzer durch zusätzliche Features länger auf der Suchseite halten um höhere Werbeinnahmen zu generieren. == Story: Taschenrechner Als Benutzer möchte ich bei Eingabe des Suchbegriffs "Rechner" oder bei der Eingabe einer Mathematischen Rechnung einen Taschenrechner als Web-Anwendung angezeigt bekommen, so daß ich nicht die Suche Verlassen muss === Acceptancetests ==== User calls Calculator [cols="1,10"] |=== | Given | User is on the main page | When | User enters 'calc' as search-term and submits the form | Then | the search result displays a calculator |=== = Spezifikation include::config.adoc[] Dieses Projekt soll den Benutzer durch zusätzliche Features länger auf der Suchseite halten um höhere Werbeinnahmen zu generieren. == Story: Taschenrechner Als Benutzer möchte ich bei Eingabe des Suchbegriffs "Rechner" oder bei der Eingabe einer Mathematischen Rechnung einen Taschenrechner als Web-Anwendung angezeigt bekommen, so daß ich nicht die Suche Verlassen muss === Acceptancetests include::{pathToSpec}acceptance.Specification2bSpec.adoc[ tag=User_calls_Calculator]
  36. … die Applikation wird entwickelt DB Systel GmbH @DBSystel |

    Ralf D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 36
  37. Fazit DB Systel GmbH @DBSystel | Ralf D. Müller @RalfDMueller

    | Frankfurter Entwicklertag | 20.02.2020 37
  38. + =

  39. Tech Evening Event am 20.03.20 Du willst wissen, was die

    Bahn in Sachen IT sonst so macht? Komm vorbei und informiere Dich bei Snacks, Getränken und einem traumhaften Blick über die Dächer Frankfurts! Melde dich gleich an! deutschebahn.com/tech-evening DB Systel GmbH @DBSystel | Ralf D. Müller @RalfDMueller | Frankfurter Entwicklertag | 20.02.2020 39
  40. Vielen Dank für Ihre Aufmerksamkeit! Ralf.D.Mueller@DeutscheBahn.com https://rdmueller.github.io/feedback Clipart: presentermedia.com, licenced

    to ralf.d.mueller@gmail.com www.dbsystel.de