【BDD】整合測試BDD (一)
/
0 Comments
前言
在專案經過單元測試後,雖然程式中小單位的測試已經能提升程式碼的品質,但真正對使用者或PM來說,"功能"能否正常運作、運算是否符合當初設計的邏輯,這才是PM們真正關心的,單元測試涵蓋率很高,能想到的都寫了單元測試,但功能究竟是不是對的,光靠單元測試你無法說服PM,需要提出PM能看懂的功能測試報表,才能真正讓PM了解你的程式確實符合他要的,所以今天要介紹的就是整合測試BDD。在開始BDD實作前,先介紹一個BDD會使用到的套件 SpecFlow ,在VS中使用擴充功能及更新加入
接著進入實際專案:
方案中新建一個單元測試專案在專案中加入新增項目,前面提到要在VS中擴充裝上SpecFlow,這樣你在加入新項目時才選的到SpecFlow相關項目
接著在專案中加入一個feature項目,在加入feature後,請在專案安裝SpecFlow套件,build專案才會正常。這裡我用的範例為一個簡單的聊天功能範例,想像有一個類似line的軟體功能,你需要驗證他的聊天是否能正常傳送資料給他聊天的對象。
Feature內容如下,最下方的Examples是你在run這個情境時需要用到的參數(也就是你在Scenario區段中寫到的參數名稱)
Feature: ChatList In order to 驗證聊天訊息傳送 As a 傳送訊息者 I want to 檢查聊天紀錄資訊,紀錄中是否有此傳入的訊息 檢查聊天室列表,剛此聊天室是否呈現在列表最上方 @mytag Scenario Outline: 驗證聊天訊息傳送 Given 會員的ClientID "<MemberClientID>" And 輸入聊天室ID為 "<ChatRoomID>" When 傳送訊息 Then 聊天室聊天紀錄須包含此傳入的訊息 "<Message>" And 此聊天室必須在聊天室列表最上方 Examples: | MemberClientID | ChatRoomID | Message | | memberidxxx | chatroomidxxx | testmessagexxx |
在Scenario底下的描述點右鍵選擇 "Generate Step Definitions"產出Step檔,存在你要放置的位子,並開啟Step檔案。
Step的內容如下,基本上就是按照Feature裡的語意來寫Step的code,以下方的第一個Given方法為例,要傳入第一個參數"會員的ClientID"
[Given(@"會員的ClientID ""(.*)""")]
public void Given會員的ClientID(string memberClientID)
{
ScenarioContext.Current.Set<string>(memberClientID,"ClientID");
}
接著傳入第二個參數"聊天室ID"
[Given(@"輸入聊天室ID為 ""(.*)""")]
public void Given輸入聊天室ID為(string chatRoomID)
{
ScenarioContext.Current.Set<string>(chatRoomID, "ChatRoomID");
}
接著就是類似單元測試的3A原則來寫剩下的When和Then
[When(@"傳送訊息")]
public void When傳送訊息()
{
//arrange
var clientID = ScenarioContext.Current.Get<string>("ClientID");
var chatRoomID = ScenarioContext.Current.Get<string>("ChatRoomID");
//act
//1.取聊天室紀錄
var chatDetail = ChatService.GetChatDetail(chatRoomID);
//2.取聊天室列表
var chatList = ChatService.GetChatList(clientID);
ScenarioContext.Current.Set<ChatDetailResult>(chatDetail, "ChatDetail");
ScenarioContext.Current.Set<ChatListResult>(chatList, "ChatList");
}
最後補上Then
[Then(@"聊天室聊天紀錄須包含此傳入的訊息 ""(.*)""")]
public void Then聊天室聊天紀錄須包含此傳入的訊息(string message)
{
//assert
var chatDetail =
ScenarioContext.Current.Get<ChatDetailResult>("ChatDetail");
chatDetail.MsgList.Any(x => x.Content == message).Should().BeTrue();
}
[Then(@"此聊天室必須在聊天室列表最上方")]
public void Then此聊天室必須在聊天室列表最上方()
{
//assert
var chatRoomID = ScenarioContext.Current.Get<string>("ChatRoomID");
var chatList =
ScenarioContext.Current.Get<ChatListResult>("ChatList");
var result = chatList.Take(1).Where(x => x.ID == chatRoomID);
result.Should().NotBeNull();
}