Mis on BDD testimine? Raamistiku näide
Mis on BDD (Behavior Driven Development) testimine?
BDD (Behavior-driven development) testimine on agiilse tarkvaraarenduse tehnika ja see on TDD laiendus, st Test Driven Development. BDD-s on testjuhtumid kirjutatud loomulikus keeles, mida saavad lugeda ka mitteprogrammeerijad.
Kuidas BDD testimine töötab?
Oletagem, et olete ülesandeks luua Internetipanga rakenduses rahaülekande moodul.
Selle testimiseks on mitu võimalust
- Rahaülekanne peaks toimuma, kui lähtekontol on piisavalt saldot
- Rahaülekanne peaks toimuma juhul, kui sihtkoha kliimaseadme andmed on õiged
- Rahaülekanne peaks toimuma juhul, kui kasutaja sisestatud tehingu parool / rsa kood / turvaautentimine on õige
- Rahaülekanne peaks toimuma isegi siis, kui see on pangapüha
- Rahaülekanne peaks toimuma kontoomaniku määratud kuupäeval tulevikus
. Testi stsenaarium muutuvad keerukamaks ja keerukamaks, kuna arvestame lisafunktsioone, nagu ülekandesumma X intervalliga Y päeva/kuud , ülekande ajakava peatamine, kui kogusumma jõuab Z jne.
Arendajate üldine tendents on hiljem funktsioone arendada ja testkoodi kirjutada. Nagu ülaltoodud juhtumist ilmneb, Testjuhtum selle juhtumi arendamine on keeruline ja arendaja lükkab edasi Testimine vabastamiseni, siis teeb ta kiire, kuid ebatõhusa testimise.
Selle probleemi (käitumisest juhitud arendus) ületamiseks töötati välja BDD. See muudab kogu testimisprotsessi arendaja jaoks lihtsaks
BDD-s peab kõik, mida kirjutate, minema Antud-Millal-Siis sammud. Vaatleme sama näidet ülaltoodud BDD-s
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
Kas pole lihtne kirjutada, lugeda ja aru saada? See hõlmab kõiki võimalikke rahaülekande mooduli testjuhtumeid ja seda saab hõlpsasti muuta, et mahutada rohkem. Samuti on see rohkem nagu rahaülekande mooduli dokumentatsiooni kirjutamine.
Mis on REST API testimine?
Kuna REST on tänapäeval muutunud üsna populaarseks API-de ehitamise stiiliks, on sama oluliseks muutunud REST API testjuhtumite automatiseerimine koos kasutajaliidese testjuhtumitega. Nii et põhimõtteliselt need REST API testimine hõlmab CRUD (Loo-Loe-Uuenda-Kustuta) toimingute testimist vastavalt meetoditega POST, GET, PUT ja DELETE.
Mis on Behave?
Käitumine on üks populaarsemaid Python BDD testi raamistikud.
Vaatame, kuidas Behave toimib:
Funktsioonifailid on kirjutanud teie ärianalüütik/sponsor/kes iganes teie käitumisstsenaariumitega. Sellel on loomuliku keele vorming, mis kirjeldab funktsiooni või funktsiooni osa koos eeldatavate tulemuste tüüpiliste näidetega
Need stsenaariumi sammud on kaardistatud sisse kirjutatud sammurakendustega Python.
Ja valikuliselt on olemas mõned keskkonnajuhtimiselemendid (kood, mida käivitada enne ja pärast samme, stsenaariume, funktsioone või kogu võttematši).
Alustame oma automatiseerimistesti raamistiku seadistamisega Behave'iga:
BDD testimise raamistiku seadistamine Käitu sisse Windows
Paigaldus:
- Last ned og installer Python 3 alates https://www.python.org/
- Käivitage installikäitumiseks käsureal järgmine käsk
- pip install käituma
- IDE: olen kasutanud PyCharm Community Editioni https://www.jetbrains.com/pycharm/download
Projekti seadistamine:
- Looge uus projekt
- Looge järgmine kataloogistruktuur:
Funktsioonifailid:
Nii et koostame oma funktsioonifaili Sample_REST_API_Testing.feature millel on funktsioon CRUD toimingute sooritamine "postituste" teenuses.
Meie näites olen kasutanud http://jsonplaceholder.typicode.com/ postitusi näidis REST Service.
POST-i stsenaariumi näide
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
Samamoodi saate ülejäänud stsenaariumid kirjutada järgmiselt.
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."
Rakendamise sammud
Nüüd saate ülaltoodud stsenaariumides kasutatud funktsioonide sammude jaoks rakendused sisse kirjutada Python failid kataloogis "sammud".
Käitumise raamistik tuvastab funktsiooni Step funktsiooni dekoraatorite poolt, mis sobivad funktsioonifaili predikaadiga. Näiteks otsib Antud predikaat funktsioonifailis Scenario sammufunktsiooni, mille dekoraator on „antud”. Sarnane sobitamine toimub ka Millal ja Siis. Kuid funktsioon „Aga” „Ja” võtab dekoraatori sama, mis eelmine samm. Näiteks kui 'And' on antud, on sobiva sammufunktsiooni dekoraator @given.
Näiteks kui POST-i sammu saab rakendada järgmiselt:
@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
Samamoodi näeb step pythoni faili muude sammude rakendamine välja järgmine:
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
Testide käivitamine
Nüüd oleme oma testskripti arendamise osaga valmis, nii et käivitame oma testid:
Meie funktsioonifaili käivitamiseks käivitage käsureal järgmine käsk
C: \Programmid\Python\Python37>käitu -f ilus C:\ \features\feature_files_folder\Sample_REST_API_Testing.feature
See kuvab testi täitmise tulemused järgmiselt:
Aruande kuva konsoolil
Vaatame siin veel üht lahedat asja.
Kuna kasutajad eelistavad alati näha testitulemusi loetavamal ja esitletavamal kujul, siis olgu Allure abiga aruanded HTML-vormingus.
Aruanded
Esiteks peate installima Allure Behave'i vormindaja [https://docs.qameta.io/allure-report/]:
Ja nüüd käivitage järgmine käsk:
Aruannete jaoks
>käituma -f json -o Sample_REST_API_Testing.feature
> ahvatlev teenida
See loob teie testitulemuste aruande esinduslikus ja informatiivses vormingus, näiteks järgmiselt:
Testi aruanne HTML-vormingus
Testiaruanne, mis kuvab individuaalse stsenaariumi tulemuse
kokkuvõte
- BDD on käitumispõhine arendus. See on üks agiilse tarkvaraarenduse tehnikaid.
- REST on muutunud tänapäeval üsna populaarseks API-de ehitamise stiiliks, sama oluliseks on muutunud REST API testjuhtumite automatiseerimine koos kasutajaliidese testjuhtumitega.
- BDD-l on loomuliku keele vorming, mis kirjeldab funktsiooni või funktsiooni osa koos eeldatavate tulemuste tüüpiliste näidetega
- Käitumise raamistik tuvastab funktsiooni Step funktsiooni dekoraatorite poolt, mis sobivad funktsioonifaili predikaadiga
- BDD testimisraamistike näited: 1) Cucumber 2) SpecFlow 3) Quantum 4) JBehave 5) Kodseptsioon