【问题标题】:Only run unit tests which's respective source code has changed?仅运行相应源代码已更改的单元测试?
【发布时间】:2012-11-03 20:03:02
【问题描述】:

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

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

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

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

【问题讨论】:

  • 相应的源代码是否也只包含 Java 类或其他一些资源(例如 XML 配置文件)?
  • 各自的源代码是否意味着您仍然测试所有依赖于您已更改的类的类,即使它们自己没有更改?
  • 好问题,我想这实际上取决于使用的工具。我会想象一些工具在 1)测试覆盖的源代码已更改或 2)更改的源代码依赖源类已更改时运行执行测试。或者介于两者之间...
  • “各自的源代码是否只包含Java类或其他一些资源”:仅Java类
  • 除了运行测试所花费的时间之外,这还有其他好处。告诉您哪些测试受一组提交影响的系统可以提供有关代码库中意外耦合的见解。这也可以用于指导手动探索性测试的工作,在他们可能由于看似不相关的变化而没有考虑检查的领域。

标签: java junit jenkins regression


【解决方案1】:

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

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

【讨论】:

  • 当然,但是 Jenkins 是如何知道服务层工件已更改并且只应执行那些测试的呢?这个问题和我原来的问题不一样吗,即Jenkins如何知道要执行哪些相关测试?
  • @user1340582 不,如果您为每个 Maven 工件设置单独的 jenkins 作业,则不会
  • ...但是 Jenkins 怎么知道要执行什么 maven artefact 呢?所有源代码一次编译。
  • @user1340582 再次,我建议将您的项目拆分为多个 maven 模块,这些模块当然会单独编译
【解决方案2】:

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

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

最后,您确实希望运行整个测试套件,但是,您是对的,对更改的代码运行测试更为重要,因为 1. 开发人员知道他们之前搞砸了; 2. 如果您经历了很多更改,首先测试最新版本并转到较早的版本以平分问题是有意义的。

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 另外,JUnitMax 不是免费的。
    【解决方案4】:

    我个人认为你看错了。更好的方法是根据功能和时间将您的 Junit 测试分解为单独的包。

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

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

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

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

    【讨论】:

    • 我明白你在说什么,但它并不那么优雅;)我记得 .NET Visual Studio 有这个“IntelliSense”功能,可以满足我的需要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 2011-04-03
    相关资源
    最近更新 更多