Mi az a BDD tesztelés? Példa keretrendszerre
Mi az a BDD (Behavior Driven Development) tesztelés?
BDD (behavior-driven development) tesztelés az agilis szoftverfejlesztés technikája, és a TDD, azaz a tesztvezérelt fejlesztés kiterjesztése. A BDD-ben a tesztesetek olyan természetes nyelven vannak megírva, amelyet még a nem programozók is el tudnak olvasni.
Hogyan működik a BDD tesztelés?
Vegyük fontolóra, hogy az Átvitel modul létrehozására van kijelölve egy Net Banking alkalmazásban.
Számos módja van a tesztelésnek
- Az átutalásra akkor kerülhet sor, ha elegendő egyenleg van a forrásszámlán
- Az átutalásnak meg kell történnie, ha a rendeltetési légkondicionálás adatai helyesek
- Az átutalásnak akkor kell megtörténnie, ha a felhasználó által megadott tranzakciós jelszó / rsa kód / biztonsági hitelesítés helyes
- Az átutalásnak akkor is meg kell történnie, ha munkaszüneti napról van szó
- Az átutalásnak a számlatulajdonos által meghatározott jövőbeni időpontban kell megtörténnie
A Teszt forgatókönyv kidolgozottabbá és összetettebbé válik, mivel olyan további funkciókat veszünk figyelembe, mint például az X átutalási összeg Y nap/hónap időtartamra , az ütemezés leállítása, amikor a teljes összeg eléri a Z-t stb.
A fejlesztők általános tendenciája a funkciók fejlesztése és a tesztkód későbbi megírása. Amint az a fenti esetből is kitűnik, Teszt eset A fejlesztés ebben az esetben bonyolult, és a fejlesztő elhalasztja Tesztelés kiadásáig, ekkor gyors, de hatástalan tesztelést végez.
A probléma (viselkedésvezérelt fejlesztés) megoldására a BDD-t tervezték. Ez megkönnyíti a teljes tesztelési folyamatot a fejlesztő számára
A BDD-ben bármit is írsz, bele kell menni Adott-Mikor-Akkor lépések. Tekintsük a fenti példát a BDD-ben
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
Nem könnyű írni, olvasni és megérteni? Ez lefedi az összes lehetséges tesztesetet az átutalási modulhoz, és könnyen módosítható, hogy több helyet foglaljon el. Ezenkívül ez inkább olyan, mint az átutalási modul dokumentációjának írása.
Mi az a REST API tesztelés?
Mivel manapság a REST az API-k építésének népszerű stílusává vált, ugyanolyan fontossá vált a REST API tesztesetek automatizálása, valamint az UI tesztesetek. Tehát alapvetően ezek a REST API tesztelés magában foglalja a CRUD (Create-Read-Update-Delete) műveletek tesztelését POST, GET, PUT és DELETE metódusokkal.
Mi a Behave?
A Behave az egyik legnépszerűbb Python BDD teszt keretrendszerek.
Nézzük meg, hogyan működik a Behave:
A funkciófájlokat az Ön üzleti elemzője / szponzora / bárki írja, aki az Ön viselkedési forgatókönyveit tartalmazza. Természetes nyelvi formátummal rendelkezik, amely leír egy jellemzőt vagy annak egy részét a várható eredmények reprezentatív példáival
Ezek a forgatókönyv lépések a beírt lépésmegvalósításokkal vannak leképezve Python.
És opcionálisan van néhány környezetvédelmi vezérlő (a lépések, forgatókönyvek, funkciók vagy a teljes felvételi meccs előtt és után futtatható kód).
Kezdjük az automatizálási tesztkeretrendszerünk beállításával a Behave segítségével:
BDD Testing Framework beállítása Viselkedés bekapcsolva Windows
Telepítés:
- Letöltése és telepítése Python 3 -tól https://www.python.org/
- A telepítési viselkedéshez hajtsa végre a következő parancsot a parancssorban
- pip install viselkedik
- IDE: PyCharm Community Edition-t használtam https://www.jetbrains.com/pycharm/download
Projekt beállítása:
- Hozzon létre egy új projektet
- Hozza létre a következő címtárszerkezetet:
Funkció fájlok:
Tehát készítsük el a szolgáltatásfájlunkat Sample_REST_API_Testing.feature CRUD műveletek végrehajtása a „posta” szolgáltatáson.
Példánkban én használtam http://jsonplaceholder.typicode.com/ minta REST szolgáltatást tesz közzé.
Példa POST forgatókönyv
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
Hasonlóképpen, a fennmaradó forgatókönyveket a következőképpen írhatja le:
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."
A megvalósítás lépései
Mostantól a fenti forgatókönyvekben használt szolgáltatáslépésekhez implementációkat írhat be Python fájlokat a „lépések” könyvtárban.
A Behave keretrendszer azonosítja a Step funkciót a jellemzőfájl predikátumával megegyező dekorátorok által. Például az adott predikátum a Feature file Scenarioban olyan lépésfüggvényt keres, amelynek dekorátora „adott”. Hasonló egyeztetés történik a Mikor és az Akkor is. De a 'De', 'And' Lépés funkció esetén a díszítő ugyanaz, mint az előző lépés. Például, ha az „És” az Adott, akkor a megfelelő lépésfüggvény-dekorátor @adva.
Például, amikor a POST lépése a következőképpen valósítható meg:
@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
Hasonlóképpen, a step python fájl többi lépésének megvalósítása így fog kinézni:
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
A tesztek futtatása
Most végeztünk a tesztszkript fejlesztési részével, ezért futtassuk le a teszteket:
Futtassa a következő parancsot a parancssorban a szolgáltatásfájl futtatásához
C: \Programok\Python\Python37>viselkedj -f szép C:\ \features\feature_files_folder\Sample_REST_API_Testing.feature
Ez a következőképpen jeleníti meg a teszt végrehajtásának eredményeit:
Jelentés megjelenítése a konzolon
Lássunk még egy jó dolgot.
Mivel a felhasználók mindig szívesebben látják a teszteredményeket olvashatóbb és bemutatható formátumban, készítsünk jelentéseket HTML formátumban az Allure segítségével.
Jelentések
Először telepítenie kell az Allure Behave formattert [https://docs.qameta.io/allure-report/]:
És most hajtsa végre a következő parancsot:
A jelentésekhez
>behave -f json -o Sample_REST_API_Testing.feature
> csábító szolgálni
Ez elkészíti a teszteredményekről szóló jelentést a következő reprezentatív és informatív formátumban:
Tesztjelentés HTML formátumban
Tesztjelentés, amely az egyedi forgatókönyv eredményét jeleníti meg
Összegzésként
- A BDD egy viselkedésvezérelt fejlesztés. Ez az agilis szoftverfejlesztés egyik technikája.
- A REST manapság nagyon népszerű API-építési stílus lett, ugyanolyan fontossá vált a REST API tesztesetek automatizálása, valamint az UI tesztesetek.
- A BDD természetes nyelvi formátummal rendelkezik, amely leír egy jellemzőt vagy annak egy részét a várható eredmények reprezentatív példáival
- A Behave keretrendszer azonosítja a Step funkciót a jellemzőfájl predikátumával megegyező dekorátorok által
- Példák BDD tesztelési keretrendszerekre: 1) Cucumber 2) SpecFlow 3) Quantum 4) JBehave 5) Kodecepció