Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
modul:m450:learningunits:lu16:behant_python [2025/10/23 08:10] – [Aufbau eines Behave-Projekts] kmaurizimodul:m450:learningunits:lu16:behant_python [2025/10/23 09:34] (aktuell) – [Vergleich zu Unit Tests] kmaurizi
Zeile 1: Zeile 1:
-====== 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: Eine kleine App =====
 +Stell dir vor, du entwickelst eine kleine **Applikation**, z. B. einen **Rechner**, der einfache Operationen (Addition, Subtraktion usw.) ausführt.  
 +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:innen verhalten *sollte*.
  
 ---- ----
  
 ===== Aufbau eines Behave-Projekts ===== ===== Aufbau eines Behave-Projekts =====
-Ein Behave-Projekt besteht aus folgenden Ordnern und Dateien+Ein Behave-Projekt ist typischerweise so aufgebaut
-'''+ 
 +<code>
 project/ project/
-├── features/ + ├── app/                 <-- hier liegt der Quellcode der App (z. B. calculator.py) 
-│ ├── calculator.feature + ├── features/            <-- hier liegen die BDD-Tests 
-│ └── steps/ + │    ├── calculator.feature 
-│ └── calculator_steps.py + │    └── steps/ 
-''' + │         └── calculator_steps.py 
-perl +</code>
-Code kopieren+
  
   * **''.feature''-Dateien** enthalten Szenarien in Gherkin-Sprache     * **''.feature''-Dateien** enthalten Szenarien in Gherkin-Sprache  
   * **''.py''-Dateien** im Unterordner ''steps/'' enthalten die Python-Schritte dazu     * **''.py''-Dateien** im Unterordner ''steps/'' enthalten die Python-Schritte dazu  
 +  * Das App-Modul (''app/calculator.py'') ist die **getestete Anwendung**  
  
 ---- ----
  
 ===== Gherkin-Syntax ===== ===== Gherkin-Syntax =====
-Gherkin ist eine einfache Sprache, um Verhalten zu beschreiben.   +Gherkin ist eine leicht lesbare Sprache, um das gewünschte Verhalten eines Systems zu beschreiben.   
-Jede Datei beschreibt ein **Feature** (eine Funktion oder Benutzerstory).+Jede Feature-Datei beschreibt **eine Funktionalität** oder **Benutzerstory**.
  
 Beispiel: Beispiel:
  
