我正在处理许多项目,我们正在使用 Java、Springs、Maven 和 Jenkins 进行 CI,但我遇到了一些程序员没有向项目添加真正的 junit 测试用例的问题。我希望 maven 和 jenkins 在部署到服务器之前运行测试。一些程序员做了一个空白测试,所以它开始和停止并通过测试。
有人可以告诉我如何自动执行此检查,以便 maven 和 jenkins 可以查看测试是否输出了一些输出。
除了查看代码之外,我还没有找到任何好的解决方案来解决这个问题。
代码覆盖率无法检测到我见过的最糟糕的单元测试
查看测试的数量,那里也失败了。查看测试名称,您敢打赌它失败了。
如果您有像“Kevin”这样编写类似测试的开发人员,那么您只能通过代码审查来捕获这些测试。
“凯文”如何击败检查的总结:
编写一个名为smokes
. 在这个测试中,您使用不同的参数组合调用被测类的每个方法,每个调用都包含在try { ... } catch (Throwable t) {/* ignore */}
. 这为您提供了很好的覆盖范围,并且测试永远不会失败
编写一堆空的测试,名称听起来像是您想出了花哨的测试场景,widgetsTurnRedWhenFlangeIsOff
例如widgetsCounterrotateIfFangeGreaterThan50
. 这些都是空测试,因此永远不会失败,并且检查 CI 系统的经理会看到许多详细的测试用例。
代码审查是抓住“凯文”的唯一方法。
希望您的开发人员没有那么糟糕
今天早上我洗了个澡。有一种自动分析可以捕获“Kevin”,不幸的是它仍然可以被欺骗,所以虽然它不是解决人们编写糟糕测试的解决方案,但它确实让编写糟糕的测试变得更加困难。
这是一个旧项目,不适用于最近的代码,我不建议您使用它。但我建议它暗示一种可以阻止“凯文”的自动分析
如果我要实现这个,我会写一个“JestingClassLoader”,它使用例如ASM,一次用一点“玩笑”重写字节码。然后在使用此类加载器加载时针对您的类运行测试套件。如果测试没有失败,你就在“凯文”的土地上。问题是您需要针对代码中的每个分支点运行所有测试。不过,您可以使用自动覆盖分析和测试时间分析来加快速度。换句话说,您知道每个测试执行的代码路径,因此当您针对某个特定路径“开玩笑”时,您只运行到达该路径的测试,然后从最快的测试开始。如果这些测试都没有失败,那么您就发现了测试覆盖率的弱点。
所以如果有人要“现代化” Jester,你就有办法找到“Kevin”。
但这不会阻止人们编写糟糕的测试。因为您可以通过编写测试来验证代码的行为与当前行为、错误和所有行为相同,从而通过该检查。哎呀,甚至有公司销售会“为您编写测试”的软件。我不会通过从这里链接到他们来为他们提供 Google 页面排名,但我的观点是,如果他们掌握了此类软件,您将进行大量测试,这些测试会直接包裹您的代码库并且不会发现任何错误(因为一旦您更改任何内容,“生成的”测试就会失败,因此现在进行更改需要争论更改本身以及更改破坏的所有单元测试的更改,从而增加进行更改的业务成本,即使该更改正在修复一个真正的错误)
在 Sonar质量配置文件中,您可以针对任何指标组合设置警报,因此,例如,您可以要求您的 java 项目应该具有
强制开发人员至少进行 1 个单元测试,覆盖至少 20% 的代码库。(相当低质量的酒吧,但我想这就是你的意思!)
设置额外的服务器可能看起来像是额外的工作,但是当您有多个 Maven 项目时,该解决方案可以扩展。Sonar的Jenkins 插件就是您需要配置的所有内容。Jacoco 是默认的代码覆盖工具,Sonar 还会自动运行其他工具,如 Checkstyle、PMD 和 Findbugs。
最后,斯蒂芬关于代码审查是完全正确的。Sonar 有一些基本但有用的代码审查功能。
您需要添加一个代码覆盖插件,例如 JaCoCo、EMMA、Cobertura 等。然后,您需要在插件的配置中定义您希望拥有的代码覆盖率(基本上是“测试覆盖的代码”),以使构建通过。如果它低于该数字,您可能会导致构建失败。而且,如果构建失败,Jenkins(或任何你的 CI)将不会部署。
正如其他人指出的那样,如果您的程序员已经在欺骗编码实践,那么使用更好的覆盖工具将无法解决您的问题。他们也可能被骗。
您需要与您的团队坐下来,就专业精神和软件工程应该是什么进行诚实的交谈。
根据我的经验,代码审查很棒,但需要在提交代码之前进行。但要在人们“作弊”的项目中发挥作用,你至少需要有一个你可以信任的审阅者。
http://pitest.org/是所谓的“突变测试”的一个很好的解决方案:
错误(或突变)会自动植入您的代码中,然后运行您的测试。如果您的测试失败,则突变被杀死,如果您的测试通过,则突变存活。
您的测试质量可以通过被杀死的突变百分比来衡量。
好消息是您可以轻松地将它与 maven、jenkins 和 ... SonarQube结合使用!