Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| modul:m450:learningunits:lu16:behant_python [2025/10/23 08:28] – [Vergleich zu Unit Tests] kmaurizi | modul:m450:learningunits:lu16:behant_python [2025/10/23 09:34] (aktuell) – [Vergleich zu Unit Tests] kmaurizi | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | ====== LU16e - Behaviour Driven Development (BDD) mit Behave | + | ====== LU16e – Behaviour Driven Development (BDD) in Python |
| ===== Einführung ===== | ===== Einführung ===== | ||
| Zeile 16: | Zeile 16: | ||
| * Entwicklungsschritte von der Benutzerstory bis zum Test automatisieren | * Entwicklungsschritte von der Benutzerstory bis zum Test automatisieren | ||
| * Früh Feedback erhalten, ob das System das gewünschte Verhalten zeigt | * Früh Feedback erhalten, ob das System das gewünschte Verhalten zeigt | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Ausgangssituation: | ||
| + | Stell dir vor, du entwickelst eine kleine **Applikation**, | ||
| + | Diese App soll so getestet werden, dass auch **nicht-technische Personen** verstehen, was überprüft wird. | ||
| + | |||
| + | Das Ziel ist nicht, die App zu programmieren – sondern **ihr Verhalten zu beschreiben und zu testen**, wie sie sich aus Sicht der Benutzer: | ||
| ---- | ---- | ||
| ===== Aufbau eines Behave-Projekts ===== | ===== Aufbau eines Behave-Projekts ===== | ||
| - | Ein Behave-Projekt | + | Ein Behave-Projekt |
| < | < | ||
| project/ | project/ | ||
| - | | + | ├── app/ < |
| + | ├── features/ | ||
| | | ||
| | | ||
| Zeile 32: | Zeile 41: | ||
| * **'' | * **'' | ||
| * **'' | * **'' | ||
| + | * Das App-Modul ('' | ||
| ---- | ---- | ||
| ===== Gherkin-Syntax ===== | ===== Gherkin-Syntax ===== | ||
| - | Gherkin ist eine einfache | + | Gherkin ist eine leicht lesbare |
| - | Jede Datei beschreibt | + | Jede Feature-Datei beschreibt **eine Funktionalität** oder **Benutzerstory**. |
| Beispiel: | Beispiel: | ||
| - | ```gherkin | + | < |
| Feature: Einfacher Taschenrechner | Feature: Einfacher Taschenrechner | ||
| - | Um einfache Rechnungen zu machen | + | Um einfache Rechnungen |
| Möchte ich zwei Zahlen addieren können | Möchte ich zwei Zahlen addieren können | ||
| Scenario: Zwei Zahlen addieren | Scenario: Zwei Zahlen addieren | ||
| - | Given ich habe 50 in den Rechner | + | Given ich habe 50 in die App eingegeben |
| - | And ich habe 70 in den Rechner | + | And ich habe 70 in die App eingegeben |
| - | When ich drücke addieren | + | When ich die Additionsfunktion ausführe |
| - | Then sollte das Ergebnis 120 auf dem Bildschirm | + | Then sollte das Ergebnis 120 auf dem Bildschirm |
| - | ``` | + | </ |
| **Schlüsselwörter: | **Schlüsselwörter: | ||
| Zeile 63: | Zeile 73: | ||
| ---- | ---- | ||
| - | ===== Schrittdefinitionen | + | ===== Schrittdefinitionen |
| - | Jeder Schritt im Feature | + | <WRAP group> |
| + | |||
| + | <WRAP half column> | ||
| + | **Feature | ||
| <code python> | <code python> | ||
| from behave import given, when, then | from behave import given, when, then | ||
| + | from app.calculator import Calculator | ||
| - | @given(' | + | @given(' |
| - | def step_eingabe(context, zahl): | + | def step_input_number(context, zahl): |
| - | if not hasattr(context, | + | # Erstellt (falls nötig) eine neue App-Instanz |
| - | context.zahlen | + | if not hasattr(context, |
| - | context.zahlen.append(zahl) | + | context.calc = Calculator() |
| + | context.calc.enter_number(zahl) | ||
| - | @when(' | + | @when(' |
| - | def step_add(context): | + | def step_perform_add(context): |
| - | context.resultat | + | # Führt die gewünschte Operation aus |
| + | context.result | ||
| - | @then(' | + | @then(' |
| - | def step_pruefen(context, | + | def step_verify_result(context, |
| - | assert context.resultat | + | # Überprüft das sichtbare Resultat der App |
| + | assert context.result | ||
| </ | </ | ||
| - | **Wichtig: | + | </ |
| - | * Der '' | + | |
| - | * Parameter in geschweiften Klammern '' | + | |
| - | ---- | + | <WRAP half column> |
| + | **App-Code (getestete Anwendung)** | ||
| + | |||
| + | <code python> | ||
| + | # app/ | ||
| + | |||
| + | class Calculator: | ||
| + | def __init__(self): | ||
| + | # interner Speicher für eingegebene Zahlen | ||
| + | self.numbers = [] | ||
| + | |||
| + | def enter_number(self, | ||
| + | # Zahl zur Eingabeliste hinzufügen | ||
| + | self.numbers.append(value) | ||
| + | |||
| + | def add(self): | ||
| + | # Beispiel-Implementierung: | ||
| + | result = sum(self.numbers) | ||
| + | # leert Eingaben für nächsten Vorgang | ||
| + | self.numbers.clear() | ||
| + | return result | ||
| + | </ | ||
| + | |||
| + | </ | ||
| + | </ | ||
| + | |||
| + | **Hinweise: | ||
| + | * Das Modul '' | ||
| + | * Die Datei '' | ||
| + | * Der '' | ||
| + | * Jeder '' | ||
| ===== Tests ausführen ===== | ===== Tests ausführen ===== | ||
| - | Im Terminal | + | Im Terminal: |
| - | ''' | + | < |
| behave | behave | ||
| - | ''' | + | </ |
| - | Ergebnis: | + | Ergebnis |
| < | < | ||
| Feature: Einfacher Taschenrechner | Feature: Einfacher Taschenrechner | ||
| Scenario: Zwei Zahlen addieren | Scenario: Zwei Zahlen addieren | ||
| - | Given ich habe 50 in den Rechner | + | Given ich habe 50 in die App eingegeben |
| - | And ich habe 70 in den Rechner | + | And ich habe 70 in die App eingegeben |
| - | When ich drücke addieren | + | When ich die Additionsfunktion ausführe |
| - | Then sollte das Ergebnis 120 auf dem Bildschirm | + | Then sollte das Ergebnis 120 auf dem Bildschirm |
| 1 feature passed, 0 failed | 1 feature passed, 0 failed | ||
| Zeile 113: | Zeile 158: | ||
| ===== Vorteile von Behave ===== | ===== Vorteile von Behave ===== | ||
| - | * Tests sind **leicht lesbar** für alle Beteiligten | + | * Tests sind **verständlich** für Entwickler: |
| - | * **Klarer Bezug** zu Anforderungen | + | * **Klarer Bezug** zu Anforderungen |
| - | * **Wiederverwendbare Schritte** in Python | + | * Schritte sind **wiederverwendbar** für mehrere Szenarien |
| - | * **Automatisierbar** in CI/ | + | * Einfach |
| ---- | ---- | ||
| ===== Vergleich zu Unit Tests ===== | ===== Vergleich zu Unit Tests ===== | ||
| - | * Aspekt | + | ^ Aspekt |
| - | | Fokus | einzelne Funktion / Klasse | + | | Fokus | einzelne Funktion / Methode |
| | Sprache | Code (Python) | Gherkin (natürliche Sprache) | | | Sprache | Code (Python) | Gherkin (natürliche Sprache) | | ||
| | Zielgruppe | Entwickler: | | Zielgruppe | Entwickler: | ||
| - | | Beispiel | `assert add(2,3)==5` | „Given ich habe 2 und 3, When ich addiere, Then erhalte ich 5“ | | + | | Beispiel | '' |
| ---- | ---- | ||
| Zeile 132: | Zeile 177: | ||
| Installation mit '' | Installation mit '' | ||
| - | ''' | + | < |
| pip install behave | pip install behave | ||
| - | ''' | + | </ |
| ---- | ---- | ||
| Zeile 152: | Zeile 197: | ||
| ---- | ---- | ||
| + | {{tag> | ||
| + | [[https:// | ||