„Behavior-Driven Development“ (BDD) „REST“ API testavimas naudojant „Behave“

Kas yra BDD testavimas?

BDD (elgesiu pagrįstas kūrimas) testavimas yra judrios programinės įrangos kūrimo technika ir yra TDD pratęsimas, ty bandomasis kūrimas. BDD bandomieji atvejai rašomi natūralia kalba, kurią gali skaityti net ne programuotojai.

Šioje BDD pamokoje pamatysime REST API BDD testavimą su „Behave“ ir „Python“

  • Kaip veikia BDD testavimas?
  • Kas yra REST API testavimas?
  • Kas yra elgesys?
  • „Behave Test“ sistemos nustatymas sistemoje „Windows“:
  • POST scenarijaus pavyzdys:
  • Žingsniai įgyvendinimas
  • Testų vykdymas:
  • Ataskaitos

Kaip veikia BDD testavimas?

Apsvarstykite, ar esate paskirtas sukurti lėšų pervedimo modulį internetinės bankininkystės programoje.

Yra keli būdai tai išbandyti

  1. Lėšų pervedimas turėtų įvykti, jei šaltinio sąskaitoje yra pakankamai balanso
  2. Lėšų pervedimas turėtų įvykti, jei tikslūs oro kondicionieriaus duomenys yra teisingi
  3. Lėšų pervedimas turėtų įvykti, jei operacijos slaptažodis / RSA kodas / vartotojo autentifikuotas operacijos saugumo patvirtinimas yra teisingas
  4. Lėšų pervedimas turėtų vykti, net jei tai yra banko atostogos
  5. Lėšų pervedimas turėtų įvykti sąskaitos savininko nustatyta būsima diena

Testo scenarijus tampa vis sudėtingesnis ir sudėtingesnis, nes mes svarstome papildomas funkcijas, tokias kaip X suma per Y dienas / mėnesius, sustabdyti tvarkaraščio perkėlimą, kai visa suma pasiekia Z ir pan.

Bendra kūrėjų tendencija yra kurti funkcijas ir vėliau parašyti testo kodą. Kaip matyti iš ankstesnio atvejo, bandomojo atvejo kūrimas šiuo atveju yra sudėtingas ir kūrėjas atidės testavimą iki išleidimo, tada jis atliks greitą, bet neveiksmingą testavimą.

Norėdami išspręsti šią problemą (elgesio skatinamas vystymasis), buvo sukurtas BDD. Tai palengvina visą testavimo procesą kūrėjui

BDD, kad ir ką parašytumėte, reikia pereiti į duotus kada-tada veiksmus. Panagrinėkime tą patį aukščiau pateiktą pavyzdį BDD

Atsižvelgiant į tai, kad internetinės bankininkystės programoje buvo sukurtas lėšų pervedimo modulisIr aš prieinu prie jo tinkamai patvirtindamas
Kai turėsiu pervesti turėdamas pakankamai likučio šaltinio sąskaitojeArba pervesiu per banko atostogasArba pervesiu ateityjeO paskirties / c informacija yra teisingaOperacijos slaptažodis / rsa kodas / operacijos saugumo patvirtinimas yra teisingiIr paspauskite arba spustelėkite siųsti mygtuką
Tada suma turi būti pervestaIr įvykis bus užregistruotas žurnalo faile

Ar nėra lengva rašyti, skaityti ir suprasti? Jis apima visus įmanomus lėšų pervedimo modulio bandymo atvejus ir gali būti lengvai modifikuojamas, kad tilptų daugiau. Be to, tai labiau panašu į lėšų pervedimo modulio dokumentų rašymą.

Kas yra REST API testavimas?

Kadangi REST šiais laikais tapo gana populiariu API kūrimo stiliumi, ne mažiau svarbu tapo automatizuoti REST API testavimo atvejus kartu su vartotojo sąsajos testavimo atvejais. Taigi iš esmės šie REST API testai apima CRUD („Create-Read-Update-Delete-Delete“) veiksmų testavimą atitinkamai naudojant metodus POST, GET, PUT ir DELETE.

Kas yra elgesys?

„Behave“ yra viena iš populiarių „Python BDD“ testavimo sistemų.

Pažiūrėkime, kaip veikia „Behave“:

Funkcijų failus rašo jūsų verslo analitikas / rėmėjas / tas, kuris pateikia jūsų elgesio scenarijus. Jis turi natūralų kalbos formatą, apibūdinantį ypatybę ar jos dalį su tipiškais laukiamų rezultatų pavyzdžiais

