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:12] 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 =====
-**Behaviour Driven Development (BDD)** ist eine Weiterentwicklung von **Test Driven Development (TDD)**. +**Behaviour Driven Development (BDD)** ist eine Weiterentwicklung von **Test Driven Development (TDD)**.   
-Beim BDD steht das **Verhalten eines Systems aus Sicht der Benutzer:innen** im Zentrum.+Beim BDD steht das **Verhalten eines Systems aus Sicht der Benutzer:innen** im Zentrum.  
 Tests werden in einer **natürlichen Sprache** formuliert, die von allen verstanden wird — nicht nur von Programmierer:innen. Tests werden in einer **natürlichen Sprache** formuliert, die von allen verstanden wird — nicht nur von Programmierer:innen.
  
-Ein populäres Framework für BDD in Python ist **''behave''**.+Ein populäres Framework für BDD in Python ist **''behave''**.  
 Damit lassen sich **lesbare Akzeptanztests** in einer sogenannten **Gherkin-Syntax** schreiben und mit Python-Code verknüpfen. Damit lassen sich **lesbare Akzeptanztests** in einer sogenannten **Gherkin-Syntax** schreiben und mit Python-Code verknüpfen.
  
----+----
  
 ===== Ziel von BDD ===== ===== Ziel von BDD =====
 +  * Verständliche Tests schreiben, die auch Fachpersonen lesen können  
 +  * Anforderungen und Tests in einer gemeinsamen Sprache beschreiben  
 +  * Entwicklungsschritte von der Benutzerstory bis zum Test automatisieren  
 +  * Früh Feedback erhalten, ob das System das gewünschte Verhalten zeigt
  
-* Verständliche Tests schreiben, die auch Fachpersonen lesen können +----
-* Anforderungen und Tests in einer gemeinsamen Sprache beschreiben +
-* Entwicklungsschritte von der Benutzerstory bis zum Test automatisieren +
-* 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) 
 + ├── features/            <-- hier liegen die BDD-Tests
  │    ├── calculator.feature  │    ├── calculator.feature
  │    └── steps/  │    └── steps/
  │         └── calculator_steps.py  │         └── calculator_steps.py
-```+</code>
  
-* **''.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 
-```+</code>
  
 **Schlüsselwörter:** **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  
  
-* ''Feature'' → beschreibt die Funktion / das Ziel +----
-* ''Scenario'' → einzelner Testfall +
-* ''Given'' → Ausgangslage (Vorbedingungen) +
-* ''When'' → Aktion (was passiert) +
-* ''Then'' → erwartetes Ergebnis +
-* ''And'' / ''But'' → Erweiterungen+
  
----+===== Schrittdefinitionen und getestete App ===== 
 +<WRAP group>
  
-===== Schrittdefinitionen (Step Definitions) ===== +<WRAP half column> 
-Jeder Schritt im Feature wird mit einer Python-Funktion verknüpft.+**Feature Steps (Testcode)**
  
-```python+<code python>
 from behave import given, when, then from behave import given, when, then
 +from app.calculator import Calculator  # zu testende App
  
-@given('ich habe {zahl:d} in den Rechner eingegeben'+@given('ich habe {zahl:d} in die App eingegeben'
-def step_eingabe(context, zahl): +def step_input_number(context, zahl): 
-    if not hasattr(context, "zahlen"): +    # Erstellt (falls nötig) eine neue App-Instanz 
-        context.zahlen [] +    if not hasattr(context, "calc"): 
-    context.zahlen.append(zahl)+        context.calc Calculator() 
 +    context.calc.enter_number(zahl)
  
-@when('ich drücke addieren') +@when('ich die Additionsfunktion ausführe') 
-def step_add(context): +def step_perform_add(context): 
-    context.resultat sum(context.zahlen)+    # Führt die gewünschte Operation aus 
 +    context.result = context.calc.add()
  
-@then('sollte das Ergebnis {erwartet:d} auf dem Bildschirm stehen') +@then('sollte das Ergebnis {expected:d} auf dem Bildschirm erscheinen') 
-def step_pruefen(context, erwartet): +def step_verify_result(context, expected): 
-    assert context.resultat == erwartet +    # Überprüft das sichtbare Resultat der App 
-```+    assert context.result == expected 
 +</code>
  
-**Wichtig:**+</WRAP>
  
-* Der ''context'' ist ein gemeinsames Objekt für alle Schritte eines Szenarios +<WRAP half column> 
-Parameter in geschweiften Klammern ''{zahl:d}'' werden automatisch geparst (z. B. als int)+**App-Code (getestete Anwendung)**
  
----+<code python> 
 +# app/calculator.py 
 + 
 +class Calculator: 
 +    def __init__(self): 
 +        # interner Speicher für eingegebene Zahlen 
 +        self.numbers = [] 
 + 
 +    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 App) zwischen den Schritten.   
 +  * Jeder ''Given/When/Then''-Schritt entspricht einem Teil der Benutzerinteraktion.
  
 ===== Tests ausführen ===== ===== Tests ausführen =====
-Im Terminal im Projektordner:+Im Terminal:
  
-```+<code>
 behave behave
-```+</code>
  
-Ergebnis:+Ergebnis (Auszug):
  
-```+<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
-```+</code>
  
----+----
  
 ===== Vorteile von Behave ===== ===== 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)
  
-* Tests sind **leicht lesbar** für alle Beteiligten +----
-* **Klarer Bezug** zu Anforderungen / User Stories +
-* **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'':
  
-```+<code>
 pip install behave pip install behave
-```+</code>
  
----+----
  
 ===== Typische Fehlerquellen ===== ===== 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''  
  
-* Schrittdefinition fehlt oder Schreibweise weicht ab +----
-* Python-Datei liegt nicht im ''steps/''-Ordner +
-* 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](https://behave.readthedocs.io) +---- 
-* Gherkin-Syntax Referenz: [https://cucumber.io/docs/gherkin/reference/](https://cucumber.io/docs/gherkin/reference/+{{tag>MXXX-LU16e}} 
-* Vergleich zu pytest-bdd: [https://pytest-bdd.readthedocs.io](https://pytest-bdd.readthedocs.io) +[[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]]
- +
---- +
- +
-===== Aufgabe (optional) ===== +
-Erstelle ein eigenes Feature: +
- +
-1Erstelle eine Datei ''temperature.feature'' +
-2. Beschreibe ein Verhalten zum Umrechnen von Celsius in Fahrenheit +
-3. Implementiere die Schrittdefinitionen in Python +
-4. Führe die Tests mit ''behave'' aus+
  
  • modul/m450/learningunits/lu16/behant_python.1761199925.txt.gz
  • Zuletzt geändert: 2025/10/23 08:12
  • von kmaurizi