這一篇的草稿是在半年前就建立,可能更久,我也忘了是什麼原因沒有寫完,圖片可能會有不一致的情況,不過應該不影響,一上完 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
- 新增 SpecFlow Feature
- 產生 SpecFlow Step Definitions
- 實作 SpecFlow Step Definitions
- 偵錯 SpecFlow Feature
1.從擴充工具裡面 安裝 SpecFlow
2.新增測試專案,並在專案裡面安裝 SpecFlow from Nuget
3.安裝完 SpecFlow 後在 App.config 裡有一個超連結,點選它
把下圖紅框處貼到專案裡,預設 Specflow是跑 NUnit Test,現在要改成 MSTest
其實重點,只是把預設的 NUnit 換成 MsTest
<specFlow>
<unitTestProvider name="MsTest" />
</specFlow>http://www.specflow.org/documentation/Executing-SpecFlow-Tests/
在測試專案裡新增一個 SpecFlow Feature File ,副檔名為 *.feature
這裡就用來寫需求的地方
這個是預設的範本,我們先從這個範本開始
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
規則相當的簡單,瞭解測試案例的撰寫規則後,就可以將它轉換成程式碼,接著在 SpecFlowFeature1.feature 按下右鍵,Generate Step Definitions
勾選要產生的步驟,按下 Generate 則會幫我們建立一個檔案
Note.若有新的需求新增,可以選擇按下Copy methods to clipboard,再貼上去目標檔案
最後,選擇存檔路徑,檔案要放在專案路徑下
最後生成出來的每一個方法都加上了一段 Attribute,分別對應到 SpecFlowFeature1.feature
更多內容:http://www.specflow.org/documentation/Bindings/
SpecFlowFeature1.feature 的 Scenario 會去找相對應的 Attribute ,有找到的就是白色,沒有找到的就是紫色,每一個步驟都可以透過 IDE 的 F12(移至定義),查看方法做了什麼事
SpecFlow 自動幫我們把 "數字" 轉成參數 (.*) ,代表的是傳入參數,若數字不想要轉成參數,把(.*)拿掉就好了
SpecFlow 只是會幫我們產生"殼","殼"是可以修改的,只要殼(Attribute)的描述跟 SpecFlowFeature1.feature 一致就可以
方法名稱不重要,重要的是 Attribute,Given、When、Then
常用的 Method 有:
- ScenarioContext.Current.Set:佔存資料到 ScenarioContext 物件
- ScenarioContext.Current.Get:從 ScenarioContext 物件取得資料
更多內容:http://www.specflow.org/documentation/Step-Definitions/
產生出來的殼,還沒辦法用,必須要自己實作
Scenario 之所以吸引我的原因,他能使用慣用語言,所以我將它改成中文
Scenario: 兩個數字相加
Given 我在計算機輸入 50
And 我計算機輸入 70
When 我按下 Add 按鈕
Then 螢幕上的結果應為 120
從需求角度出發思考:
MyUtility 類別不存在,它是我的 Product Code,所以是紅色,接著要手動產生出所需要的類別跟方法,這樣的寫法比較不浪費,所有的一切都是符合需求,一步一步慢慢實現
PS.初學者可以先準備好 Method,體會一下之中的奧妙
完整程式碼:
Shift+Alt+F10 建立新的型別、方法
MyUtility.Calculation().Add 方法就是一個簡單的加法
public class Calculation
{
public double Add(double first, double second)
{
return first + second;
}
}
在測試總管可以看到 Scenario,對著它按 Debug Selected Tests(除錯) 或是 Run Selected Test
需求偵錯
綠燈,通過測試
文章出自: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