本文

單元測試方法命名

單元測試的藝術內簡單得規範出一種一目了然的命名方式。

分為三個部分:

名稱 解釋
1、UunitOfWorkName(單元測試名稱) 被測試的方法、一組方法或一組類別。
2、Scenario(情境) 要測試的情境,例如:傳入 NULL、傳入字串。
3、ExpectedBehavior(預期的行為) 在測試情境指定的條件下,我們對測試結果的預期

單元測試名稱_情境_預期的行為,三個組成就是一個完整的句子。

接著我們就可以修改一下前次練習的測試方法名稱。

常用到的 Attribute

接下來介紹幾個比較常用到的 Attribute:

Attribute 用途
[TestMethod] 表示這是一個測試方法。
[OwnerName] 此測試方法的建立者。
[TestCategory] 測試的方法在哪個類別。
[TestProperty] 表示該方法是在哪個類別內的測試方法。
[Ignore] 驗證測試時會忽略該方法。
[ExpectedException] 驗證例外處理的 Attribute。

用法示範:

        [TestMethod()]                          //這是一個測試方法
        [Owner("Sian")]                         //此方法由Sian建立
        [TestCategory("Class1")]                //此測試方法在Class1這個類別
        [TestProperty("Class1", "GetUserName")] //此測試方法是Class1類別內的GetUserName
        public void GetUserName_輸入的UserName為空值_應回傳提示訊息()
        {
            //arrange
            var target = new Class1();
            var name = string.Empty;

            //act
            var actual = target.GetUserName(name);

            //assert
            Assert.AreEqual("請輸入使用者姓名!",actual);
        }

建立一個會有例外狀況的 Class。

        public string ExceptionTest(string name)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentNullException();
            }

            return $"Hi!{name},歡迎使用";
        }

撰寫測試方法。

        [TestMethod()]
        [Owner("Sian")]
        [TestCategory("Class1")]
        [TestProperty("Class1", "ExceptionTest")]
        [ExpectedException(typeof(ArgumentNullException))]
        public void ExceptionTest_輸入的UserName為空_應回傳ArgumentNullException()
        {
            //arrange
            var target = new Class1();
            string name = string.Empty;

            //act
            var actual = target.ExceptionTest(name);
        }

結果:

常見 Assert 類別

因為要介紹更好用的工具,這邊就跳過不介紹啦~~~~~
有興趣的同學請上MSDN參考。
Assert 連結
StringAssert 連結

FluentAssertions

到了此篇的重頭戲,FluentAssertions是一個超級好用的工具,可以讓程式碼變得更口語化,當然也可以讓測試方法可讀性更佳。

首先附上官方連結

看到介紹心不心動啊,寫測試就是可以這麼簡單。

接下來就實際用在我們的測試練習。

先到 Nuget 安裝 FluentAssertions 至我們的測試專案。

接著就可以動手改寫我們的測試程式。

        [TestMethod()]
        [Owner("Sian")]
        [TestCategory("Class1")]
        [TestProperty("Class1", "GetUserName")]
        public void GetUserName_輸入的UserName為空值_應回傳提示訊息()
        {
            //arrange
            var target = new Class1();
            var name = string.Empty;
            var expected = "請輸入使用者姓名!";

            //act
            var actual = target.GetUserName(name);

            //assert
            actual.Should().Be(expected);
        }

        [TestMethod()]
        [Owner("Sian")]
        [TestCategory("Class1")]
        [TestProperty("Class1", "GetUserName")]
        public void GetUserName_輸入的UserName為Null_應回傳提示訊息()
        {
            //arrange
            var target = new Class1();
            string name = null;
            var expected = "請輸入使用者姓名!";

            //act
            var actual = target.GetUserName(name);

            //assert
            actual.Should().Be(expected);
        }

        [TestMethod()]
        [Owner("Sian")]
        [TestCategory("Class1")]
        [TestProperty("Class1", "GetUserName")]
        public void GetUserName_輸入的UserName不為空_應回傳正確訊息()
        {
            //arrange
            var target = new Class1();
            string name = "Sian";
            var expected = $"Hi!{name},歡迎使用";

            //act
            var actual = target.GetUserName(name);

            //assert
            actual.Should().Be(expected);
        }

查看測試結果。

參考連結