Šie scenarijaus veiksmai yra susieti su „Python“ parašytais žingsnių diegimais

Pasirinktinai yra keletas aplinkos kontrolės elementų (kodas, kurį reikia paleisti prieš ir po žingsnių, scenarijai, funkcijos ar visos šaudymo rungtynės).

Pradėkime nuo automatikos testavimo sistemos nustatymo su „Behave“:

„Behave Test“ sistemos nustatymas sistemoje „Windows“:

Diegimas:

  • Atsisiųskite ir įdiekite „Python 3“ iš https://www.python.org/
  • Norėdami įdiegti, vykdykite šią komandų komandų eilutės komandą
  • pip install elgtis
  • IDE: naudojau „PyCharm“ bendruomenės leidimą https://www.jetbrains.com/pycharm/download

Projekto sąranka:

  • Sukurkite naują projektą
  • Sukurkite šią katalogo struktūrą:

Funkcijų failai:

Taigi sukurkime savo funkcijų failą „ Sample_REST_API_Testing.feature“, turintį funkciją kaip „CRUD“ operacijų atlikimas tarnyboje „posts“.

Mūsų pavyzdyje naudojau http://jsonplaceholder.typicode.com/ posts REST Service pavyzdį.

POST scenarijaus pavyzdys:

Scenarijus: POST post pavyzdys -> Čia mes svarstome galimybę sukurti naują postą naudodamiesi paslauga „posts“Atsižvelgiant į tai: Aš nustatiau pranešimų API galutinį tašką -> Tai būtina sąlyga bandymui, kuris nustato pranešimų tarnybos URLKada: Aš nustatau „HEADER param“ užklausos turinio tipą kaip „application / json“.Ir nustatykite prašymo turinįIr išsiųskite POST HTTP užklausą -> tai yra tikrasis bandomasis pranešimas siunčiant užklausąTada: Tada gaunu galiojantį HTPP atsakymo kodą 201„Response body“ „POST“ nėra tuščias-> Tai yra atsakymo teksto patvirtinimas

Panašiai likusius scenarijus galite parašyti taip:

Sample_REST_API_Testing.feature

Funkcija: išbandykite CRUD metodus pavyzdinėje REST API testavimo sistemojePagrindas:Atsižvelgdama į tai, aš nustatiau pavyzdį REST API URLScenarijus: POST įrašo pavyzdysAtsižvelgiant į tai, kad aš nustatau POST įrašų api galinį taškąKai nustatau „HEADER param“ užklausos turinio tipą kaip „application / json“.Ir nustatykite užklausos turinįIr išsiųskite POST HTTP užklausąTada gaunu galiojantį HTTP atsakymo kodą 201„Response BODY“ „POST“ nėra tuščias.Scenarijus: GET žinučių pavyzdysAtsižvelgiant į tai, kad aš nustatau GET įrašų api galinį tašką „1“Kai nustatau „HEADER param“ užklausos turinio tipą kaip „application / json“.Ir siųsti Gauti HTTP užklausąTada gaunu galiojantį HTTP atsakymo kodą „GET“.„Response BODY“ GET “nėra tuščiasScenarijus: ATNAUJINTI įrašų pavyzdįAtsižvelgiant į tai, kad „1“ nustatiau PUT įrašų api galinį taškąKai nustatau atnaujinimo užklausos turinįIr siųsti PUT HTTP užklausąTada gaunu galiojantį HTTP atsakymo kodą „PUT“.„Response BODY“ PUT “nėra tuščiasScenarijus: DELETE įrašų pavyzdysAtsižvelgiant į tai, kad „1“ nustatiau „DELETE“ pranešimų api galinį taškąKai siunčiu DELETE HTTP užklausąTada gaunu galiojantį HTTP atsakymo kodą „DELETE“.

Žingsniai įgyvendinimas

Dabar, jei naudojate funkcijų žingsnius, naudojamus aukščiau pateiktuose scenarijuose, galite įrašyti diegimus „Python“ failuose „žingsnių“ kataloge.

„Behave“ sistema identifikuoja „Step“ funkciją, dekoratoriams derinant su funkcijų failo predikatu. Pavyzdžiui, atsižvelgiant į predikatą funkcijų failo scenarijuje, ieškoma žingsnio funkcijos su dekoratoriumi „duota“. Panašus atitikimas būna ir tada, kai ir tada. Bet „But“, „And“, „Step“ funkcija dekoratoriui reikalinga taip pat, kaip ir prieš tai. Pavyzdžiui, jei „And“ yra „Given“, atitikimo žingsnio funkcijos dekoratorius yra @given.

