BDD 테스트 란 무엇입니까?
BDD (Behavior-driven development) 테스팅 은 민첩한 소프트웨어 개발 기술이며 TDD의 확장, 즉 Test Driven Development입니다. BDD에서 테스트 케이스는 프로그래머가 아닌 사람도 읽을 수있는 자연어로 작성됩니다.
BDD 테스트는 어떻게 작동합니까?
Net Banking 애플리케이션에서 자금 이체 모듈을 작성하도록 지정되었다고 가정하십시오.
그것을 테스트하는 여러 가지 방법이 있습니다
- 소스 계정에 충분한 잔액이있는 경우 자금 이체가 이루어져야합니다
- 목적지 A / C 세부 정보가 정확하면 자금 이체가 이루어져야합니다.
- 사용자가 입력 한 거래에 대한 거래 비밀번호 / RSA 코드 / 보안 인증이 올바르면 자금 이체를 해야합니다.
- 은행 휴무일 인 경우에도 자금 이체가 이루어져야합니다.
- 자금 이체는 계정 소유자가 설정 한 미래 날짜에 이루어져야합니다.
테스트 시나리오는 우리가 간격 Y 일 / 월, 정지 예약 전송을 위해 전송 양의 X와 같은 추가 기능을 고려할 때 더 정교하고 복잡해질 경우 총 금액에 도달의 Z 등
개발자의 일반적인 경향은 기능을 개발하고 나중에 테스트 코드를 작성하는 것입니다. 위의 경우에서 분명히 알 수 있듯이이 사례에 대한 테스트 사례 개발은 복잡하며 개발자는 릴리스까지 테스트 를 연기 할 것이며 ,이 시점에서 그는 빠르고 비효율적 인 테스트를 수행 할 것입니다.
이 문제를 극복하기 위해 (Behavior Driven Development) BDD가 고안되었습니다. 개발자가 전체 테스트 프로세스를 쉽게 수행 할 수 있습니다.
BDD에서 작성하는 모든 내용은 Given-When-Then 단계로 이동해야 합니다. 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 테스트 케이스를 UI 테스트 케이스와 함께 자동화하는 것도 똑같이 중요해졌습니다. 따라서 기본적으로 이러한 REST API 테스트에는 각각 POST, GET, PUT 및 DELETE 메서드를 사용하여 CRUD (Create-Read-Update-Delete) 작업 테스트가 포함됩니다.
Behave는 무엇입니까?
Behave는 인기있는 Python BDD 테스트 프레임 워크 중 하나입니다.
Behave가 어떻게 작동하는지 봅시다 :
기능 파일은 비즈니스 분석가 / 스폰서 / 당신의 행동 시나리오가있는 사람이 작성합니다.
예상되는 결과의 대표적인 예와 함께 기능 또는 기능의 일부를 설명하는 자연어 형식이 있습니다.
이러한 시나리오 단계는 Python으로 작성된 단계 구현으로 매핑됩니다.
선택적으로 몇 가지 환경 제어 (단계, 시나리오, 기능 또는 전체 촬영 경기 전후에 실행할 코드)가 있습니다.
Behave를 사용하여 자동화 테스트 프레임 워크 설정을 시작해 보겠습니다.
Windows에서 Behave 테스트 프레임 워크 설정 :
설치:
- https://www.python.org/ 에서 Python 3 다운로드 및 설치
- 명령 프롬프트에서 다음 명령을 실행하여 설치하십시오.
- pip 설치 동작
- IDE : PyCharm Community Edition https://www.jetbrains.com/pycharm/download를 사용했습니다.
프로젝트 설정 :
- 새 프로젝트 생성
- 다음 디렉터리 구조를 만듭니다.
기능 파일 :
이제 'posts'서비스에서 CRUD 작업을 수행하는 기능을 가진 기능 파일 Sample_REST_API_Testing.feature 를 빌드 해 보겠습니다 .
이 예에서는 http://jsonplaceholder.typicode.com/ posts sample REST Service를 사용했습니다.
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."
단계 구현
이제 위 시나리오에서 사용 된 기능 단계의 경우 "steps"디렉토리의 Python 파일에 구현을 작성할 수 있습니다.
Behave 프레임 워크는 기능 파일 술어와 일치하는 데코레이터로 Step 함수를 식별합니다. 예를 들어, 기능 파일 시나리오의 주어진 술어는 "주어진"데코레이터가있는 단계 함수를 검색합니다. When and Then에 대해서도 유사한 일치가 발생합니다. 하지만 'But', 'And'의 경우 Step 함수는 이전 단계와 동일한 데코레이터를 사용합니다. 예를 들어 'And'가 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
마찬가지로 단계 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 : \ Programs \ Python \ Python37> behave -f pretty C : \ <your project path> \ features \ feature_files_folder \ Sample_REST_API_Testing.feature
다음과 같이 테스트 실행 결과가 표시됩니다.
콘솔에 보고서 표시
여기서 한 가지 더 멋진 것을 보겠습니다.
사용자는 항상 더 읽기 쉽고보기 쉬운 형식으로 테스트 결과를 보는 것을 선호하므로 Allure의 도움을 받아 HTML 형식으로 보고서를 작성합시다.
보고서
먼저 Allure Behave 포맷터 [ https://docs.qameta.io/allure/ ] 를 설치해야합니다 .
이제 다음 명령을 실행하십시오.
보고서 용
> behave -f json -o <보고서 폴더 경로> Sample_REST_API_Testing.feature
<allure-bin 폴더 경로 >> allure serve <보고서 폴더 경로>
그러면 다음과 같이 표시 가능하고 유익한 형식으로 테스트 결과 보고서가 생성됩니다.
HTML 형식의 테스트 보고서
개별 시나리오 결과를 표시하는 테스트 보고서
요약:
- BDD는 행동 중심 개발입니다. 민첩한 소프트웨어 개발 기술 중 하나입니다.
- REST는 요즘 API를 빌드하는 데 매우 인기있는 스타일이되었으며, UI 테스트 케이스와 함께 REST API 테스트 케이스를 자동화하는 것도 똑같이 중요해졌습니다.
- BDD에는 예상 결과의 대표적인 예와 함께 기능 또는 기능의 일부를 설명하는 자연어 형식이 있습니다.
- Behave 프레임 워크는 기능 파일 술어와 일치하는 데코레이터로 Step 함수를 식별합니다.
'API Test > SoupUI' 카테고리의 다른 글
SoapUI의 속성은 무엇입니까? (0) | 2020.09.08 |
---|---|
SoapUI의 스크립트 어설 션은 무엇입니까? (0) | 2020.09.07 |
API 테스트 관련 용어 (0) | 2018.11.29 |
Top 15 SoapUI 인터뷰 질문 및 답변 (0) | 2018.11.27 |
15 REST API 인터뷰 질문 및 답변 (0) | 2018.11.27 |