如何强制一个类为每个公共方法获得一个UnitTest

本文关键字:一个 方法 UnitTest 何强制 | 更新日期: 2023-09-27 18:09:21

我们现在开始使用UnitTests来提高我们的代码质量,当然还有其他不同的原因。遗憾的是,我们来得太晚了,所以我们有大约50个方法的类,直到现在还没有完全测试过。我们有很多课!

这是可能的/怎么可能的?
A)看看哪些方法是未经测试的?
b)强迫一个向类中添加方法的开发人员为它编写单元测试(例如,我实现了测试所有50个方法,而明天有人添加了51个方法)。方法)?
C)当方法未经测试时发出警告或错误?

如何强制一个类为每个公共方法获得一个UnitTest

a)查看哪些方法未经过测试?

使用代码覆盖工具这是相当容易的。Visual Studio内置了一个,但也有其他选项。

b)强迫一个向类中添加方法的开发人员为它编写单元测试(例如,我实现了测试所有50个方法,明天有人添加了51个方法。方法)?

不要根据覆盖率制定硬性规则!

所有的经验(包括我的)表明,如果您设置了硬代码覆盖目标,您将得到的唯一结果是开发人员将开始对系统进行博弈。结果将是更糟糕的代码。

这里有一个例子;考虑以下Reverse方法:

public static string Reverse(string s)
{
    char[] charArray = s.ToCharArray();
    Array.Reverse(charArray);
    return new string(charArray);
}

您可以编写一个测试来获得该方法的100%覆盖率。然而,正如这里给出的,实现是脆弱的:如果snull会发生什么?该方法将抛出一个NullReferenceException

一个更好的实现是检查s是否为null,并添加一个分支来处理这种情况,但是除非你为它写一个测试,否则代码覆盖率会下降。

如果您有不想编写测试的开发人员,但是您要求硬性的代码覆盖率目标,这样的开发人员将保留Reverse函数,而不是改进它。

我在野外见过这样的系统游戏。如果你制定了一个没有得到开发人员认可的规则,那么将会发生。

你需要告诉开发人员,如果他们添加好的单元测试,他们的工作将变得更容易。

一旦开发人员理解了这一点,他们就会自己添加测试,而您不需要任何规则。

只要开发人员不理解这一点,这个规则只会对你造成更大的伤害,因为你从中得到的"测试"将是在不理解的情况下编写的。

c)在方法未测试时引发警告或错误?

正如上面所解释的,如果将代码覆盖率用于绝对度量,那么它是一个很差的工具。另一方面,如果您开始监视趋势,它可能很有用。

一般来说,代码覆盖率应该增加,直到达到一个平台,在这个平台上再增加代码覆盖率是不切实际的。

有时,它甚至可能下降,这是可以接受的,只要有一个很好的理由。监视覆盖率趋势将告诉您覆盖率何时下降,然后您可以进行调查。有时候,这是一个很好的理由(例如当有人添加一个Humble Object时),但有时候,这并不是一个很好的理由,你需要与负责删除的开发者进行交谈。

要查看哪些方法未经过测试,有代码覆盖工具(内置的或外部的,如NCrunch, dotCover)。这取决于你的需要根据结果格式,报告等。

这些工具可以在VS上运行,也可以在构建服务器(如TeamCity, Bamboo)上运行。当代码覆盖率降低时,构建可以设置为失败(这在某种程度上回答了您的c)问题)。

在我看来,你应该强迫开发人员用一些插件来编写单元测试。它应该是过程的一部分,可以在代码审查期间指出。更重要的是—您如何知道何时强制编写测试?我的意思是——你不知道开发过程什么时候结束,所以很难告诉别人"正确地编写测试"。

编辑:如果你想为TC提供一些免费的代码覆盖工具,我知道的一个是OpenCover——你可以很容易地找到一些关于插件安装和使用的信息。

这很有趣,你的B部分"强迫开发人员添加…"是我几分钟前发布的一个问题,我得到了太多的反对投票,我删除了这个问题,因为很明显,强迫别人写测试不是正确的方法,它应该是你在组织中设置的一种"文化"。

所以对于你的问题(有点宽,但仍然可以得到一些方向):

。你可以使用现有的代码覆盖工具/库或实现自己的功能来实现这个功能,这是一个很好的帖子,其中提到了一些。我可以用什么来为c#/.NET提供高质量的代码覆盖?

您可以基于这样的库构建自定义,以帮助实现c节的答案(当方法未经测试时引发警告或错误)。

b。如果可以的话,您应该尝试实现TDD,并在编写方法之前编写测试,这样您就不必强制执行任何操作。如果由于时间和资源的考虑而无法更改方法,那么就执行TED(最终开发的测试)。

这不是一个单元测试,但你仍然有一个有价值的测试。