单元测试中的期望值
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),您的测试就像由第二个人进行校对。您在代码中独立编写测试的预期结果。
因此,account1Balance
是 而不是 是通过您在代码中使用的相同公式计算出来的,这一点非常重要。正是这个公式可能有问题,编写测试是找出答案的一种方法。
经验法则:"Expected values should not contain any logic"。
- 如果代码中有错误,而我们在测试中使用相同的逻辑来计算期望值,我们正在复制
错误。
- 计算期望值的逻辑可能存在缺陷,因此我们最终在测试代码中出现了错误。
- 考虑到可读性,更容易理解硬编码的值。
这有好处Roy Osherove's blog post "Two different ways to create bad logic 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),您的测试就像由第二个人进行校对。您在代码中独立编写测试的预期结果。
因此,account1Balance
是 而不是 是通过您在代码中使用的相同公式计算出来的,这一点非常重要。正是这个公式可能有问题,编写测试是找出答案的一种方法。
经验法则:"Expected values should not contain any logic"。
- 如果代码中有错误,而我们在测试中使用相同的逻辑来计算期望值,我们正在复制 错误。
- 计算期望值的逻辑可能存在缺陷,因此我们最终在测试代码中出现了错误。
- 考虑到可读性,更容易理解硬编码的值。
这有好处Roy Osherove's blog post "Two different ways to create bad logic in unit tests"