2016/07/10

[BDD] 玩玩 Cucumber 規格描述做測試

最近玩了一些測試相關的技術, 有一些個人小小的心得

在 PHP, 常用的有 PHPUnit, PHPSpec, Behat

在 .NET 常用的有 MS Test, NUnit, SpecFlow


先說 PHP 的部分, 最近會常接觸到 PHPUnit 是因為在開發 Laravel 的專案, 本身就整合了 PHPUnit, 不需太多的設定, 就可以立刻起步

PHPSpec 比較偏需求導向, 也就是常說的 BDD - 行為趨動開發
跟 PHPUnit 一樣有紅燈, 綠燈, 但有一點我覺得蠻好玩的是它會用互動的方式來幫助我產生需要的程式片斷

至於 Behat, 剛開始對於它的 feature 檔案設定感到很陌生, 但是因為是以使用者的角度來做開發需求, 而且在對應測試的方法, 只要有定義的步驟, 全都會相應到. 沒有對應到的步聚在執行 behat 一樣會產生對應的程式片段, 要求加在測試檔中, 減少拼命 key 鍵盤的刻檔. 在測試檔中不會特別去看到輸入的參數值, 跟 PHPUnit 及 PHPSpec 的測試方法又有些許不同, 蠻有趣的.

.NET 的部分, MS Test 是內建, 開發 ASP.NET MVC 專案時可一併加入 Unit Test 專案, 測試把握3A 原則 - Arrange, Act, Assert.

NUnit 我沒有特別去實作, 每個專案要去加上 NUnit Test Adapter 的套件, 不過大致上使用跟 MS Test 類似

會去玩 SpecFlow 也是因為玩了 Behat 之後, 覺得開發流程很有趣, 因此特別來研究一下在 Visual Studio 上如何去使用 SpecFlow

SpecFlow & Behat


SpecFlow (For .NET) 及 Behat (For PHP) 有個共通點, 都是以 Cucumber 為基礎的 BDD 工具,  描述測試的檔案都是 *.feature

常游走在兩個 Framework 中間, 有共通的語言很重要 :)

*.feature 是用 Gherkin 語法來描述

用預設英文的描述範例:

Feature: Calculator
 In order to avoid silly mistakes
 As a math idiot
 I want to be told the sum of two numbers

Scenario: Add two numbers
 Given I have entered 50 into the calculator
 And I have entered 70 into the calculator
 When I press add
 Then the result should be 120 on the screen

也可以用其他語言來描述:
只要在第一行加註-- #language: zh-TW 即可用繁中來寫功能描述檔

#language: zh-TW
功能: 加總器
 加總所有數字
 取得加總後的總合

場景: 加總兩位數字
 假設 輸入數字 50
 並且 輸入數字 70
  按下加總按鈕
 那麼 得到加總後的的總合 120

測試的程式大概長這樣, 這裡用 C# - SpecFlow + MS Test 為範例
可利用規格來幫忙產出, 只要去做對應的實作方法出來

[Binding]
public class 加總器Steps
{
    private Calculator calculator = new Calculator();

    [Given(@"輸入數字 (.*)")]
    public void 假設輸入數字(int number)
    {
        calculator.AddNumber(number);
    }
    
    [When(@"按下加總按鈕")]
    public void 當按下加總按鈕()
    {
        calculator.DoCalculation();
    }
    
    [Then(@"得到加總後的的總合 (.*)")]
    public void 那麼得到加總後的的總合(int result)
    {
        Assert.AreEqual(result, calculator.Total);
    }
}

而測試的主物件程式 Calculator 長這個樣子

public class Calculator
{
    private List numbers = new List();
    public int Total { get; private set; }

    public void AddNumber(int number)
    {
        this.numbers.Add(number);
    }

    public void DoCalculation()
    {
        this.Total = 0;

        foreach (int number in numbers)
        {
            this.Total += number;
        }
    }
}


在 Visual Studio 執行測試的結果~ 綠燈! 很好~~~



用描述規格的方法來達到測試的目的, 一方面讓各班人馬容易確認規格, 二方面又可以達到測試驗收的目的

以上是用 Visual Studio 來實作 SpecFlow 及 MSTest 的整合

而在 PHP, 可以用 Behat 搭配 PHPUnit 來完成

目前還在熟悉 BDD 的測試流程及工具的操作流程, 改天再來發實作篇吧!

[2016/7/10] 實作 Demo 篇:
[PHP Demo - Behat + PHPUnit] - https://github.com/onecentlin/php-bdd-behat-demo

沒有留言: