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ä

  1. Varainsiirto tulee tehdä, jos lähdetilillä on riittävästi saldoa
  2. Varainsiirto tulee suorittaa, jos kohteen ilmastointitiedot ovat oikein
  3. Rahansiirron tulee tapahtua, jos tapahtuman salasana / rsa-koodi / suojaustodennus käyttäjän syöttämälle tapahtumalle on oikein
  4. Rahansiirron tulisi tapahtua, vaikka se olisi pyhäpäivä
  5. 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:

Projektin määritys:

  • Luo uusi projekti
  • Luo seuraava hakemistorakenne:

Projektin asennus

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:

Projektin asennus

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ä:

Toteutusvaiheet

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:

Testien suorittaminen

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ä:

Raportit

Testiraportti HTML-muodossa

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