[C#.NET][SpecFlow] SpecFlow Hello World

這一篇的草稿是在半年前就建立,可能更久,我也忘了是什麼原因沒有寫完,圖片可能會有不一致的情況,不過應該不影響,一上完 91哥的課 ,立馬補完,不補完對不起自己,也對不起 91 哥。

  • 我所瞭解的 SpecFlow
  • 是透過91哥的文章得知它的存在
  • open source
  • 用人類語言(口語化)寫需求,並可轉換成可偵錯的程式碼
  • 可以轉成漂亮的需求報表
  • 整合 Visual Studio 開發工具
  • 減少單元測試
  • 可做為程式進入點
  • 實現BDD(behavior-driven development)的工具
  • 讓TDD(Test-driven development)溫柔

 

實務上我碰到了什麼問題?

  • 沒有需求文件,需求全掌握在少部份的 Developer 腦海中,Developer 不願意寫需求文件
  • PM /SA寫的需求單,必須要由 Developer 手動將它轉程程式碼
  • 文法件風格多樣化、抽像、凌亂,有的用邏輯圖有的用UML(不是說用圖表現不好,而是這些圖無法被測試、驗証)
  • 需求改了 Developer 不知道,就算知道 Developer 也不知道要改哪裡
  • 需求無人維護,最後產品跟需求不一致,也造成日後維護困難
  • 需求不好寫
  • 需求邏輯打結,改了A功能,死了C、B、D,無法在短時間之內找出問題
  • 需求無法被測試,等於很難驗証需求是否被滿足
  • 測試程式碼雖然有寫,但就像揮了一擊重拳在軟海棉上,打不到痛處
  • 已經有三層式架構,但需求異動時,還是需要把關鍵程式碼用眼睛翻過一遍,沒有分層的更慘,全翻

…我相信更多

我想要?

以需求為核心主軸設計,最後產生的結果都能滿足需求,不過度設計,不浪費,嘴砲大家都會,現實生活上需求表跟程式碼永遠串不起來,好痛苦阿;SpecFlow 能解決我的問題,接著就來實際演練

若你看完本篇還是看不懂,表示缺乏了很多基本觀念,請移駕到91哥的課程補足,有人看到課程標題以為那是在教人家寫測試,跟他寫的軟體無關,事實上有很大的關係

91哥:『我不是在教你們寫測試,而是在教你們怎麼開發,測試只是輔助』。如果你真的想要學習高手怎麼快速開發,衷心的推荐一定要去聽

本文章節

 


安裝 SpecFlow

1.從擴充工具裡面 安裝 SpecFlow

image

 

 

2.新增測試專案,並在專案裡面安裝 SpecFlow from Nuget

image

 

 

3.安裝完 SpecFlow 後在 App.config 裡有一個超連結,點選它

image

 

 

把下圖紅框處貼到專案裡,預設 Specflow是跑 NUnit Test,現在要改成 MSTest

image

 

其實重點,只是把預設的 NUnit 換成 MsTest

<specFlow>
  <unitTestProvider name="MsTest" />
</specFlow>

http://www.specflow.org/documentation/Executing-SpecFlow-Tests/

新增 SpecFlow Feature

在測試專案裡新增一個 SpecFlow Feature File ,副檔名為 *.feature
image

 

 

這裡就用來寫需求的地方

image

 

這個是預設的範本,我們先從這個範本開始

Feature 區段

  • In order to avoid silly mistakes:商業價值
  • As a math idiot:使用方式
  • I want to be told the sum of two numbers:代表目的

Scenario 區段

  • Given 關鍵字:可以當做環境設定,可以把它視為 3A 裡面的 Arrange 。
  • And 關鍵字:則用來連接上一個子句,以這邊的例子來說,就是環境設定包括了:『I have entered 50 into the calculator And I have entered 70 into the calculator』。
  • When 關鍵字:觸發的動作,可以把它視為 3A 裡面的 Act 。
  • Then 關鍵字:代表應該出現什麼結果,可以把它視為 3A 裡面的 Assert。

https://github.com/cucumber/cucumber/wiki/Feature-Introduction

Scenario 就是我們的需求,是可以被測試的,每一段文字都是步驟,SpecFlow 會去調用我們的 Unit Test Code / Product Code

產生 SpecFlow Step Definitions

規則相當的簡單,瞭解測試案例的撰寫規則後,就可以將它轉換成程式碼,接著在 SpecFlowFeature1.feature 按下右鍵,Generate Step Definitions

image

 

 

 

勾選要產生的步驟,按下 Generate 則會幫我們建立一個檔案

Note.若有新的需求新增,可以選擇按下Copy methods to clipboard,再貼上去目標檔案

image

 

 

最後,選擇存檔路徑,檔案要放在專案路徑下

image

image

 

 

 

最後生成出來的每一個方法都加上了一段 Attribute,分別對應到 SpecFlowFeature1.feature

image

 

更多內容:http://www.specflow.org/documentation/Bindings/

 

 

SpecFlowFeature1.feature 的 Scenario 會去找相對應的 Attribute ,有找到的就是白色,沒有找到的就是紫色,每一個步驟都可以透過 IDE 的 F12(移至定義),查看方法做了什麼事

image

 

 

SpecFlow 自動幫我們把 "數字" 轉成參數 (.*) ,代表的是傳入參數,若數字不想要轉成參數,把(.*)拿掉就好了

SpecFlow 只是會幫我們產生"殼","殼"是可以修改的,只要殼(Attribute)的描述跟 SpecFlowFeature1.feature 一致就可以

方法名稱不重要,重要的是 Attribute,Given、When、Then

常用的 Method 有:

  • ScenarioContext.Current.Set:佔存資料到 ScenarioContext 物件
  • ScenarioContext.Current.Get:從 ScenarioContext 物件取得資料

image

更多內容:http://www.specflow.org/documentation/Step-Definitions/

 

 

實作 SpecFlow Step Definitions

產生出來的殼,還沒辦法用,必須要自己實作

Scenario 之所以吸引我的原因,他能使用慣用語言,所以我將它改成中文

Scenario: 兩個數字相加
    Given 我在計算機輸入 50
    And 我計算機輸入 70
    When 我按下 Add 按鈕
    Then 螢幕上的結果應為 120

 

從需求角度出發思考:

MyUtility 類別不存在,它是我的 Product Code,所以是紅色,接著要手動產生出所需要的類別跟方法,這樣的寫法比較不浪費,所有的一切都是符合需求,一步一步慢慢實現

PS.初學者可以先準備好 Method,體會一下之中的奧妙

 

 

 

image

 

 

完整程式碼:

https://dotblogsamples.codeplex.com/SourceControl/latest#Simple.SpecflowHelloWorld/Simple.SpecflowHelloWorld/SpecFlowFeature1Steps.cs

 

 

Shift+Alt+F10 建立新的型別、方法

image

image

 

MyUtility.Calculation().Add 方法就是一個簡單的加法

public class Calculation
{
    public double Add(double first, double second)
    {
        return first + second;
    }
}

 

偵錯 SpecFlow Feature

在測試總管可以看到 Scenario,對著它按 Debug Selected Tests(除錯) 或是 Run Selected Test

image

 

 

需求偵錯

image

 

綠燈,通過測試

image

 


文章出自:http://www.dotblogs.com.tw/yc421206/archive/2014/12/22/147756.aspx

專案位置:https://dotblogsamples.codeplex.com/SourceControl/latest#Simple.SpecflowHelloWorld/

 

 

 

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo