Какво е BDD тестване? Пример за рамка

Какво е BDD (развитие, управлявано от поведение) тестване?

Тестване на BDD (поведенческо развитие). е техника за гъвкава разработка на софтуер и е като разширение на TDD, т.е. Test Driven Development. В BDD тестовите случаи са написани на естествен език, който дори и непрограмисти могат да четат.

Как работи BDD тестването?

Считайте, че ви е възложено да създадете модул за превод на средства в приложение за нетно банкиране.

Има няколко начина да го тествате

  1. Прехвърлянето на средства трябва да се извърши, ако има достатъчно салдо в изходния акаунт
  2. Преводът на средства трябва да се осъществи, ако данните за дестинацията са правилни
  3. Прехвърлянето на средства трябва да се осъществи, ако паролата на транзакцията/rsa кодът/удостоверяването за сигурност за транзакцията, въведена от потребителя, е правилна
  4. Преводът на средства трябва да се извърши дори ако е банков празник
  5. Преводът на средства трябва да се извърши на бъдеща дата, определена от титуляра на сметката

- Сценарий на теста стават по-сложни и сложни, тъй като разглеждаме допълнителни функции като сума на трансфер X за интервал Y дни/месеци, спиране на трансфера по график, когато общата сума достигне Z и т.н.

Общата тенденция на разработчиците е да разработват функции и да пишат тестов код по-късно. Както е видно от горния случай, Тестов случай разработката за този случай е сложна и разработчикът ще отложи Тестване до освобождаване, след което той ще направи бързо, но неефективно тестване.

За преодоляване на този проблем (Развитие, управлявано от поведение) беше замислен BDD. Това прави целия процес на тестване лесен за програмиста

В BDD каквото напишеш трябва да влезе Даден-кога-тогава стъпки. Нека разгледаме същия пример по-горе в BDD

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

Не е ли лесно да се пише, чете и разбира? Той обхваща всички възможни тестови случаи за модула за прехвърляне на средства и може лесно да бъде модифициран, за да побере повече. Също така, това е по-скоро като писане на документация за модула за прехвърляне на средства.

Какво е REST API тестване?

Тъй като REST се превърна в доста популярен стил за изграждане на API в днешно време, стана също толкова важно да се автоматизират тестовите случаи на REST API заедно с тестовите случаи на потребителския интерфейс. Така че основно тези REST API тестване включва тестване на CRUD (Създаване-Четене-Актуализиране-Изтриване) действия с методи POST, GET, PUT и DELETE съответно.

Какво е Behave?

Behave е един от популярните Python BDD тестови рамки.

Нека да видим как функционира Behave:

Файловете с функции са написани от вашия бизнес анализатор/спонсор/който и да е с вашите сценарии за поведение в тях. Има формат на естествен език, описващ характеристика или част от характеристика с представителни примери за очаквани резултати

Тези стъпки на сценария са съпоставени със записани реализации на стъпки Python.

И по желание има някои контроли на околната среда (код за изпълнение преди и след стъпки, сценарии, функции или целия мач на стрелба).

Нека започнем с настройката на нашата тестова рамка за автоматизация с Behave:

Настройване на BDD тестова рамка Behave on Windows

Монтаж:

  • Изтегляне и инсталиране Python 3 от https://www.python.org/
  • Изпълнете следната команда в командния ред, за да инсталирате поведение
  • поведение при инсталиране на pip
  • IDE: Използвал съм PyCharm Community Edition https://www.jetbrains.com/pycharm/download

Настройка на проекта:

  • Създайте нов проект
  • Създайте следната структура на директорията:

Настройка на проекта

Файлове с функции:

Така че нека изградим нашия файл с функции Sample_REST_API_Testing.feature има функция като извършване на CRUD операции в услугата „постове“.

В нашия пример използвах http://jsonplaceholder.typicode.com/ публикува примерна услуга REST.

Примерен POST сценарий

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	

По същия начин можете да напишете останалите сценарии, както следва:

Настройка на проекта

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." 

Стъпки Изпълнение

Сега, за Стъпките на функцията, използвани в горните сценарии, можете да пишете реализации в Python файлове в директорията „стъпки“.

Рамката Behave идентифицира функцията Step чрез декоратори, съвпадащи с предиката на файл с функции. Например даден предикат в сценарий на файл с функции търси стъпкова функция с декоратор „дадено“. Подобно съвпадение се случва за Кога и Тогава. Но в случай на „Но“, „И“ Стъпковата функция приема декоратора като предходната стъпка. Например, ако „И“ идва за Given, съответстващият декоратор на функцията на стъпка е @given.

Например, когато стъпката за POST може да бъде приложена по следния начин:

@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

По подобен начин изпълнението на други стъпки във файла step python ще изглежда така:

Стъпки Изпълнение

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

Изпълнение на тестовете

Сега приключихме с нашата част за разработка на тестов скрипт, така че нека стартираме нашите тестове:

Изпълнете следната команда в командния ред, за да изпълните нашия файл с функции

C: \Програми\Python\Python37>държа се -е красиво C:\ \features\feature_files_папка\Sample_REST_API_Testing.feature

Това ще покаже резултатите от изпълнението на теста, както следва:

Изпълнение на тестовете

Показване на отчет на конзолата

Нека видим още едно страхотно нещо тук.

Тъй като потребителите винаги предпочитат да виждат резултатите от тестовете в по-разбираем и представим формат, нека имаме отчети в HTML формат с помощта на Allure.

Доклади

Първо, трябва да инсталирате Allure Behave formatter [https://docs.qameta.io/allure-report/]:

И сега изпълнете следната команда:

За доклади

>поведение -f json -o Sample_REST_API_Testing.feature

> обаяние служи

Това ще генерира вашия отчет за резултатите от теста в представителен и информативен формат като този:

Доклади

Доклад от теста в HTML формат

Доклад от теста в HTML формат

Доклад от теста, показващ индивидуален резултат от сценария

Oбобщение

  • BDD е развитие, управлявано от поведението. Това е една от техниките за гъвкава разработка на софтуер.
  • REST се превърна в доста популярен стил за изграждане на API в днешно време, стана също толкова важно да се автоматизират тестовите случаи на REST API заедно с тестовите случаи на потребителския интерфейс.
  • BDD има формат на естествен език, описващ функция или част от функция с представителни примери за очаквани резултати
  • Рамката Behave идентифицира функцията Step чрез декоратори, съвпадащи с предиката на файл с функции
  • Примери за рамки за тестване на BDD: 1) Cucumber 2) SpecFlow 3) Quantum 4) JBehave 5) Кодиране

Ежедневен бюлетин на Guru99

Започнете деня си с най-новите и важни новини за изкуствения интелект, доставени точно сега.