單元測試─單元測試的命名原則與3A

單元測試

我們以LogAnalyzer專案為例(註記:自單元測試的藝術)

    public class LogAnalyzer01Tests
    {
        [SetUp]
        public void Setup()
        {
        }

        [Test]
        public void IsValidLogFileName_BadExtension_ReturnFalse()
        {
            LogAnalyzer analyzer = new LogAnalyzer();
            bool result = analyzer.IsValidLogFileName("filewithbadextension.foo");
            Assert.False(result);
        }

        [Test]
        public void IsValidLogFileName_goodExtensionUppercase_ReturnsTrue()
        {
            LogAnalyzer analyzer = new LogAnalyzer();
            bool result = analyzer.IsValidLogFileName("filewithbadextension.log");
            Assert.True(result);
        }
    } 
    //專案代碼
    class LogAnalyzer
    {
        public bool IsValidLogFileName(string fileName)
        {
            if (!fileName.EndsWith(".log",System.StringComparison.CurrentCultureIgnoreCase))
            {
                return false;
            }
            return true;
        }
    }

一個單元測試包含三種行為

  1. 準備 (Arrange) 物件、建立物件、進行必要的設定
  2. 操作 (Act) 物件
  3. 驗證 (Assert) 某件事符合預期


首先來看單元測試的命名部分:[UnitOfWorkName]_[ScenarioUnderTest]_[ExpectedBehavior]

範例

        [Test]
        public void IsValidLogFileName_BadExtension_ReturnFalse()
        {
            //Arrange
            LogAnalyzer analyzer = new LogAnalyzer();
            //Act
            bool result = analyzer.IsValidLogFileName("filewithbadextension.foo");
            //Assert
            Assert.False(result);
        }
  • UnitOfWorkName:被測試的方法、一組方法或一組類別,EX:IsValidLogFileName
  • ScenarioUnderTest:測試進行的假設條件,常見案例:登入成功,EX:BadExtension
  • ExpectedBehavior:測試場景指定條件下,對於被測試方式的預期,EX:ReturnFalse。

以這個為例IsValidLogFileName_BadExtension_ReturnFalse,就可以從字面上翻譯成是否為log檔案名稱,測試使用錯誤資料,預期回傳false

例如:Member_LoginSuccess_ReturnTrue 字面翻譯成會員登入成功,回傳true。

元哥的筆記