Pavyzdžiui, kai POST žingsnis gali būti įgyvendintas taip:

@when („Aš nustatau„ HEADER param “užklausos turinio tipą kaip„ {header_conent_type} “')Kada, čia priskirtas pranešimas „application / json“ iš „{header_conent_type}“ funkcijų failo. Tai vadinama parametrizavimudef step_impl (kontekstas, header_conent_type):Tai žingsnis diegimo metodo parašasrequest_headers ['Content-Type'] = header_conent_typeŽingsnio diegimo kodas. Čia nustatysite užklausos antraštės turinio tipą

Panašiai kitų žingsnių „python“ faile įgyvendinimas atrodys taip:

sample_step_implementation.py

nuo elgtis importo duota, kai tada žingsnisimporto užklausosapi_endpoints = {}request_headers = {}response_codes = {}response_texts = {}request_bodies = {}api_url = Nėra@given („Aš nustatau pavyzdį REST API URL“)def step_impl (kontekstas):globalus api_urlapi_url = 'http://jsonplaceholder.typicode.com'# PRADĖTI PASTATYTI scenarijų@given (u'Nustatau POST žinučių api galinį tašką ')def step_impl (kontekstas):api_endpoints ['POST_URL'] = api_url + '/ žinutės'spausdinti ('url:' + api_endpoints ['POST_URL'])@when („Aš nustatau„ HEADER param “užklausos turinio tipą kaip„ {header_conent_type} “')def step_impl (kontekstas, header_conent_type):request_headers ['Content-Type'] = header_conent_type# Taip pat galite įtraukti „Ir“ arba „Bet“ kaip žingsnį - jie pervardijami elgiantis, kad imtųsi ankstesnio žingsnio pavadinimo, taigi:@when (u „Nustatyti užklausos turinį“)def step_impl (kontekstas):request_bodies ['POST'] = {"title": "foo", "body": "baras", "userId": "1"}# Taip pat galite įtraukti „Ir“ arba „Bet“ kaip žingsnį - jie pervardijami elgiantis, kad imtųsi ankstesnio žingsnio pavadinimo, taigi:@when (u'Siųsti POST HTTP užklausą ')def step_impl (kontekstas):# siunčia gauti užklausą ir išsaugo atsakymą kaip atsakymo objektąatsakymas = užklausos.postas (url = api_endpoints ['POST_URL'], json = request_bodies ['POST'], antraštės = request_headers)#response = užklausos.postas (url = api_endpoints ['POST_URL'], antraštės = request_headers) #https: //jsonplaceholder.typicode.com/posts# išgaunamas atsakymo tekstasresponse_texts ['POST'] = response.textspausdinti ("post response: + response.text)# išgauti atsakymo statuso kodąstatus code = response.status_coderesponse_codes ['POST'] = būsenos kodas@then (u 'Gaunu galiojantį HTTP atsakymo kodą 201')def step_impl (kontekstas):spausdinti ('Post rep code;' + str (response_codes ['POST']))teigti atsakymo kodai ['POST'] yra 201# END POST scenarijus# Pradėti gauti scenarijų@given (u'Nustatau GAUTI pranešimų api galinį tašką "{id}" ')def step_impl (kontekstas, id):api_endpoints ['GET_URL'] = api_url + '/ posts /' + idspausdinti ('url:' + api_endpoints ['GET_URL'])# Taip pat galite įtraukti „Ir“ arba „Bet“ kaip žingsnį - jie pervardijami elgiantis, kad imtųsi ankstesnio žingsnio pavadinimo, taigi:@when (u 'Siųsti GAUTI HTTP užklausą')def step_impl (kontekstas):# siunčia gauti užklausą ir išsaugo atsakymą kaip atsakymo objektąatsakymas = užklausos.get (url = api_endpoints ['GET_URL'], antraštės = request_headers) #https: //jsonplaceholder.typicode.com/posts# išgaunamas atsakymo tekstasresponse_texts ['GET'] = atsakymas.tekstas# išgauti atsakymo statuso kodąstatus code = response.status_coderesponse_codes ['GET'] = būsenos kodas@then (u 'Gaunu galiojantį HTTP atsakymo kodą „{request_name}“' 200)def step_impl (kontekstas, užklausos_vardas):spausdinti ('Gauti rep kodą' + request_name + ':' + str (response_codes [request_name]))teigti atsakymo kodai [užklausos_vardas] yra 200@then (u'Response BODY "{request_name}" nėra tuščias ")def step_impl (kontekstas, užklausos_vardas):spausdinti ('request_name:' + request_name)spausdinti (atsakymo_tekstai)„assert response_texts“ [request_name] nėra Nėra# PABAIGOS GAVIMO scenarijus#START PUT / UPDATE@given („Aš nustatau„ PUT “pranešimų api galinį tašką„ {id} “')def step_impl (kontekstas, id):api_endpoints ['PUT_URL'] = api_url + '/ posts /' + idspausdinti ('url:' + api_endpoints ['PUT_URL'])@when (u'Nustatau atnaujinimo užklausos turinį ')def step_impl (kontekstas):request_bodies ['PUT'] = {"title": "foo", "body": "baras", "userId": "1", "id": "1"}@when (u 'Siųsti PUT HTTP užklausą')def step_impl (kontekstas):# siunčia gauti užklausą ir išsaugo atsakymą kaip atsako objektą # response = užklausos.postas (url = api_endpoints ['POST_URL'], antraštės = request_headers) #https: //jsonplaceholder.typicode.com/postsatsakymas = request.put (URL = api_endpoints ['PUT_URL'], json = request_bodies ['PUT'], antraštės = request_headers)# išgaunamas atsakymo tekstasresponse_texts ['PUT'] = response.textspausdinti ("atnaujinti atsakymą: + atsakymas.tekstas)# išgauti atsakymo statuso kodąstatus code = response.status_coderesponse_codes ['PUT'] = būsenos kodas#END PUT / UPDATE#START DELETE@given (Aš nustatau „DELETE“ pranešimų api galinį elementą „{id}“ ')def step_impl (kontekstas, id):api_endpoints ['DELETE_URL'] = api_url + '/ posts /' + idspausdinti ('url:' + api_endpoints ['DELETE_URL'])@when (u'Siųsiu DELETE HTTP užklausą ')def step_impl (kontekstas):# siunčia gauti užklausą ir išsaugo atsakymą kaip atsakymo objektąatsakymas = request.delete (url = api_endpoints ['DELETE_URL'])# response = užklausos.postas (url = api_endpoints ['POST_URL'], antraštės = request_headers) #https: //jsonplaceholder.typicode.com/posts# išgaunamas atsakymo tekstasresponse_texts ['DELETE'] = atsakymas.tekstasspausdinti ("DELETE response: + response.text)# išgauti atsakymo statuso kodąstatus code = response.status_coderesponse_codes ['DELETE'] = būsenos kodas#END DELETE

Testų vykdymas:

Dabar mes baigėme testavimo scenarijaus kūrimo dalį, todėl atlikime testus:

Norėdami paleisti funkcijų failą, vykdykite šią komandų eilutės komandą

C: \ Programs \ Python \ Python37> elgtis -f gana C: \ \ features \ feature_files_folder \ Sample_REST_API_Testing.feature

Tai parodys bandymo vykdymo rezultatus taip:

Ataskaitos rodymas konsolėje

Pažiūrėkime čia dar vieną šaunų dalyką.

Kadangi vartotojai visada nori, kad bandymų rezultatai būtų skaitomesni ir pateikiamesni, pateikime HTML formato ataskaitas naudodami „Allure“.

Ataskaitos

Pirmiausia turite įdiegti „Allure Behave“ formataviklį [https://docs.qameta.io/allure/]:

Dabar vykdykite šią komandą:

Dėl ataskaitų

> behave -f json -o < kelias- į jūsų ataskaitų aplanką> Sample_REST_API_Testing.feature

> allure serve < kelias- į jūsų- ataskaitų aplanką>

Tai sukurs jūsų bandymų rezultatų ataskaitą pateikiama ir informatyviu formatu taip:

Testo ataskaita HTML formatu

Bandymo ataskaita, kurioje pateikiamas individualus scenarijaus rezultatas

Santrauka:

  • BDD yra elgesio skatinamas vystymasis. Tai yra viena iš judrios programinės įrangos kūrimo technikų.
  • „REST“ šiais laikais tapo gana populiariu API kūrimo stiliumi, ne mažiau svarbu tapo automatizuoti „REST API“ testavimo atvejus kartu su vartotojo sąsajos testavimo atvejais.
  • BDD turi natūralų kalbos formatą, apibūdinantį ypatybę ar jos dalį su tipiškais laukiamų rezultatų pavyzdžiais
  • „Behave“ sistema identifikuoja „Step“ funkciją, dekoratoriams derinant su funkcijų failo predikatu

Įdomios straipsniai...