【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(); }