Day 5-单元测试 3A 原则 (Arrange, Act 和 Assert) (基础-4)

专案架构介绍

从图中可以看到 HelloBank 方案当中有两只专案,一只是 HelloBank 专案(对应於软件开发就是商业逻辑开发的 Library);另一支专案则是 HelloBankTest,是测试 HelloBank 的单元测试专案。GitHub HelloBank Startup 的专案已提供 HelloBank 的原始码;因此我们会将焦点放在 HelloBankTest 这只类别上。

https://ithelp.ithome.com.tw/upload/images/20210905/20127378qmaD0slgo6.png


在进行 3A 原则前,先了解常用的语法 [TestFixture], [Test] 和 [TestCase]

依据 NUnit Docs 官方网站提供了这几个语法的定义。

[TestFixture]:This is the attribute that marks a class that contains tests and, optionally, setup or teardown methods.

[Test]:The Test attribute is one way of marking a method inside a TestFixture class as a test. It is normally used for simple (non-parameterized) tests but may also be applied to parameterized tests without causing any extra test cases to be generated.

[TestCase]:TestCaseAttribute serves the dual purpose of marking a method with parameters as a test method and providing inline data to be used when invoking that method.

就我目前使用的观点来说,[TestFixture] 是注记这个类别是 NUnit 测试的类别,[Test] 与 [TestCase] 都是注记该方法为要执行的测试单元,两者最大的差别在於测试单元是否需要代入参数(若相同的测试单元需要做大量不同的案例测试,就会使用 TestCase)。


设定第一只单元测试的目标

做完初始化的 NUnit 设定,接下来可以开始撰写第一支单元测试。

而这次的预设情境是现在有位使用者在帐户上存了一笔钱,我们要在测试中检测使用者存进去的钱是否符合预期的结果,因此,把提供的 Startup 专案中的 Test1 改成如下的写法:

[Test]
public void Adding_Funds_Updates_Balance()
{
    // Arrange
    
    // Act
    
    // Assert
    
}

3A 原则之一 — Arrange (准备):建立物件。

Arrange 阶段就是新增物件,以方便後面的阶段呼叫类别的属性或方法,写法如下:

[Test]
public void Adding_Funds_Updates_Balance()
{
    // Arrange
    BankAccount account = new BankAccount(1000);

    // Act

    // Assert

}

目前此范例是呼叫自己撰写的建构子方法建构新的物件;然而,现今实际开发系统时,大多是引用第三方套件新增物件,仅少许时候是呼叫自己开发的类别;因此,在之後「单元测试-核心技术」阶段,会进一步探讨在 Arrange 阶段,如何导入假物件 (Fake),假物件中又分了虚设常式 (Stub) 与模拟物件 (Mock)。


3A 原则之二 — Act (执行):操作物件。

Act 阶段为利用物件处理商业逻辑,处理完商业逻辑後再将结果传至验证阶段,写法如下:

[Test]
public void Adding_Funds_Updates_Balance()
{
    // Arrange
    BankAccount account = new BankAccount(1000);

    // Act
    account.Add(500);

    // Assert

}

此范例利用帐户里面的存款功能,在这新帐户储存了 500 元,而原先帐户有 1000 元。因此,最终的帐户余额应有 1500 元。


3A 原则之三 — Assert (验证):验证物件是否符合预期结果。

Assert 阶段是验证其成果是否符合开法者的想法,如同单元测试的艺术提到Assert 类别是商业逻辑的程序码与 NUnit 测试框架中间的桥梁,用来确认在该假设下某个期望应该成立,写法如下:

[Test]
public void Adding_Funds_Updates_Balance()
{
    // Arrange
    BankAccount account = new BankAccount(1000);

    // Act
    account.Add(500);

    // Assert
    Assert.AreEqual(1500, account.Balance);
}

一只优秀的单元测试很大的重点就在於如何做最後的验证,除了范例中利用的回传值验证方式,在单元测试的艺术还有提到两种验证方式:基於状态的测试(俗称状态验证)和与相依物件之间的互动,同样也会在「单元测试-核心技术」阶段做进一部探讨。

最後,写完这段程序码之後,就可以进行第一次的测试了。

以下分别提供 Windows 与 Mac 如何执行测试的画面截图:

Windows:

(1) 点开测试并执行所有测试:
https://ithelp.ithome.com.tw/upload/images/20210905/20127378b7jST20Zz4.png

(2) 查看测试结果:
https://ithelp.ithome.com.tw/upload/images/20210905/20127378Dobfa9kLTK.png

Mac:

(1) 点开检视:
https://ithelp.ithome.com.tw/upload/images/20210905/20127378oYmT4sA8ek.png

(2) 点开测试并执行:
https://ithelp.ithome.com.tw/upload/images/20210905/20127378IpzwOjtrg9.png

(3) 查看测试结果(右侧或下侧都可以观看结果):
https://ithelp.ithome.com.tw/upload/images/20210905/20127378kPX8RZtDNf.png


<<:  [Day05] JavaScript - 资料型别

>>:  Day05:资料结构 - 堆叠(Stack)

Day12 主动情蒐-确认目标 metasploitable 3 的 IP

因为之後需要确认目标 IP ,因此以下以图解的方式,带大家确认靶机的 IP,笔者使用 Window...

R语言-1-关於R

这是关於在 hahow-开启资料科学的学习大门 - R入门教学-课程的心得。 Day1 关於R R由...

谈谈Fragment

从Android 3.0(API11) 起,Google 支援Fragment。今天稍微说说什麽是F...

DevOps 组别

DevOps 组别 https://wolkesau.medium.com/devops-组别-37...

[Day-16] R语言 - 分群应用(一) GMM数值补值-上 ( Fill.NA with GMM in R.Studio )

您的订阅是我制作影片的动力 订阅点这里~ 影片程序码 (延续昨天) #演算法 library(Clu...