15

我正在我们的 Jenkins CI 服务器中运行单元测试和 Selenium 测试。众所周知,在大型项目中运行测试需要很长时间。

是否有 Java 工具/框架只能触发相应源代码已更改的测试?这是因为并非每次对 SCM 的提交都会影响源代码的所有区域......

我使用 Cobertura 进行代码覆盖,使用 Surefire 进行报告。

编辑:我找到了 Atlassian Clover,但我正在寻找免费的解决方案。

4

4 回答 4

6

我正在我们的 Jenkins CI 服务器中运行单元测试和 Selenium 测试。众所周知,在大型项目中运行测试需要很长时间。

这是我要解决的问题。将您的项目拆分为多个逻辑单元(例如持久层、服务层、Web 层)并单独测试它们。这样你只需要在 web 层发生变化并且每个工件的构建时间变短时运行 Selenium 测试

于 2012-11-15T10:01:46.120 回答
4

通常,如果不运行它,您无法可靠地推断出哪些代码被哪个测试覆盖,即使您确实运行了测试,执行路径也可能因运行而异。我怀疑像这样的完美分析相当于Halting Problem

但是,您可以使用先前测试运行的覆盖率或测试用例文件中的导入来推断哪些测试可能会执行更改的代码。

最后,您确实想运行整个测试套件,但是,您是对的,在更改的代码上运行测试更重要,因为 1. 开发人员知道他们早先搞砸了 2. 如果您经历了很多更改,它会使感觉首先测试最新版本并转到较早的版本只是为了平分问题。

谷歌著名地声称*他们被黑的代码库在提交时运行单元测试,**并且他们调整了测试框架以确定首先运行哪些测试。我不知道他们的更改是否公开。

*会议演示的视频通话,我不记得确切的名称或链接

**严格在提交之后,如果测试开始失败则自动回滚

于 2014-01-09T08:20:49.803 回答
3

您可以尝试JUnit MaxInfinitest,但它们都是基于 IDE 的。

于 2012-11-15T09:26:59.650 回答
1

就个人而言,我认为您以错误的方式看待这个问题。更好的方法是根据功能和时间将您的 Junit 测试分解为单独的包。

对于像这样的项目,我为每次提交运行健全性测试,但这些测试非常有限,涵盖了最基本的功能,然后在此之上运行每晚测试以涵盖更多内容(看到没有人在晚上工作,它给出了一个测试那天代码的 12 小时窗口)。

如果您的整个测试套件都需要它(但如果需要,我会感到惊讶),那么您可以运行周末测试套件。

仅测试更改的类会假设这些类不会影响项目的任何其他部分,这可能会导致错误,除非您进行全面测试,否则您不会发现错误,或者您只是碰巧改变了受影响的区域.

我知道这在技术上并不能回答您的问题,而是需要考虑的问题。

于 2012-11-15T10:05:18.800 回答