-```gherkin+<code>
 Feature: Einfacher Taschenrechner Feature: Einfacher Taschenrechner
-  Um einfache Rechnungen zu machen+  Um einfache Rechnungen durchführen zu können
   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 eingegeben +    Given ich habe 50 in die App eingegeben 
-    And ich habe 70 in den Rechner eingegeben +    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 stehen +    Then sollte das Ergebnis 120 auf dem Bildschirm erscheinen 
-Schlüsselwörter:+</code>
  
-''Feature'' → beschreibt die Funktion / das Ziel+**Schlüsselwörter:** 
 +  * ''Feature'' → beschreibt die Funktion / das Ziel   
 +  * ''Scenario'' → einzelner Testfall   
 +  * ''Given'' → Ausgangslage (Vorbedingungen)   
 +  * ''When'' → Aktion (was passiert)   
 +  * ''Then'' → erwartetes Ergebnis   
 +  * ''And'' / ''But'' → Erweiterungen  
  
-''Scenario'' → einzelner Testfall+----
  
-''Given'' → Ausgangslage (Vorbedingungen)+===== Schrittdefinitionen und getestete App ===== 
 +<WRAP group>
  
-''When'' → Aktion (was passiert)+<WRAP half column> 
 +**Feature Steps (Testcode)**
  
-''Then'' → erwartetes Ergebnis+<code python> 
 +from behave import given, when, then 
 +from app.calculator import Calculator  # zu testende App
  
-''And'' / ''But'' → Erweiterungen+@given('ich habe {zahl:d} in die App eingegeben'
 +def step_input_number(context, zahl): 
 +    # Erstellt (falls nötig) eine neue App-Instanz 
 +    if not hasattr(context, "calc"): 
 +        context.calc = Calculator() 
 +    context.calc.enter_number(zahl)
  
-===== Schrittdefinitionen (Step Definitions===== +@when('ich die Additionsfunktion ausführe'
-Jeder Schritt im Feature wird mit einer Python-Funktion verknüpft.+def step_perform_add(context): 
 +    # Führt die gewünschte Operation aus 
 +    context.result = context.calc.add()
  
-python +@then('sollte das Ergebnis {expected:d} auf dem Bildschirm erscheinen') 
-Code kopieren +def step_verify_result(contextexpected): 
-from behave import givenwhen, then+    # Überprüft das sichtbare Resultat der App 
 +    assert context.result == expected 
 +</code>
  
-@given('ich habe {zahl:d} in den Rechner eingegeben'+</WRAP>
-def step_eingabe(context, zahl): +
-    if not hasattr(context, "zahlen"): +
-        context.zahlen = [] +
-    context.zahlen.append(zahl)+
  
-@when('ich drücke addieren'+<WRAP half column> 
-def step_add(context): +**App-Code (getestete Anwendung)**
-    context.resultat = sum(context.zahlen)+
  
-@then('sollte das Ergebnis {erwartet:d} auf dem Bildschirm stehen') +<code python> 
-def step_pruefen(context, erwartet): +# app/calculator.py
-    assert context.resultat == erwartet +
-Wichtig:+
  
-Der ''context'' ist ein gemeinsames Objekt für alle Schritte eines Szenarios+class Calculator: 
 +    def __init__(self): 
 +        # interner Speicher für eingegebene Zahlen 
 +        self.numbers = []
  
-Parameter in geschweiften Klammern ''{zahl:d}'' werden automatisch geparst (z. B. als int)+    def enter_number(self, value): 
 +        # Zahl zur Eingabeliste hinzufügen 
 +        self.numbers.append(value) 
 + 
 +    def add(self): 
 +        # Beispiel-Implementierung: summiert alle Werte 
 +        result = sum(self.numbers) 
 +        # leert Eingaben für nächsten Vorgang 
 +        self.numbers.clear() 
 +        return result 
 +</code> 
 + 
 +</WRAP> 
 +</WRAP> 
 + 
 +**Hinweise:** 
 +  * Das Modul ''calculator.py'' ist die **zu testende Applikation**, nicht Teil des Tests selbst.   
 +  * Die Datei ''calculator_steps.py'' beschreibt nur das **erwartete Verhalten**.   
 +  * Der ''context'' erlaubt den Austausch von Objekten (z. B. der Appzwischen den Schritten.   
 +  * Jeder ''Given/When/Then''-Schritt entspricht einem Teil der Benutzerinteraktion.
  
 ===== Tests ausführen ===== ===== Tests ausführen =====
-Im Terminal im Projektordner:+Im Terminal:
  
-nginx +<code>
-Code kopieren+
 behave behave
-Ergebnis:+</code>
  
-vbnet +Ergebnis (Auszug): 
-Code kopieren+ 
 +<code>
 Feature: Einfacher Taschenrechner Feature: Einfacher Taschenrechner
   Scenario: Zwei Zahlen addieren   Scenario: Zwei Zahlen addieren
-    Given ich habe 50 in den Rechner eingegeben +    Given ich habe 50 in die App eingegeben 
-    And ich habe 70 in den Rechner eingegeben +    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 stehen+    Then sollte das Ergebnis 120 auf dem Bildschirm erscheinen
  
 1 feature passed, 0 failed 1 feature passed, 0 failed
-===== Vorteile von Behave =====+</code>
  
-Tests sind leicht lesbar für alle Beteiligten+----
  
-Klarer Bezug zu Anforderungen / User Stories+===== Vorteile von Behave ===== 
 +  * Tests sind **verständlich** für Entwickler:innen und Fachpersonen   
 +  * **Klarer Bezug** zu Anforderungen oder Benutzerstories   
 +  * Schritte sind **wiederverwendbar** für mehrere Szenarien   
 +  * Einfach **automatisierbar** in CI/CD-Pipelines (z. B. GitHub Actions, Jenkins)
  
-Wiederverwendbare Schritte in Python +----
- +
-Automatisierbar in CI/CD-Pipelines (z. B. GitHub Actions, Jenkins)+
  
 ===== Vergleich zu Unit Tests ===== ===== Vergleich zu Unit Tests =====
 +^ Aspekt ^ Unit Test ^ BDD (Behave) ^
 +| Fokus | einzelne Funktion / Methode | Verhalten aus Nutzersicht |
 +| Sprache | Code (Python) | Gherkin (natürliche Sprache) |
 +| Zielgruppe | Entwickler:innen | Fachpersonen + Entwickler:innen |
 +| Beispiel | ''assert add(2,3)==5'' | „Given ich habe 2 und 3 eingegeben, When ich addiere, Then erhalte ich 5“ |
  
-Aspekt Unit Test BDD (Behave) +----
-Fokus einzelne Funktion / Klasse Verhalten aus Nutzersicht +
-Sprache Code (Python) Gherkin (natürliche Sprache) +
-Zielgruppe Entwickler:innen Fachpersonen + Entwickler:innen +
-Beispiel assert add(2,3)==5 „Given ich habe 2 und 3, When ich addiere, Then erhalte ich 5“+
  
 ===== Installation ===== ===== Installation =====
 Installation mit ''pip'': Installation mit ''pip'':
  
-nginx +<code>
-Code kopieren+
 pip install behave pip install behave
-===== Typische Fehlerquellen =====+</code>
  
-Schrittdefinition fehlt oder Schreibweise weicht ab+----
  
-Python-Datei liegt nicht im ''steps/''-Ordner+===== Typische Fehlerquellen ===== 
 +  * Schrittdefinition fehlt oder Schreibweise weicht ab   
 +  * Python-Datei liegt nicht im ''steps/''-Ordner   
 +  * Context-Variable nicht initialisiert   
 +  * Feature-Datei hat keine Endung ''.feature''  
  
-Context-Variable nicht initialisiert +----
- +
-Feature-Datei hat keine Endung ''.feature''+
  
 ===== Weiterführende Links ===== ===== Weiterführende Links =====
 +  * Offizielle Dokumentation: https://behave.readthedocs.io  
 +  * Gherkin-Syntax Referenz: https://cucumber.io/docs/gherkin/reference/  
 +  * Vergleich zu pytest-bdd: https://pytest-bdd.readthedocs.io  
  
-Offizielle Dokumentation: https://behave.readthedocs.io +---- 
- +{{tag>MXXX-LU16e}} 
-Gherkin-Syntax Referenz: https://cucumber.io/docs/gherkin/reference/ +[[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]]
- +
-Vergleich zu pytest-bdd: https://pytest-bdd.readthedocs.io +
- +
-===== Aufgabe (optional) ===== +
-Erstelle ein eigenes Feature: +
- +
-Erstelle eine Datei ''temperature.feature'' +
- +
-Beschreibe ein Verhalten zum Umrechnen von Celsius in Fahrenheit +
- +
-Implementiere die Schrittdefinitionen in Python +
- +
-Führe die Tests mit ''behave'' aus +
- +
-yaml +
-Code kopieren +
- +
----+
  
-Möchtest du, dass ich daraus gleich noch eine **zweite DokuWiki-Seite für pytest-bdd** (Alternative mit pytest) erstelle, damit du sie als Vergleich oder Ergänzung in deinem Unterricht einsetzen kannst? 
  • modul/m450/learningunits/lu16/behant_python.1761199818.txt.gz
  • Zuletzt geändert: 2025/10/23 08:10
  • von kmaurizi