Upgrade to Pro — share decks privately, control downloads, hide ads and more …

1000 auf einen Streich

1000 auf einen Streich

Das man als Entwickler:in nicht nur Code, sondern auch Tests zu schreiben hat, ist ein alter Hut. Trotzdem ist es für viele eine lästige und monotone Arbeit. Außerdem ist es noch lange nicht garantiert, dass Unit-Tests auch wirklich alle Grenz- und sonstigen Fälle abdecken. Ein moderner Ansatz ist eigenschaftsbasiertes Testen, bei dem eine abstrakte Bedingung spezifiziert und dann vom Testframework automatisch überprüft wird. In diesem Vortrag gebe ich einen Überblick und zeige Beispiele, in welchen Domänen diese praktisch einsetzbar sind.

Errata: Folie 51 ist für jqwik nicht korrekt, da "size" eine untergeordnete Rolle bei den Generatoren spielt

Weiterführende Ressourcen: https://lars.hupel.info/articles/property-testing-ressourcen/

Lars Hupel

May 10, 2023
Tweet

More Decks by Lars Hupel

Other Decks in Programming

Transcript

  1. 1000 auf einen
    Streich
    Lars Hupel
    JAX
    2023-05-10

    View Slide

  2. 2

    View Slide

  3. Wo würde man diese Zeile finden?
    int mid = (low + high) / 2;
    3

    View Slide

  4. … und wo ist der Fehler?
    int mid = (low + high) / 2;
    4

    View Slide

  5. 5

    View Slide

  6. Programmierung & Bugs
    6

    View Slide

  7. Requirements
    Design/Architecture
    Implementation
    Testing
    Operation
    7

    View Slide

  8. Alle hassen Bugs
    Aber sie halten sich hartnäckig …
    8

    View Slide

  9. Requirements
    Design/Architecture
    Implementation
    Testing
    Operation
    “Debugging”
    9

    View Slide

  10. 10
    NIST 2002
    Vorsicht bei der
    Interpretation!

    View Slide

  11. “Program testing can be a
    very effective way to show
    the presence of bugs, but it is
    hopelessly inadequate for
    showing their absence”

    View Slide

  12. Spezifikationen
    12

    View Slide

  13. Was sind Spezifikationen?
    13

    View Slide

  14. Was sind Spezifikationen?
    14

    View Slide

  15. Was sind Spezifikationen?
    15

    View Slide

  16. Was sind Spezifikationen?
    16

    View Slide

  17. Was machen Spezifikationen?
    Spezifikation Implementation
    ???
    17

    View Slide

  18. Gab es ja alles schon einmal …
    18

    View Slide

  19. Ausführbare Spezifikationen
    19

    View Slide

  20. Binäre Suche, die Zweite
    20
    int mid = (low + high) / 2;

    View Slide

  21. Binäre Suche, die Zweite
    21
    int mid = (low + high) / 2;
    assert low <= mid;
    assert mid <= high;

    View Slide

  22. Property
    Binäre Suche, die Zweite
    22
    assert low <= high;
    assert 0 <= low;
    int mid = (low + high) / 2;
    assert low <= mid;
    assert mid <= high;

    View Slide

  23. 23

    View Slide

  24. 24
    Property
    Parameter Ergebnis

    View Slide

  25. 25
    Property
    Parameter
    Vorbedingung
    Success
    Failure
    Skipped
    Nachbdg.

    View Slide

  26. 26

    View Slide

  27. Sortierung (vereinfacht)
    27
    int[] sort(int[] input);

    View Slide

  28. Nachbedingung
    28
    boolean isSorted(int[] input);

    View Slide

  29. Property
    Nachbedingung
    29
    var output = sort(input);
    assert isSorted(output);

    View Slide

  30. Sortierung
    herstellen
    Sortierung
    prüfen

    View Slide

  31. Sortierung
    herstellen
    Sortierung
    prüfen

    View Slide

  32. 32

    View Slide

  33. 33
    int[] sort(int[] input) {
    // …
    }

    View Slide

  34. 34
    int[] sort(int[] input) {
    return new int[] {};
    }

    View Slide

  35. Invariante
    35
    boolean hasSameElements(
    int[] array1,
    int[] array2
    );

    View Slide

  36. Property
    Invariante
    36
    var output = sort(input);
    assert hasSameElements(
    input,
    output
    );

    View Slide

  37. 37

    View Slide

  38. Ja, aber …
    Sortierfunktionen
    implementiere ich
    nicht!
    Was ist mit meiner
    Geschäftslogik?
    Soll ich jetzt den
    ganzen Code
    spezifizieren?

    View Slide

  39. “One way is to make it so
    simple that there are
    obviously no deficiencies

    View Slide

  40. “One way is to make it so
    simple that there are
    obviously no deficiencies,
    and the other way is to make
    it so complicated that there
    are no obvious deficiencies.”

    View Slide

  41. Sortierung
    herstellen
    Sortierung
    prüfen

    View Slide

  42. X
    herstellen
    X
    prüfen

    View Slide

  43. 43

    View Slide

  44. 44

    View Slide

  45. Property-Testing in Java
    45

    View Slide

  46. Beispiel: jqwik
    ● Property-Testing für Java
    ● nahtlos integriert in JUnit 5 Platform
    https://jqwik.net/
    46
    +

    View Slide

  47. 47
    class SortTests {
    @Property
    void testSorted(@ForAll int[] array) {
    // …
    }
    }

    View Slide

  48. Wie werden Parameter generiert?
    48
    public interface Arbitrary {
    RandomGenerator generator(int size);
    }

    View Slide

  49. Wie werden Parameter generiert?
    49
    public interface RandomGenerator {
    Shrinkable next(Random random);
    }

    View Slide

  50. Wie werden Parameter generiert geschrumpft?
    50
    public interface Shrinkable {
    T value();
    Stream> shrink();
    }

    View Slide

  51. 51
    Arbitrary
    suchen
    beginnend mit
    size = 1 …
    T erzeugen
    Property
    füttern
    T schrumpfen size += 1
    Property
    füttern

    View Slide

  52. 52

    View Slide

  53. 53

    View Slide

  54. 54

    View Slide

  55. In der Praxis
    55

    View Slide

  56. 56

    View Slide

  57. Central Bank Digital Currency
    57
    CBDC
    Banknotes Bank deposits
    and e-money
    Issued by the
    central bank
    Digital money

    View Slide

  58. 58

    View Slide

  59. How money is represented in G+D Filia®
    59

    View Slide

  60. 60

    View Slide

  61. 61

    View Slide

  62. 62

    View Slide

  63. 63

    View Slide

  64. 64

    View Slide

  65. Fazit
    1 Der Einstieg ist leicht. Man muss es bloß tun.
    2 PT erzwingt besseres Design.
    3 Designfehler werden früh aufgedeckt.
    4 PT ist nicht das Allheilmittel.

    View Slide

  66. Questions?
    Answers!
    Lars Hupel
    https://lars.hupel.info
    [email protected]

    View Slide

  67. Bildquellen
    ● Edsger W. Dijskstra: Hamilton Richards, CC-BY-
    SA 3.0,
    https://commons.wikimedia.org/w/index.php?ti
    tle=File:Edsger_Wybe_Dijkstra.jpg&oldid=7102
    50942
    ● ER-Modell: Jhon, CC-BY-SA 4.0,
    https://commons.wikimedia.org/w/index.php?ti
    tle=File:Scd_model.png&oldid=498684760
    ● BPMN: Mikelo Skarabo, CC-BY-SA 4.0,
    https://commons.wikimedia.org/w/index.php?ti
    tle=File:BPMN-
    AProcessWithNormalFlow.svg&oldid=7345119
    59
    ● Tony Hoare: Rama, CC-BY-SA 2.0,
    https://commons.wikimedia.org/w/index.php?ti
    tle=File:Sir_Tony_Hoare_IMG_5125.jpg&oldid=
    732060083

    View Slide