API Test/SoupUI2020. 8. 21. 08:00

BDD 테스트 란 무엇입니까?

BDD (Behavior-driven development) 테스팅 은 민첩한 소프트웨어 개발 기술이며 TDD의 확장, 즉 Test Driven Development입니다. BDD에서 테스트 케이스는 프로그래머가 아닌 사람도 읽을 수있는 자연어로 작성됩니다.

 

BDD 테스트는 어떻게 작동합니까?

Net Banking 애플리케이션에서 자금 이체 모듈을 작성하도록 지정되었다고 가정하십시오.

그것을 테스트하는 여러 가지 방법이 있습니다

  1. 소스 계정에 충분한 잔액이있는 경우 자금 이체가 이루어져야합니다
  2. 목적지 A / C 세부 정보가 정확하면 자금 이체가 이루어져야합니다.
  3. 사용자가 입력 한 거래에 대한 거래 비밀번호 / RSA 코드 / 보안 인증이 올바르면 자금 이체를 해야합니다.
  4. 은행 휴무일 인 경우에도 자금 이체가 이루어져야합니다.
  5. 자금 이체는 계정 소유자가 설정 한 미래 날짜에 이루어져야합니다.

테스트 시나리오는 우리가 간격 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 테스트 프레임 워크 설정 :

설치:

프로젝트 설정 :

  • 새 프로젝트 생성
  • 다음 디렉터리 구조를 만듭니다.

 

 

기능 파일 :

이제 '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 함수를 식별합니다.
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
Posted by 프리스케이터