Kiểm tra BDD là gì? Ví dụ về khung

Thử nghiệm BDD (Phát triển theo hướng hành vi) là gì?

Kiểm tra BDD (Phát triển theo hướng hành vi) là một kỹ thuật phát triển phần mềm linh hoạt và là một phần mở rộng của TDD, tức là Phát triển dựa trên thử nghiệm. Trong BDD, các trường hợp kiểm thử được viết bằng ngôn ngữ tự nhiên mà ngay cả những người không phải lập trình viên cũng có thể đọc được.

Kiểm tra BDD hoạt động như thế nào?

Giả sử bạn được chỉ định tạo mô-đun Chuyển tiền trong ứng dụng Net Banking.

Có nhiều cách để kiểm tra nó

  1. Chuyển tiền sẽ diễn ra nếu có đủ số dư trong tài khoản nguồn
  2. Việc chuyển tiền sẽ được thực hiện nếu thông tin tài khoản đích là chính xác
  3. Chuyển tiền sẽ diễn ra nếu mật khẩu giao dịch / mã rsa / xác thực bảo mật cho giao dịch được người dùng nhập là chính xác
  4. Chuyển tiền sẽ diễn ra ngay cả khi đó là Ngày nghỉ lễ của Ngân hàng
  5. Việc chuyển tiền sẽ diễn ra vào một ngày trong tương lai do chủ tài khoản ấn định

Kịch bản thử nghiệm trở nên phức tạp và tinh vi hơn khi chúng ta xem xét các tính năng bổ sung như số tiền chuyển X trong khoảng thời gian Y ngày/tháng, dừng lịch chuyển khi tổng số tiền đạt Z, v.v.

Xu hướng chung của các nhà phát triển là phát triển các tính năng và viết mã thử nghiệm sau. Như đã thấy trong trường hợp trên, Trường hợp thử nghiệm phát triển cho trường hợp này là phức tạp và nhà phát triển sẽ trì hoãn Kiểm tra cho đến khi được thả ra, lúc đó anh ta sẽ thực hiện thử nghiệm nhanh chóng nhưng không hiệu quả.

Để khắc phục vấn đề này (Phát triển theo hướng hành vi) BDD đã được hình thành. Nó làm cho toàn bộ quá trình thử nghiệm trở nên dễ dàng đối với nhà phát triển

Trong BDD, bất cứ điều gì bạn viết đều phải đi vào Cho-Khi-Sau đó các bước. Hãy xem xét ví dụ tương tự ở trên trong 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

Viết, đọc và hiểu không phải là dễ dàng sao? Nó bao gồm tất cả các trường hợp thử nghiệm có thể có cho mô-đun chuyển tiền và có thể dễ dàng sửa đổi để phù hợp hơn. Ngoài ra, nó giống như viết tài liệu cho mô-đun chuyển tiền hơn.

Kiểm tra API REST là gì?

Vì REST đã trở thành một phong cách khá phổ biến hiện nay để xây dựng API, nên việc tự động hóa các trường hợp kiểm thử API REST cùng với các trường hợp kiểm thử giao diện người dùng cũng trở nên quan trọng không kém. Về cơ bản, những REST này Thử nghiệm API liên quan đến việc kiểm tra các hành động CRUD (Tạo-Đọc-Cập nhật-Xóa) với các phương thức POST, GET, PUT và DELETE tương ứng.

Cư xử là gì?

Cư xử là một trong những cách phổ biến Python Khung kiểm tra BDD.

Hãy xem Behave hoạt động như thế nào:

Các tệp tính năng được viết bởi Nhà phân tích kinh doanh / Nhà tài trợ / bất kỳ ai có kịch bản hành vi của bạn trong đó. Nó có định dạng ngôn ngữ tự nhiên mô tả một tính năng hoặc một phần của tính năng cùng với các ví dụ tiêu biểu về kết quả mong đợi

Các bước Kịch bản này được ánh xạ với các bước triển khai được viết bằng Python.

Và tùy chọn, có một số điều khiển môi trường (mã chạy trước và sau các bước, kịch bản, tính năng hoặc toàn bộ trận đấu bắn súng).

Hãy bắt đầu với việc thiết lập khung thử nghiệm tự động hóa của chúng tôi với Behave:

