我在一家在其中进行单元测试的公司工作。如果单元测试失败,则构建失败。这种做法的优点和缺点是什么?

评论

Google对此事的看法:googletesting.blogspot.com/2011/06/…

#1 楼

我们在签入之前运行单元测试,并将其作为大型测试套件的一部分在每个每日构建(功能分支)和每周构建(主分支;多个功能分支聚合)中重新运行。我们发现包括:


构建中断更少,主构建中断几乎为零
组件/集成级别测试的附加测试覆盖范围
通过识别孤立地通过但在实验室运行中失败或在不同语言版本上失败的测试(测试用例可靠性)
,并在测试过程中积极吸引开发人员
使单元测试对整个团队透明(如果UT失败,则会记录错误)

一些潜在的注意事项


如果您认为增加代码覆盖率= =更好的测试,并且可能掩盖标记为覆盖区域的分析(如果进行白盒结构分析)
增加了测试运行时间(可能是在资源有限的小型商店中起诉)

评论


很好的覆盖过程!这涵盖了我在构建时不时遇到的许多问题。

– MichaelF
11年6月20日在17:23

我要添加的好处是:如果有人意外地还原了代码,或者对现有代码进行了新功能的更改并最终破坏了现有功能,则功能退化将减少。

– Chuck van der Linden
2011年6月23日下午5:05

#2 楼

单元测试应始终作为构建的一部分运行。在我们的项目中,我们已经这样做了2年多,其收益总是大于弊端。不仅这些与构建一起运行,而且我们具有适当的检查,当覆盖率低于某个特定阈值时,该构建就会中断构建(尽管我在代码覆盖方面对Bj表示赞同!=良好测试)。我们看到的一些好处:


这给团队带来了紧迫感,使单元测试始终保持绿色,否则构建会中断。这样可以减少开发人员在一段时间内的破坏构建,而可以在提交代码之前在执行单元测试时更加严格地执行代码。可以使用Sonar之类的工具在一段时间内分析覆盖率和单元测试执行趋势,以检测出灰点并确定需要改进的地方。 CI。
它是您的第一道防线,以防您需要“连续交付”之类的东西,使软件在投入生产之前会经过许多自动的关卡/检查(整个过程的大部分自动)。
这样更透明,有效。(想想分布在全球各地的分布式团队在不同时区以相同的代码库工作)
它是您的单位级回归套件(应该添加一个错误)作为单元级别的测试)。

一些需要注意的事情:


代码覆盖率具有误导性,因为覆盖率只有80%意味着从未测试过20%的代码。因此,单元测试应该是有意义的,并且只有在与构建一起运行时才有用。构建如此之多,以至于无法获得任何有意义的快速反馈。


#3 楼

在由多个开发人员组成的团队中。


在检查代码之前,每个开发人员都应对他们的模块进行单元测试
代码集成后,需要执行冒烟测试/基本测试用例以验证集成代码工作正常

以下是在将构建提供给QA团队之前运行单元测试用例的优点。


构建甚至可能成功,并且单元测试也可能失败。在将构建提供给QA团队之前可能会发现这种情况
,这将有助于确定是否由于构建中缺少文件而导致失败
运行单元测试很好,您也可以运行基本的P1案例以确保功能正常工作
更早地检测到错误,降低了修复它所需的成本


评论


我不明白“构建可能会成功甚至单元测试也会失败”。你能澄清一下吗?

–user246
11年6月20日在13:20

当然,假设您已经修改了10个数据库文件,在构建中仅检查了8个。您的构建已成功部署,但是所需的2个文件没有进入构建。在这种情况下,您的构建将通过,但测试用例将失败。构建成功部署并不意味着基本的p1情况会通过。

–西瓦
2011年6月20日13:44

我猜这取决于您如何定义“构建将通过”,如果您将成功的构建定义为可以编译并通过所有测试的构建,则不会发生这种情况。

– MichaelF
2011年6月20日17:25

说“可以成功地编译和构建代码”可能更好或更清楚,这意味着流程本身不会产生错误,但是单元测试(验证代码是否执行了正确的行为)失败。

– Chuck van der Linden
2011年6月23日下午4:59

#4 楼

为了便于讨论...正确完成单元测试存在一些实际缺点-


每个新功能都应添加新测试,并且您不能发布代码在测试准备就绪之前(我知道,您可以说可以根据需要修改规则,并且进行单元测试是一件好事)。
进行主要的API更改时,您将不得不重写测试,可能需要一段时间。请参阅“您可以在上面辩护”)
根据我的经验,即使没有单元测试,CI也往往足够脆弱。


评论


如果单元测试本身不完整,或者可以通过的代码不完整,但是开发人员需要签入自己的代码,则可以通过这些方法将单元测试标记为“待处理”。关键是将这些限制降至最低,并确保一旦开发人员认为其功能已完成,就不会在这种情况下进行任何测试。

– Chuck van der Linden
2011年6月23日下午5:02

完全不同意。单元测试旨在查找API更改,行为更改。如果不测试代码,它将无法正常工作。简单的软件开发法则。测试时间很昂贵。最简单,最便宜的回归测试是单元测试。让您的测试人员进行深度测试。

– ReneS
2011年6月24日14:05