单元测试中的期望值

Expected values in unit tests

我正在为 MVC 5 互联网应用程序编写一些单元测试。

我应该在 Assert 代码行中硬编码预期值,还是在输入值发生变化之前计算该值。

这是一个例子:

我有一个函数可以从 Account 对象中减去正确的余额,其中 Account 对象有一个 subscriptionCostPerDay 和一个 accountBalance.

代码如下:

account1.subscriptionCostPerDay = 0.99M;
account1.accountBalance = 10;

我正在测试的函数计算 subscriptionCostPerDay 并从 accountBalance 中减去它。在上面的例子中,函数调用后 accountBalance 应该是 9.01。

Assert 语句应该硬编码 9.01 的值,还是应该根据原始对象值计算预期值?

以下是我在上面提到的两种不同类型的示例:

1.

Assert.AreEqual(9.01M, account1Balance, "Account 1 has correct account balance");

2.

decimal expectedAccount1Balance = account1.accountBalance - account1.subscriptionCostPerDay;

Assert.AreEqual(expectedAccount1Balance, account1Balance, "Account 1 has correct account balance");

提前致谢。

单元测试有两个目标:

  1. 第一次测试不成功时查找代码中的错误
  2. 确保您的代码在未来时刻保持正确

为了实现目标 (1),您的测试就像由第二个人进行校对。您在代码中独立编写测试的预期结果。

因此,account1Balance 而不是 是通过您在代码中使用的相同公式计算出来的,这一点非常重要。正是这个公式可能有问题,编写测试是找出答案的一种方法。

经验法则:"Expected values should not contain any logic"。

  1. 如果代码中有错误,而我们在测试中使用相同的逻辑来计算期望值,我们正在复制 错误。
  2. 计算期望值的逻辑可能存在缺陷,因此我们最终在测试代码中出现了错误。
  3. 考虑到可读性,更容易理解硬编码的值。

这有好处Roy Osherove's blog post "Two different ways to create bad logic in unit tests"