Thiết lập Khung kiểm tra BDD Hoạt động trên Windows

Cài đặt:

Thiết lập dự án:

  • Tạo một dự án mới
  • Tạo cấu trúc thư mục sau:

Thiết lập dự án

Tệp tính năng:

Vì vậy, hãy xây dựng tệp tính năng của chúng tôi Sample_REST_API_Testing.feature có tính năng Thực hiện các thao tác CRUD trên dịch vụ 'bài đăng'.

Trong ví dụ của chúng tôi, tôi đã sử dụng http://jsonplaceholder.typicode.com/ bài đăng mẫu Dịch vụ REST.

Kịch bản POST ví dụ

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	

Tương tự, bạn có thể viết các kịch bản còn lại như sau:

Thiết lập dự án

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

Các bước thực hiện

Bây giờ, đối với các Bước tính năng được sử dụng trong các tình huống trên, bạn có thể viết phần triển khai trong Python các tập tin trong thư mục “bước”.

Khung hành vi xác định hàm Bước bằng cách trang trí khớp với vị từ của tệp tính năng. Ví dụ: Vị từ đã cho trong tệp Tính năng Kịch bản tìm kiếm hàm bước có trình trang trí “đã cho”. Sự kết hợp tương tự cũng xảy ra với When và Then. Nhưng trong trường hợp hàm 'Nhưng' 'Và' Bước sử dụng trình trang trí giống như bước trước đó. Ví dụ: Nếu 'And' xuất hiện trong Given, trình trang trí hàm bước phù hợp là @given.

Ví dụ: khi bước POST có thể được triển khai như sau:

@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

Tương tự, việc thực hiện các bước khác trong file step python sẽ như sau:

Các bước thực hiện

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

Chạy thử nghiệm

Bây giờ, chúng ta đã hoàn thành phần phát triển tập lệnh thử nghiệm, vì vậy hãy chạy thử nghiệm:

Thực hiện lệnh sau trên dấu nhắc lệnh để chạy tệp tính năng của chúng tôi

C: \Chương trình\Python\Python37>cư xử -f xinh đẹp C:\ \features\feature_files_folder\Sample_REST_API_Testing.feature

Điều này sẽ hiển thị kết quả thực hiện kiểm tra như sau:

Chạy thử nghiệm

Hiển thị báo cáo trên bảng điều khiển

Chúng ta hãy xem thêm một điều thú vị ở đây.

Vì người dùng luôn muốn xem kết quả kiểm tra ở định dạng dễ đọc và trình bày hơn nên hãy tạo báo cáo ở định dạng HTML với sự trợ giúp của Allure.

Báo Cáo

Trước tiên, bạn cần cài đặt trình định dạng Allure Behave [https://docs.qameta.io/allure-report/]:

Và bây giờ hãy thực hiện lệnh sau:

Đối với báo cáo

>cư xử -f json -o Sample_REST_API_Testing.feature

> phục vụ quyến rũ

Điều này sẽ tạo ra báo cáo kết quả kiểm tra của bạn ở định dạng dễ hiểu và giàu thông tin như thế này:

Báo Cáo

Báo cáo thử nghiệm ở định dạng HTML

Báo cáo thử nghiệm ở định dạng HTML

Báo cáo thử nghiệm hiển thị kết quả Kịch bản riêng lẻ

Tổng kết

  • BDD có nghĩa là Phát triển theo hướng hành vi. Đây là một trong những kỹ thuật phát triển phần mềm linh hoạt.
  • REST đã trở thành một phong cách khá phổ biến hiện nay để xây dựng API, việc tự động hóa các trường hợp kiểm thử API REST cùng với các trường hợp kiểm thử giao diện người dùng cũng trở nên quan trọng không kém.
  • BDD có định dạng ngôn ngữ tự nhiên mô tả một tính năng hoặc một phần của tính năng kèm theo các ví dụ tiêu biểu về kết quả mong đợi
  • Khung hành vi xác định hàm Bước bằng cách trang trí khớp với vị từ tệp tính năng
  • Ví dụ về Khung kiểm tra BDD: 1) Cucumber 2) SpecFlow 3) Lượng tử 4) JBehave 5) Codeception