gpt4 book ai didi

java - Maven-surefire-plugin 测试在 Jenkins 构建中失败但在本地成功运行?

转载 作者:行者123 更新时间:2023-11-30 08:03:47 25 4
gpt4 key购买 nike

我有一个 Maven 项目,由 maven-surefire-plugin 执行测试。我观察到并一直在处理的一个奇怪现象是在本地运行

mvn clean install

它执行我的测试,导致构建成功,0 次失败和 0 次错误。

现在,当我将此应用程序部署到 Jenkins 尝试构建的远程存储库时,我会收到各种随机的 EasyMock 错误,通常是这样的:

java.lang.IllegalStateException: 3 matchers expected, 4 recorded. at org.easymock.internal.ExpectedInvocation.createMissingMatchers

这是一个被继承的遗留应用程序,我们知道如果不是简单地错误地使用 EasyMock,这些测试中的许多都是有缺陷的,但我处于一种状态,通过测试执行我在本地成功构建但在 Jenkins 中却没有.

我知道无法保证这些测试的执行顺序,但我想知道如何反省 Jenkins 构建管道与本地构建管道的不同之处以帮助确定问题?

我能做些什么来强制按照本地完成的方式执行测试吗?在这一点上,我已经简单地排除了许多麻烦的测试类,但似乎无论我看到多少次 Jenkins 失败,我要么修复问题要么排除测试类,我只会发现它提示其他测试它之前没有提到的类。

有什么想法可以处理这种情况吗?

最佳答案

我已经试验过非常相似的情况,我的原因显然是测试实现的一些并发问题

并且,在阅读您的评论后:

What I actually did that fixed it (like magic am I right?) is for the maven-surefire plugin, I set the property reuseForks=false, and forkCount=1C, which is just 1*(number of CPU's of machine).

...我更加确信您的测试存在并发问题。并发性不容易诊断,特别是当您的实验在一个 CPU 上运行正常时。但是,当您在另一个系统(通常更快或更慢)上运行它时,可能会出现竞争条件。

我强烈建议您逐一检查您的测试并确保它们中的每一个都是逻辑隔离:

  • 它们不应依赖于预期的先前状态(文件、数据库等)。相反,他们应该在每次执行前准备适当的设置
  • 如果他们同时修改可能干扰其他测试执行的公共(public)资源(文件、数据库、单例等),则每个断言都必须根据需要进行同步,并考虑到其初始状态未知:<

错误的测试:

MySingleton.getInstance().put(myObject);
assertEquals(1, MySingleton.getInstance().size());

正确的测试:

synchronized(MySingleton.getInstance())
{
MySingleton.getInstance().put(myObject);
assertTrue(MySingleton.getInstance().contains(myObject));
}

审查的一个好的起点是检查其中一个失败的测试并向后跟踪执行以找到失败的根本原因。

明确设置测试的顺序不是一个好的做法,即使我知道这是可能的,我也不会向您推荐它,因为它只会隐藏问题的实际原因.认为在真实的生产环境中,执行的顺序通常是无法保证的。

关于java - Maven-surefire-plugin 测试在 Jenkins 构建中失败但在本地成功运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36073648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com