Day 8-单元测试完善 HelloBank、基础总结与核心技术概述 (基础-7)

单元测试基础的示范专案 HelloBank 收尾与现阶段总结

我们在Day 4-Visual Studio 环境安装与介绍第一只测试专案 HelloBank (单元测试基础-3)曾提过 HelloBank 的商业逻辑如下:

https://ithelp.ithome.com.tw/upload/images/20210908/20127378oH7Y9m0n0K.png

针对商业逻辑,本次测试专案方向是检测 BankAccount 里面的商业逻辑(存款、取款与转帐);而测试项目中也分成检测正常情况的结果(Day-5)与不合理情况的例外是否预期 (Day-7),然後为了精简程序码的书写,把所有测试 Arrange 都会新增的 Account 物件撰写在 SetUp 阶段 (Day-6)。

因此,从实务上来分析商业逻辑需检测的项目,应如下面所列的项目:

  1. 提款
    A. 正常情况的提款功能
    B. 提款为负数的情况
  2. 取款
    A. 正常情况的取款功能
    B. 取款为负数的情况
    C. 取款大於现有金额的情况
  3. 转帐
    A. 正常情况的转帐功能
    B. 转帐给不存在的帐户情况

针对提款与存款测试方法实作可参照这几天的范例,接下来针对最後的转帐功能撰写测试,而转帐与提款、取款差别在於,转帐在 Arrange 阶段需准备另一个 BankAccount 物件,若不存在需有例外处理,如下:

// 正常情况的转帐功能
[Test]
public void Transfering_Funds_Updates_Both_Account()
{
    // Arrange
    otherAccount = new BankAccount();

    // Act
    account.TransferFundsTo(otherAccount, 500);

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

// 转帐给不存在的帐户情况
[Test]
public void Transfering_To_Non_Existing_Account_Throws()
{
    // Act + Assert
    Assert.Throws<ArgumentNullException>(() => account.TransferFundsTo(null, 2000));
}

总结目前单元测试基础系列的文章,学到了以下几点:

原始码可参照这两只 GitHub 专案:
Day-8 StartUp:https://github.com/SunShineYen/HelloBankDay8-StratUp
Day-8 Final:https://github.com/SunShineYen/HelloBankDay8-Final


单元测试核心技术概述

接下来的章节,会来开始探讨实务面上必然会遇见的问题;举例来说,我们所撰写的商业逻辑几乎都会引用第三方套件,第三方套件的出现会影响我们对测试的掌握度(换言之,就是可能套件出错导致测试没过)。因此,会探讨如何使用假物件(Fake)的概念来把第三方套件的因素滤除。

如何在适当的时机点把第三方套件替换就需要考虑系统本身的设计框架,也就是俗称的 Design Pattern(接下来的文章会以工厂模式为范例,若有余力会进一步讨论几个作者工作上常用的设计模式);而抽离的手法也是有数种方式,而且还会依据手法的不同,对商业逻辑的干涉产生一定程度上的变化。

最後对於假物件有一定的认知之後,在实务上很可能会遇到需要建置大量的假物件,若采用人工的方式刻写类别,很容易造成程序码的复杂化,进而导致维护成本提高;因此,会核心技术後半段会介绍隔离框架 NSubstitute 并导入范例中,体会使用隔离框架与自己撰写上的差异。


<<:  Day 6 : Github issue与project

>>:  [Day04] - 新拟物风按钮(二) - shadow dom 介绍

Mysql执行成本-Part2(连接查询的成本、调节成本常数)

方便後续解释概念,我们在创建一个跟原先single_table一样的表,叫single_table2...

系统分析师的养成之路—案例分享(1)

上周我跟大家分享了系统分析师必须具备的「观察」、「商业思维」、「聆听」共3个软实力,但在讲述下一个主...

css visibility

今天介绍visibility的两个属性:visible和hidden visibility只控制物件...

D04 / 可不可以用 ConstraintLayout - ConstraintLayout

今天大概会聊到的范围 Constraint Layout in Compose 上一篇提到,有 R...

以Postgresql为主,再聊聊资料库 PostgreSQL last N in-table cache 探讨

PostgreSQL last N in-table cache 探讨 前些天对悠游卡储值时,加值机...