2013-04-03 65 views
13

我正在开发一个项目,其中包含大量未覆盖测试的遗留代码。持续集成:确保新的提交已通过测试

有没有办法,我就可以建立,整合服务器检查所有新提交过测试(比如,覆盖率> 70%)的最小量什么办法?

从本质上讲,我看到两个选项:

  1. 莫名其妙定置了CI服务器时未覆盖的单元测试的承诺变为构建失败。这将确保每个新代码都有测试,并且每次更改都会增加对旧代码的测试。
  2. 设置整个项目的覆盖阈值,如果覆盖百分比在提交后降低,则生成失败。问题是,如果我删除一个包含100条指令的类,并添加一个包含50条指令的新类,那么覆盖百分比就会升高,而无需编写任何测试。

我更喜欢选项1,因为它强制更改遗留代码以进行单元测试。这应该会增加整体测试覆盖率。

现在我们使用Jenkins作为CI服务器,JaCoCo使用测试覆盖率。 Maven用于构建项目,SVN是我们的主要源代码控制。

+0

请记住,100%的覆盖率不一定是可能的,甚至不需要。覆盖范围数字也可以被操纵。为测试类写单元测试可能会人为地夸大测试覆盖率。 – 2013-04-03 18:51:06

+0

@MikeRylander我知道,我甚至不梦想在这个项目上100%的覆盖率。但我仍然认为,迫使新的变化至少有一些报道是好的。 – 2013-04-03 18:54:41

+2

我目前正在解决这个问题,主要解决@MikeRylanders的评论。现在http://pitest.org与版本控制集成在一起。下一个版本将允许通过scm状态分析文件。以下版本将允许按日期范围或提交进行分析,这将允许构建服务器检查修改的代码是否满足给定的变异分数。 – henry 2013-04-19 16:13:30

回答

1

我知道你可以配置詹金斯验证至少有一个测试文件中的承诺的一部分。这不能确保良好的测试覆盖率,但至少你会知道有某种测试相关的变化。

+0

我不喜欢这个想法。如果您正在提交一些信息来做出先前失败的测试通过,则不需要同时提交测试文件。 – JohnnyO 2013-04-03 18:54:30

+0

@JohnnyO理论上讲,一个失败的构建**不应该首先被提交。除非你的单元测试是片面的或与外部依赖关系相关,这是一组不同的问题,否则你不应该承诺修复破损的单元测试。 – 2013-04-03 19:33:31

+0

理论上肯定。在实践中,不是那么多。想象一下你有一个不好的提交(假设你忘记包含一个文件)。所以,测试通过本地,但在詹金斯失败。在这种情况下你会如何提交丢失的文件? – JohnnyO 2013-04-04 12:44:11

0

对于选项2,可以使用Jenkins JaCoCo plugin来跟踪每个构建的代码覆盖率,并根据覆盖率度量标准将构建结果设置为通过或失败。

我喜欢选项1更好,太多,但我不知道詹金斯做这个内置的方式。它应该是相当容易(至少在类级别)进行后处理的覆盖数据,并与SVN版本信息结合起来,是这样的:

  1. 解析JaCoCo输出文件,发现有0%类覆盖范围
  2. 从SVN修订详细信息中获取为该构建更改的文件(Jenkins在环境变量中提供版本号,SVN_REVISION如果只有一个用于此构建,或者SVN_REVISION_1,SVN_REVISION_2,...用于多个)
  3. 如果任何更改的类别具有0%覆盖率,则输出错误消息
  4. 使用Jenkins Text Finder plugin如果打印错误消息,则生成失败。

这不是一个完整的解决方案,对于未包含在测试中的新方法或新行来说,它会变得更复杂。给我一个新的Jenkins插件的想法;-)

+0

但我如何配置这个插件失败,如果提交的更改没有覆盖测试?如果我在传统文件中添加一个小的更改,这可能不会更改整体覆盖率度量,因此不会使构建失败? – 2013-04-03 18:59:37

+0

对,这就是为什么我包含了我对你的第一个选项的评论。 – 2013-04-03 19:01:00

+1

我会焦急地等待你的插件。 – 2013-04-03 19:01:53

0

一些覆盖工具(如cobertura)支持排除软件包。这样,您可以排除所有旧代码(假设它可以进行模式匹配)并让cobertura仅检查新代码(其中包含新提交)。

我希望这会有所帮助。

+0

感谢您的意见,但我的目标是确保新代码经过测试,并强制更改旧代码以进行测试。 – 2013-04-03 18:56:30

0

我建立了一个工具,它正是这样做的

https://github.com/exussum12/coverageChecker

您通过分支的diff和从测试输出遮盖试验。该工具确定diff中哪些行也在三叶草文件中。和失败构建如果低于一定比例

使用

bin/diffFilter --phpunit diff.txt clover.xml 70 

失败构建时,DIFF小于70%由测试覆盖

我可以添加其他格式,如果需要

编辑

我已经加入jacoco

Bin/diffFilter --jacoco diff.txt jacoco.xml