BDD的自動化測試方式與實務建議

BDD的自動化測試方式與實務建議

Image result for bdd testing

這篇文章主要用一個 Python為範例說明如何建置 BDD 的測試

主要過程分為四大步驟, 安裝環境, 定義use case (features), 根據每一個 use case 編寫對應的自動化程式, 最後執行

最後筆者針對實務上做一些分享, 實務上筆者其實並不建議. 為什麼呢?

什麼是 BDD (behavior-driven development)

Behavior  Testing 最開始的初衷是希望將每一個功能透過使用者場景的描述方式

Given …. When….Then….等方式進行測試

一來可以確定原始需求的場景是否被滿足,

二來可以讓測試結果更容易閱讀. 所有團隊相關人, 包含非技術人員 ,

也可以透過每個場景描述就可以知道測試的結果

Image result for bdd

第一步: 安裝環境 Behave

BDD每個程式語言都有相對應的套件, 這邊我們使用的是 Python Behave的 BDD 測試套件

pip install behave

第二步: 定義 Feature場景

我們用兩個數字相加為例子, Given, When, Then, 描述這個功能

檔名myBehave.feature

[pastacode lang=”markup” message=”” highlight=”” provider=”manual”]

Feature: My first behave feature
 
  Scenario: Add two numbers
    Given I have two integers a and b
    When I add the numbers
    Then I print the addition result

[/pastacode]

第三步: 執行程式碼

接著就要對上述步驟進行程式編碼 , 告訴電腦 “I have two integers a and b”所相對應執行的程式碼為何

檔名mybehave.py

[pastacode lang=”python” message=”” highlight=”” provider=”manual”]


from behave import *
use_step_matcher("re")
@given("I have two integers a and b")
def step_impl(context):
    context.a = 1
    context.b = 2
@when("I add the numbers")
def step_impl(context):
    context.sum = int(context.a) + int(context.b)
@then("I print the addition result")
def step_impl(context):
    print("Sum of", context.a, "and", context.b, "is:",context.sum)

[/pastacode]

第四步: 執行

 behave   myBehave.feature

behave execution

BDD實務上是否還存在?

這個例子可以看出來 BDD 簡單來說就是將

Feature (use case ) 描述與程式碼轉換的過程

優點是執行結果大家都可以看懂, 因為場景用 Given When, Then 的方式描述

但是適不適合實務上廣泛的使用, 筆者並不推薦

為什麼呢?

1. 試問產品經理是否會按照 Given, When, Then 的方式描述每一個場景呢? ,就算會那麼重複被用到的場景描述機率多大呢?

如果每次描述方式都不同, 那麼也意味著每次程式碼的對應都要重新撰寫

2. 如果只是為了測試結果更容易了解與閱讀, 那麼其實在測試結果輸出時, 建議可以用更多註解的方式將場景描述即可

讓程式可讀性與更容易維護. 不一定要為了 BDD 而 BDD, 畢竟整個自動化測試的維護性與可讀性的考量

3. 不使用 Behave BDD 就表示沒有 BDD testing嗎? 也不盡然

只要每個場景與測試個案都可以有所連結與追蹤就達到 BDD 精神

這或許也說明筆者實務上比較少見 Python Behave, Java JBehave等

 

http://behave.readthedocs.io/en/latest/tutorial.html

http://jbehave.org/

Leave a Reply

Your email address will not be published. Required fields are marked *