gpt4 book ai didi

c# - 如何在具有多个间接级别的项目中使用单元测试

转载 作者:可可西里 更新时间:2023-11-01 09:07:26 25 4
gpt4 key购买 nike

我正在查看一个非常强调单元测试的现代项目。根据古老的格言“面向对象编程中的每个问题都可以通过引入新的间接层来解决”,该项目采用了多层间接。副作用是相当多的代码如下所示:

public bool IsOverdraft)
{
balanceProvider.IsOverdraft();
}

现在,由于强调单元测试和保持高代码覆盖率,每段代码都有针对它编写的单元测试。因此这个小方法将有三个单元测试。那些会检查:

  1. 如果 balanceProvider.IsOverdraft() 返回 true 那么 IsOverdraft 应该返回 true
  2. 如果 balanceProvider.IsOverdraft() 返回 false,那么 IsOverdraft 应该返回 false
  3. 如果 balanceProvider 抛出异常,那么 IsOverdraft 应该重新抛出相同的异常

更糟糕的是,模拟框架使用 (NMock2) 接受方法名称作为字符串文字,如下所示:

NMock2.Expect.Once.On(mockBalanceProvider)
.Method("IsOverdraft")
.Will(NMock2.Return.Value(false));

这显然使“红色、绿色、重构”规则变成了“红色、绿色、重构、在测试中重命名、在测试中重命名、在测试中重命名”。使用不同的模拟框架(如 Moq)将有助于重构,但它需要扫描所有现有的单元测试。

处理这种情况的理想方法是什么?

A) 保持较小的层级,以便不再发生那些转发调用。

B) 不要测试那些转发方法,因为它们不包含业务逻辑。出于覆盖目的,将它们全部标记为 ExcludeFromCodeCoverage 属性。

C) 只测试是否调用了正确的方法,而不检查返回值、异常等。

D) 忍住,继续写那些测试 ;)

最佳答案

B 或 C。这就是这种通用要求的问题(“每个方法都必须进行单元测试,需要覆盖每一行代码”)- 有时,它们提供的好处不值得成本。如果这是您提出的,我建议您重新考虑这种方法。 “我们必须有 95% 的代码覆盖率” 在纸面上可能很有吸引力,但实际上它很快就会产生像您遇到的问题。

此外,您正在测试的代码是我称之为普通代码的东西。对其进行 3 次测试很可能是矫枉过正。对于那一行代码,您将不得不再维护 40 行左右。除非您的软件是关键任务(这可能解释了高覆盖率要求),否则我会跳过这些测试。

其中一个(恕我直言)most pragmatic advices on this topic是 Kent Beck 不久前在这个网站上提供的,我在我的博客文章中对这些想法做了一些扩展 - What should you test?

关于c# - 如何在具有多个间接级别的项目中使用单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14420128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com