BDDテストとは何ですか? フレームワークの例

BDD (動作駆動開発) テストとは何ですか?

BDD (動作駆動型開発) テスト アジャイル ソフトウェア開発の手法であり、TDD、つまりテスト駆動開発の拡張です。 BDD では、テスト ケースはプログラマでなくても読める自然言語で記述されます。

BDD テストはどのように機能するのでしょうか?

ネット バンキング アプリケーションで資金移動モジュールを作成するように割り当てられているとします。

テストする方法は複数あります

  1. 送金元口座に十分な残高がある場合、資金移動が行われます。
  2. 送金先が A/C である場合、資金送金を行う必要があります。tails は正しい
  3. ユーザーが入力した取引パスワード/rsaコード/セキュリティ認証が正しい場合、資金移動が行われます。
  4. 銀行休業日であっても口座振替は行われるべきです
  5. 資金移動は、口座名義人が設定した将来の日付に行われる必要があります。

また, テストシナリオ より精緻になり、complex Y 日/月の間隔での転送量 X 、合計量が Z に達したときに転送スケジュールを停止するなどの追加機能を考慮します。

開発者の一般的な傾向は、機能を開発してテスト コードを作成することです。 later。上記の場合から明らかなように、 テストケース このケースの開発は com ですplex そして開発者は延期するだろう テスト リリースまでは、彼は迅速ではあるが効果のないテストを行う予定です。

この問題 (動作駆動開発) を克服するために、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 を構築するための非常に人気のあるスタイルになっているため、UI テスト ケースと同様に REST API テスト ケースを自動化することも同様に重要になっています。 基本的に、これらの REST APIテスト これには、POST、GET、PUT、および DELETE メソッドをそれぞれ使用した CRUD (作成、読み取り、更新、削除) アクションのテストが含まれます。

振る舞いとは何ですか?

Behave は、人気のある Python BDD テスト フレームワークの XNUMX つです。

Behave がどのように機能するかを見てみましょう。

機能ファイルは、ビジネス アナリスト、スポンサー、または行動シナリオを含む人によって作成されます。 期待される結果の代表的な例とともに機能または機能の一部を説明する自然言語形式を持っています。

これらのシナリオ ステップは、次のように記述されたステップ実装にマップされます。 Python .

また、オプションで、いくつかの環境制御 (ステップ、シナリオ、機能、または射撃試合全体の前後に実行するコード) もあります。

Behave を使用した自動テスト フレームワークのセットアップを始めましょう。

BDD テスト フレームワークのセットアップ Windows

インストール:

  • Python 3 をダウンロードしてインストールします。 https://www.python.org/
  • 以下を実行しますwing コマンドプロンプトでインストールするコマンドは動作します
  • pip インストールの動作
  • IDE: PyCharm Community Edition を使用しました https://www.jetbrains.com/pycharm/download

プロジェクトの設定:

  • 新しいプロジェクトを作成する
  • 以下を作成しますwing ディレクトリ構造:

プロジェクトの設定

機能ファイル:

それでは、機能ファイルを構築しましょう Sample_REST_API_Testing.feature 「posts」サービスで 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." 

ステップの実装

上記のシナリオで使用される機能ステップについては、「steps」ディレクトリ内の Python ファイルで実装を作成できます。

Behave フレームワークは、機能ファイルの述語と一致するデコレーターによって Step 関数を識別します。 たとえば、フィーチャー ファイル シナリオの Given 述語は、デコレーター「given」を持つステップ関数を検索します。 When と then についても同様の一致が発生します。 ただし、「But」、「And」の場合、ステップ関数は前のステップと同じデコレータを受け取ります。 たとえば、Given に 'And' が来る場合、一致するステップ関数デコレーターは @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 ファイル内の他のステップの実装は次のようになります。

ステップの実装

サンプル_ステップ_実装.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

テストの実行

これでテスト スクリプトの開発部分は完了したので、テストを実行してみましょう。

以下を実行しますwing コマンドプロンプトでコマンドを実行して機能ファイルを実行します

C: \プログラム\Python\Python37>行儀よく -f きれいに C:\ \features\feature_files_folder\Sample_REST_API_Testing.feature

これにより、テストの実行結果が次のように表示されます。

テストの実行

コンソールへのレポート表示

ここでもう XNUMX つ素晴らしい点を見てみましょう。

ユーザーは常に、テスト結果をより読みやすく、見栄えの良い形式で表示することを好むため、Allure を使用して HTML 形式でレポートを作成しましょう。

レポート

まず、Allure Behave フォーマッタをインストールする必要があります [https://docs.qameta.io/allure-report/]:

そして、次のコマンドを実行しますwing コマンド:

報告用

>動作 -f json -o Sample_REST_API_Testing.feature

> アリュールサーブ

これにより、次のような見栄えの良い有益な形式でテスト結果レポートが生成されます。

レポート

HTML形式のテストレポート

HTML形式のテストレポート

個別のシナリオ結果を表示するテストレポート

まとめ

  • BDD は動作駆動型開発です。 アジャイルソフトウェア開発の手法の一つです。
  • REST は現在、API を構築するための非常に人気のあるスタイルになっており、UI テスト ケースと同様に REST API テスト ケースを自動化することも同様に重要になっています。
  • BDD には、期待される結果の代表的な例とともに機能または機能の一部を記述する自然言語形式があります。
  • Behave フレームワークは、機能ファイルの述語と一致するデコレーターによって Step 関数を識別します
  • BDD テスト フレームワークの例: 1) Cucumber 2) SpecFlow 3) Quantum 4) JBehave 5) Codeception