Mitä on BDD-testaus? Kehysesimerkki
Mitä on BDD (Behavior Driven Development) -testaus?
BDD (Behavior-driven Development) -testaus on ketterän ohjelmistokehityksen tekniikka ja se on TDD:n, eli Test Driven Developmentin, laajennus. BDD:ssä testitapaukset kirjoitetaan luonnollisella kielellä, jota myös ei-ohjelmoijat voivat lukea.
Kuinka BDD-testaus toimii?
Oletetaan, että sinut on määrätty luomaan varojen siirtomoduuli verkkopankkisovelluksessa.
On olemassa useita tapoja testata sitä
- Varainsiirto tulee tehdä, jos lähdetilillä on riittävästi saldoa
- Varainsiirto tulee suorittaa, jos kohteen ilmastointitiedot ovat oikein
- Rahansiirron tulee tapahtua, jos tapahtuman salasana / rsa-koodi / suojaustodennus käyttäjän syöttämälle tapahtumalle on oikein
- Rahansiirron tulisi tapahtua, vaikka se olisi pyhäpäivä
- Rahansiirron tulee tapahtua tilinhaltijan määräämänä tulevana päivänä
- Testiskenaario muuttuvat yksityiskohtaisemmiksi ja monimutkaisemmiksi, kun otamme huomioon lisäominaisuudet, kuten siirtosumman X ajanjaksolla Y päivää/kuukautta , pysäyttää aikataulun siirron, kun kokonaissumma saavuttaa Z ja niin edelleen
Kehittäjien yleinen taipumus on kehittää ominaisuuksia ja kirjoittaa testikoodia myöhemmin. Kuten yllä olevasta tapauksesta käy ilmi, Testitapaus Kehitys tässä tapauksessa on monimutkaista ja kehittäjä lykkää Testaus julkaisuun asti, jolloin hän tekee nopean mutta tehottoman testauksen.
Tämän ongelman (Behavior Driven Development) ratkaisemiseksi kehitettiin BDD. Se tekee koko testausprosessin helpoksi kehittäjälle
BDD:ssä kaiken, mitä kirjoitat, on mentävä sisään Annettu-Kun-Sitten askeleet. Tarkastellaan samaa esimerkkiä yllä BDD:ssä
Given that a fund transfer module in net banking application has been developed And I am accessing it with proper authentication
WhenI shall transfer with enough balance in my source account Or I shall transfer on a Bank Holiday Or I shall transfer on a future date And destination a/c details are correct And transaction password/rsa code / security authentication for the transaction is correct And press or click send button
Then amount must be transferred And the event will be logged in log file
Eikö ole helppoa kirjoittaa, lukea ja ymmärtää? Se kattaa kaikki mahdolliset rahastonsiirtomoduulin testitapaukset, ja sitä voidaan helposti muokata lisäämään. Lisäksi se on enemmän kuin dokumenttien kirjoittaminen rahastonsiirtomoduuliin.
Mitä REST API -testaus on?
Koska RESTistä on tullut varsin suosittu API-rakennustyyli nykyään, on tullut yhtä tärkeäksi automatisoida REST API -testitapaukset sekä käyttöliittymätestitapaukset. Eli periaatteessa nämä REST API-testaus sisältää CRUD-toimintojen (Create-Read-Update-Delete) testauksen menetelmillä POST, GET, PUT ja DELETE.
Mikä on Behave?
Behave on yksi suosituimmista Python BDD-testikehykset.
Katsotaanpa, miten Behave toimii:
Ominaisuustiedostot on kirjoittanut liiketoimintaanalyytikkosi / sponsorisi / kuka tahansa, joka sisältää käyttäytymisskenaariot. Siinä on luonnollinen kielimuoto, joka kuvaa ominaisuutta tai ominaisuuden osaa edustavilla esimerkkeillä odotetuista tuloksista
Nämä skenaarion vaiheet on kartoitettu sisäänkirjoitetuilla vaihetoteutuksella Python.
Ja valinnaisesti on olemassa joitain ympäristön säätöjä (koodi, joka suoritetaan ennen ja jälkeen vaiheita, skenaarioita, ominaisuuksia tai koko ammuntaottelun).
Aloitetaan automaatiotestikehyksemme määrittäminen Behaven avulla:
BDD Testing Frameworkin määrittäminen Käyttäydy Windows
Asennus:
- Lataa ja asenna Python 3 alkaen https://www.python.org/
- Suorita seuraava komento komentokehotteessa asentaaksesi toiminnan
- pip asennus käyttäytyy
- IDE: Olen käyttänyt PyCharm Community Editionia https://www.jetbrains.com/pycharm/download
Projektin määritys:
- Luo uusi projekti
- Luo seuraava hakemistorakenne:
Ominaisuustiedostot:
Joten rakennetaan ominaisuustiedostomme Sample_REST_API_Testing.feature jossa on toimintona CRUD-toimintojen suorittaminen "postipalvelussa".
Esimerkissämme olen käyttänyt http://jsonplaceholder.typicode.com/ lähettää näyte REST-palvelusta.
Esimerkki POST-skenaariosta
Scenario: POST post example ->Here we are considering creating new post item using 'posts' service Given: I set post posts API endpoint ->This is prerequisite for the test which is setting URL of posts service When: I set HEADER param request content type as "application/json." And set request body And send POST HTTP request ->This is actual test step of sending a post request Then: Then I receive valid HTPP response code 201 And Response body "POST" is non-empty-> This is verification of response body
Vastaavasti voit kirjoittaa loput skenaariot seuraavasti:
Sample_REST_API_Testing.feature
Feature: Test CRUD methods in Sample REST API testing framework Background: Given I set sample REST API url Scenario: POST post example Given I Set POST posts api endpoint When I Set HEADER param request content type as "application/json." And Set request Body And Send a POST HTTP request Then I receive valid HTTP response code 201 And Response BODY "POST" is non-empty. Scenario: GET posts example Given I Set GET posts api endpoint "1" When I Set HEADER param request content type as "application/json." And Send GET HTTP request Then I receive valid HTTP response code 200 for "GET." And Response BODY "GET" is non-empty Scenario: UPDATE posts example Given I Set PUT posts api endpoint for "1" When I Set Update request Body And Send PUT HTTP request Then I receive valid HTTP response code 200 for "PUT." And Response BODY "PUT" is non-empty Scenario: DELETE posts example Given I Set DELETE posts api endpoint for "1" When I Send DELETE HTTP request Then I receive valid HTTP response code 200 for "DELETE."
Toteutusvaiheet
Nyt voit kirjoittaa toteutuksia yllä olevissa skenaarioissa käytetyille ominaisuusvaiheille Python tiedostoja Steps-hakemistossa.
Behave framework tunnistaa Step-toiminnon sisustajilla, jotka vastaavat ominaisuustiedoston predikaattia. Esimerkiksi annettu predikaatti ominaisuustiedostossa Scenario etsii askelfunktiota, jonka sisustaja on "annettu". Samanlainen vastaavuus tapahtuu Milloin ja Silloin. Mutta 'Mutta', 'Ja' Step-toiminnon tapauksessa sisustaja on sama kuin edellinen vaihe. Esimerkiksi, jos 'And' tulee arvolle Given, vastaava askelfunktion koristelu on @given.
Esimerkiksi, kun POST-vaihe voidaan toteuttaa seuraavasti:
@when (u'I Set HEADER param request content type as "{header_conent_type}"') Mapping of When, here notice “application/json” is been passed from feature file for "{header_conent_type}” . This is called as parameterization def step_impl (context, header_conent_type): This is step implementation method signature request_headers['Content-Type'] = header_conent_type Step implementation code, here you will be setting content type for request header
Samoin muiden vaiheiden toteutus step python -tiedostossa näyttää tältä:
sample_step_implementation.py
from behave import given, when, then, step import requests api_endpoints = {} request_headers = {} response_codes ={} response_texts={} request_bodies = {} api_url=None @given(u'I set sample REST API url') def step_impl(context): global api_url api_url = 'http://jsonplaceholder.typicode.com' # START POST Scenario @given(u'I Set POST posts api endpoint') def step_impl(context): api_endpoints['POST_URL'] = api_url+'/posts' print('url :'+api_endpoints['POST_URL']) @when(u'I Set HEADER param request content type as "{header_conent_type}"') def step_impl(context, header_conent_type): request_headers['Content-Type'] = header_conent_type #You may also include "And" or "But" as a step - these are renamed by behave to take the name of their preceding step, so: @when(u'Set request Body') def step_impl(context): request_bodies['POST']={"title": "foo","body": "bar","userId": "1"} #You may also include "And" or "But" as a step - these are renamed by behave to take the name of their preceding step, so: @when(u'Send POST HTTP request') def step_impl(context): # sending get request and saving response as response object response = requests.post(url=api_endpoints['POST_URL'], json=request_bodies['POST'], headers=request_headers) #response = requests.post(url=api_endpoints['POST_URL'], headers=request_headers) #https://jsonplaceholder.typicode.com/posts # extracting response text response_texts['POST']=response.text print("post response :"+response.text) # extracting response status_code statuscode = response.status_code response_codes['POST'] = statuscode @then(u'I receive valid HTTP response code 201') def step_impl(context): print('Post rep code ;'+str(response_codes['POST'])) assert response_codes['POST'] is 201 # END POST Scenario # START GET Scenario @given(u'I Set GET posts api endpoint "{id}"') def step_impl(context,id): api_endpoints['GET_URL'] = api_url+'/posts/'+id print('url :'+api_endpoints['GET_URL']) #You may also include "And" or "But" as a step - these are renamed by behave to take the name of their preceding step, so: @when(u'Send GET HTTP request') def step_impl(context): # sending get request and saving response as response object response = requests.get(url=api_endpoints['GET_URL'], headers=request_headers) #https://jsonplaceholder.typicode.com/posts # extracting response text response_texts['GET']=response.text # extracting response status_code statuscode = response.status_code response_codes['GET'] = statuscode @then(u'I receive valid HTTP response code 200 for "{request_name}"') def step_impl(context,request_name): print('Get rep code for '+request_name+':'+ str(response_codes[request_name])) assert response_codes[request_name] is 200 @then(u'Response BODY "{request_name}" is non-empty') def step_impl(context,request_name): print('request_name: '+request_name) print(response_texts) assert response_texts[request_name] is not None # END GET Scenario #START PUT/UPDATE @given(u'I Set PUT posts api endpoint for "{id}"') def step_impl(context,id): api_endpoints['PUT_URL'] = api_url + '/posts/'+id print('url :' + api_endpoints['PUT_URL']) @when(u'I Set Update request Body') def step_impl(context): request_bodies['PUT']={"title": "foo","body": "bar","userId": "1","id": "1"} @when(u'Send PUT HTTP request') def step_impl(context): # sending get request and saving response as response object # response = requests.post(url=api_endpoints['POST_URL'], headers=request_headers) #https://jsonplaceholder.typicode.com/posts response = requests.put(url=api_endpoints['PUT_URL'], json=request_bodies['PUT'], headers=request_headers) # extracting response text response_texts['PUT'] = response.text print("update response :" + response.text) # extracting response status_code statuscode = response.status_code response_codes['PUT'] = statuscode #END PUT/UPDATE #START DELETE @given(u'I Set DELETE posts api endpoint for "{id}"') def step_impl(context,id): api_endpoints['DELETE_URL'] = api_url + '/posts/'+id print('url :' + api_endpoints['DELETE_URL']) @when(u'I Send DELETE HTTP request') def step_impl(context): # sending get request and saving response as response object response = requests.delete(url=api_endpoints['DELETE_URL']) # response = requests.post(url=api_endpoints['POST_URL'], headers=request_headers) #https://jsonplaceholder.typicode.com/posts # extracting response text response_texts['DELETE'] = response.text print("DELETE response :" + response.text) # extracting response status_code statuscode = response.status_code response_codes['DELETE'] = statuscode #END DELETE
Testien suorittaminen
Nyt testiskriptien kehitysosa on valmis, joten suoritetaan testimme:
Suorita seuraava komento komentokehotteessa ajaaksesi ominaisuustiedostomme
C: \Ohjelmat\Python\Python37>käyttäydy - kauniisti C:\ \features\feature_files_folder\Sample_REST_API_Testing.feature
Tämä näyttää testin suorittamisen tulokset seuraavasti:
Raportin näyttö konsolissa
Katsotaanpa tässä vielä yksi hieno juttu.
Koska käyttäjät haluavat aina nähdä testitulokset luettavammassa ja esitettävämmässä muodossa, tehdään raportit HTML-muodossa Alluren avulla.
Raportit
Ensin sinun on asennettava Allure Behave formatter [https://docs.qameta.io/allure-report/]:
Ja nyt suorita seuraava komento:
Raportteja varten
>käyttäytyä -f json -o Sample_REST_API_Testing.feature
> houkutteleva palvelee
Tämä luo testitulosraporttisi esitettävässä ja informatiivisessa muodossa, kuten tässä:
Testiraportti HTML-muodossa
Testiraportti, joka näyttää yksittäisen skenaarion tuloksen
Yhteenveto
- BDD on käyttäytymislähtöistä kehitystä. Se on yksi ketterän ohjelmistokehityksen tekniikoista.
- RESTistä on tullut varsin suosittu API-rakennustyyli nykyään, ja on tullut yhtä tärkeäksi automatisoida REST API -testitapaukset sekä käyttöliittymätestit.
- BDD:llä on luonnollisen kielen muoto, joka kuvaa ominaisuutta tai ominaisuuden osaa edustavilla esimerkkeillä odotetuista tuloksista
- Behave framework tunnistaa Step-toiminnon sisustajilla, jotka vastaavat ominaisuustiedoston predikaattia
- Esimerkkejä BDD-testauskehyksistä: 1) Cucumber 2) SpecFlow 3) Quantum 4) JBehave 5) Codeception