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

}


You may also like

沒有留言: