Help me gedrag-gedreven ontwikkeling (BDD) implementeren voor mijn unittests
description
Door BDD toe te passen, kun je de samenwerking tussen ontwikkelaars en niet-technische belanghebbenden verbeteren, de leesbaarheid van tests vergroten en ervoor zorgen dat je tests beter de gebruikersbehoeften weerspiegelen.
prompt
try_prompt
Help me bij het toepassen van gedrag-gedreven ontwikkeling (BDD) principes voor mijn unittests in de context van mijn project. Mijn projecttype is {{project_type}} en mijn programmeertaal is {{programming_lan ... more
generate_helper
...
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een gids voor het toepassen van gedrag-gedreven ontwikkeling (BDD) principes bij het schrijven van unittests voor jouw Python webapplicatie:
1. Gebruikersverhalen schrijven
Een gebruikersverhaal beschrijft de functionaliteit vanuit het perspectief van de gebruiker. Het volgt meestal een structuur zoals:
**Als** [type gebruiker], **wil ik** [actie of functionaliteit], **zodat** [voordeel of reden].
**Voorbeeld:**
*Als ingelogde gebruiker wil ik mijn profielgegevens kunnen bekijken, zodat ik mijn persoonlijke gegevens kan controleren.*
2. Acceptatiecriteria definiëren
Deze criteria specificeren de condities waaronder het gebruikersverhaal als voltooid wordt beschouwd. Ze helpen bij het schrijven van gerichte tests. Ze worden vaak geformuleerd als concrete gedragsverwachtingen, bijvoorbeeld in Given-When-Then formaat:
- **Given** de gebruiker is ingelogd
- **And** de gebruiker heeft profielgegevens ingevuld
- **When** de gebruiker navigeert naar de profielpagina
- **Then** worden de juiste gegevens weergegeven
3. Vertalen naar unittests volgens BDD-principes
Gebruik frameworks die BDD ondersteunen, zoals:
- **Behave**
- **pytest-bdd**
- **pytest** met aangepaste structuur
**Stappen:**
- Schrijf scenario’s in Gherkin syntax (Given-When-Then).
- Implementeer de stappen als Python functies.
- Koppel ze aan je applicatiecode, zodat de tests het gedrag verifiëren.
**Voorbeeld in pytest-bdd:**
```gherkin
# features/profiel_bekijken.feature
Feature: Profielgegevens bekijken
Als ingelogde gebruiker
Wil ik mijn profielgegevens kunnen bekijken
Zodat ik mijn persoonlijke gegevens kan controleren
Scenario: Gebruiker bekijkt profielgegevens
Given de gebruiker is ingelogd
When de gebruiker navigeert naar de profielpagina
Then worden de profielgegevens weergegeven
```
```python
# test_profiel.py
from pytest_bdd import scenarios, given, when, then
from myapp import app, get_user_profile
scenarios('profiel_bekijken.feature')
@given('de gebruiker is ingelogd')
def gebruiker_ingelogd():
# Log in de gebruiker in, bijvoorbeeld door een testclient
pass
@when('de gebruiker navigeert naar de profielpagina')
def navigeer_naar_profiel():
# Simuleer navigatie
pass
@then('worden de profielgegevens weergegeven')
def profielgegevens_weergeven():
profile = get_user_profile()
assert profile is not None
assert 'naam' in profile
```
4. Samenvatting
- **Schrijf gebruikersverhalen** in begrijpelijke taal, vanuit gebruikersperspectief.
- **Definieer duidelijke acceptatiecriteria** in Given-When-Then structuur.
- **Gebruik een BDD-framework** zoals pytest-bdd of Behave om deze criteria te vertalen in tests.
- **Implementeer de tests** en zorg dat ze de beoogde gedragingen verifiëren.
Door deze aanpak krijg je tests die niet alleen controleren of code werkt, maar ook of het gedrag overeenkomt met de verwachtingen van de gebruikers.
provider: deepseek
model: deepseek-chat
Zeker! Ik help je graag met het toepassen van Behavior-Driven Development (BDD) principes voor je Python webapplicatie. Hier is een stapsgewijze begeleiding:
## 1. Gebruikersverhalen schrijven (User Stories)
Gebruik het format: **"Als een [rol], wil ik [functionaliteit], zodat [waarde]"**
**Voorbeelden voor een webapplicatie:**
- "Als een ingelogde gebruiker, wil ik mijn profielgegevens kunnen bijwerken, zodat ik mijn huidige informatie kan aanpassen"
- "Als een bezoeker, wil ik me kunnen registreren, zodat ik toegang krijg tot alle functies"
- "Als een administrator, wil ik gebruikers kunnen beheren, zodat ik de applicatie goed kan onderhouden"
## 2. Acceptatiecriteria definiëren
Gebruik het **Given-When-Then** format voor elke user story:
**Voorbeeld: Gebruikersregistratie**
```
Scenario: Succesvolle registratie
Given een bezoeker op de registratiepagina
When hij geldige gegevens invult (email, wachtwoord, bevestiging)
Then wordt een nieuw account aangemaakt
And ontvangt hij een bevestigingsemail
And wordt hij doorgestuurd naar het dashboard
Scenario: Registratie met ongeldige email
Given een bezoeker op de registratiepagina
When hij een ongeldig emailadres invult
Then krijgt hij een foutmelding "Ongeldig emailadres"
And blijft hij op de registratiepagina
```
## 3. BDD Frameworks voor Python
### Behave (Aanbevolen)
```bash
pip install behave
```
**Directory structuur:**
```
features/
├── environment.py
├── steps/
│ └── registration_steps.py
└── registration.feature
```
**Voorbeeld feature file (`registration.feature`):**
```gherkin
Feature: Gebruikersregistratie
Als niet-ingelogde bezoeker
Wil ik me kunnen registreren
Zodat ik de applicatie kan gebruiken
Scenario: Succesvolle registratie
Given ik op de registratiepagina ben
When ik registreer met email "test@voorbeeld.nl" en wachtwoord "VeiligWachtwoord123"
Then moet ik een succesmelding zien
And moet ik een bevestigingsemail ontvangen
```
**Step definitions (`steps/registration_steps.py`):**
```python
from behave import given, when, then
from myapp import create_app, db
from myapp.models import User
@given('ik op de registratiepagina ben')
def step_op_registratiepagina(context):
context.client = create_app().test_client()
context.response = context.client.get('/registreer')
@when('ik registreer met email "{email}" en wachtwoord "{wachtwoord}"')
def step_registreer_met_gegevens(context, email, wachtwoord):
context.response = context.client.post('/registreer', data={
'email': email,
'wachtwoord': wachtwoord,
'wachtwoord_bevestiging': wachtwoord
})
@then('moet ik een succesmelding zien')
def step_controleer_succesmelding(context):
assert 'Registratie succesvol' in context.response.get_data(as_text=True)
@then('moet ik een bevestigingsemail ontvangen')
def step_controleer_email(context):
# Controleer of email is verzonden
assert context.email_service.last_email is not None
```
### Pytest-BDD
```bash
pip install pytest-bdd
```
**Voorbeeld test:**
```python
# test_registration.py
from pytest_bdd import scenarios, given, when, then
from myapp import create_app
scenarios('registration.feature')
@given('ik op de registratiepagina ben')
def op_registratiepagina():
app = create_app()
client = app.test_client()
return client.get('/registreer')
@when('ik registreer met email "<email>" en wachtwoord "<wachtwoord>"')
def registreer_met_gegevens(op_registratiepagina, email, wachtwoord):
client = op_registratiepagina
return client.post('/registreer', data={
'email': email,
'wachtwoord': wachtwoord
})
```
## 4. Vertaling naar Unittests
**Traditionele unittest voorbeeld:**
```python
import unittest
from myapp import create_app, db
from myapp.models import User
class TestUserRegistration(unittest.TestCase):
def setUp(self):
self.app = create_app()
self.client = self.app.test_client()
self.app_context = self.app.app_context()
self.app_context.push()
db.create_all()
def tearDown(self):
db.session.remove()
db.drop_all()
self.app_context.pop()
def test_successful_registration(self):
# Given - initiële staat
response = self.client.get('/registreer')
self.assertEqual(response.status_code, 200)
# When - actie uitvoeren
response = self.client.post('/registreer', data={
'email': 'test@voorbeeld.nl',
'wachtwoord': 'VeiligWachtwoord123',
'wachtwoord_bevestiging': 'VeiligWachtwoord123'
})
# Then - verwachte resultaten
self.assertEqual(response.status_code, 302) # Redirect
user = User.query.filter_by(email='test@voorbeeld.nl').first()
self.assertIsNotNone(user)
self.assertTrue(user.check_password('VeiligWachtwoord123'))
```
## 5. Best Practices
1. **Schrijf tests eerst**: Begin met BDD scenarios voordat je code schrijft
2. **Gebruik duidelijke taal**: Houd steps begrijpelijk voor niet-technische stakeholders
3. **Test edge cases**: Denk aan foutscenario's en randgevallen
4. **Houd tests geïsoleerd**: Elke test moet onafhankelijk kunnen draaien
5. **Combineer BDD met TDD**: Gebruik BDD voor acceptatietesten en TDD voor unit tests
## 6. Aanvullende tools
- **Allure**: Voor gedetailleerde testrapportage
- **Selenium**: Voor end-to-end browser tests
- **Factory Boy**: Voor test data creation
- **Faker**: Voor realistische testdata
Begin met kleine features en breid geleidelijk uit. BDD helpt je niet alleen met testen, maar ook om duidelijker te communiceren over functionaliteiten met je team!

