Day 6-单元测试 NUnit 更多常用的特性-1 (基础-5)

Setup 和 Teardown

在单元测试的艺术提到:进行单元测试时,很重要的一点是确保之前测试过程中所遗留下来的资料或执行个体得以销毁,新的测试执行时,状态是重置过的,就像没有执行过测试一般

换言之,单元测试之间,必须是互相独立的,不会因第一个单元测试的参数设定而影响到其他的单元测试。所以执行测试时,执行前会做设定的动作(SetUp)与清理单元测试完的参数(TearDown)。因此,撰写多个测试时且有共同的变数,则可以在 SetUp 和 Teardown 撰写程序码,如下:

[TestFixture]
public class UnitTests
{
    // 新增 account 变数
    private BankAccount account = null;

    [SetUp]
    public void Setup()
    {
        // 两只单元测试的初始化 Arrange 一致
        account = new BankAccount(1000);
    }        

    [Test]
    public void Adding_Funds_Updates_Balance()
    {
        // Act
        account.Add(500);

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

    // 第二只单元测试,检测提款是否符合预期
    [Test]
    public void Withdrawing_Funds_Updates_Balance()
    {
        // Act
        account.Withdraw(500);

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

    // 谨在此示范 TearDown 写法,明後天完善这个 HelloBankTest 测试专案,不会撰写这段
    [TearDown]
    public void TearDown()
    {
        // 将 account 重新设定为 null
        account = null;
    }
}

实务上其实大多时候 TearDown 的动作算是多此一举;以本例来说,因为在执行完存款後,准备执行提款的测试前,会经由 Setup 把 account 重新指定新的物件。然而,在单元测试的艺术书中有提到一种情况是需要 TearDown,就是需要在测试之间「重设」一个静态变数或单例(Singleton)的状态。

另一方面,SetUp 可以简化很多单元测试准备物件的程序码(假设要验证一百种情况,皆都是需要设定一样的 account,则透过 SetUp 就可以精简上百行的程序码);但 Roy Osherove 提醒若随着单元测试的复杂性越来越高,则可能会使得 SetUp 变成难以维护的方法之一。


Ignore

使用 Ignore 忽略测试,最常见的例子为在 CI/CD 上版时发现部分测试尚未通过(但非需急迫性测试),又或是因升级版本(之前有在学 Pytest,曾遇过 Python 2 转 Python 3 而导致测试错误)等等情况,需要先忽略其测试,就会需要用到 Ignore,程序码如下:

[Test]
[Ignore("This is an example for ignore demo")]
public void Transfering_Funds_Updates_Both_Account()
{ 
    // Nothing...
}

然後观看测试成果,可以看到如图:

https://ithelp.ithome.com.tw/upload/images/20210906/20127378ByhEJdrnjz.png


<<:  用html和css做出网页的标题栏

>>:  【第六天 - Bubble Sort 介绍】

GitHub Action YAML - 语意解析与指令说明

GitHub Action 的 workflow 是以 YAML 档案进行设定 (副档名为 .yml...

2.4.9 Design System - Input Checkbox/Radiobox

人生真的很奇妙 可能在某个时间轴曾经跟某个人的时间轴交错 但当下是不认识的 然後在几年过後又再次交...

[Lesson21] Kotlin - 宣告变数

Kotlin 的基本资料型态与 Java 相同,包括:Byte、Short、Int、Long、Flo...

Day#07 新增(2)

前言 接续着前一天没做完的新增功能,今天继续接着做~边做也一边介绍用到的方法与程序码。 Storyb...

AI ninja project [day 15] 文字处理--BERT分类

参考页面: https://www.tensorflow.org/text/tutorials/cl...