为啥我的测试一起运行时通过,但单独失败?

Posted

技术标签:

【中文标题】为啥我的测试一起运行时通过,但单独失败?【英文标题】:Why do my tests pass when run together, but fail individually?为什么我的测试一起运行时通过,但单独失败? 【发布时间】:2021-08-18 17:42:14 【问题描述】:

不要与之前提出的问题“为什么我的测试一起运行时失败,但单独通过?”混淆?

我有一项任务需要修改 Junit 测试类以处理多个数据库测试。在我实现它之前,我需要确保所有测试都在正常运行。让我感到困惑的是,现在当我将所有类一起运行时,它显示它运行时没有失败。当我运行一个特定的类时,它突然失败了,如果我重复它,结果仍然存在。

这可能是什么原因?

我没有自己编写测试,因此我对其中内容的了解有限。不过,我确实修改了其中的 3 个。

粘贴失败的测试以防万一

@Test
public void testGetBetonFillerPrM3Str() 
    Composition c = new Composition();
    MixoSettings settings = new MixoSettings();
    settings.setWcwpDecNum(2);

    assertThat(c.getBetonFillerPrM3Str(), is(""));

    c.setSettings(settings);
    c.setBetonFillerKg(200d);
    c.setTotalVolume(200d);
    assertThat(c.getBetonFillerPrM3Str(), is("1"));

    setUSLocale();
    assertThat(c.getBetonFillerPrM3Str(), is("2"));
    setDKLocale();

    c.setBetonFillerKg(200d);
    c.setTotalVolume(0d);
    assertThat(c.getBetonFillerPrM3Str(), is(""));

    c = new Composition();
    assertThat(c.getBetonFillerPrM3Str(), is(""));

我正在使用 Eclipse、java 7、JUnit 4

【问题讨论】:

setUSLocale 让我觉得您更改了默认语言环境,这是测试问题的重要来源,因为它修改了其他测试可能依赖的全局状态。您可能有一些测试假设默认语言环境(或其他一些全局状态)并不总是正确的。第一步是在 @TearDown 方法中撤消任何此类修改(不在测试中,因为如果测试失败,则可能不会运行),理想情况下,每个测试都应该设置该全局状态(如果它依赖于它)。 如果测试仅在一起运行时才有效,这表明它们在某些共享状态下运行,这可能是 Joachim 建议的 JVM 中的某些东西,甚至是数据库中的某些数据。所以你需要找出他们失败的原因,即预期的状态,你得到了什么以及你为什么得到那个。有了这些数据,您就可以就是否需要修复测试或您的代码已经损坏做出明智的决定。 约阿希姆的猜测是正确的,解决了我的问题。你的两个 cmets 都很好,但我不能将其中任何一个标记为答案,因为它们是 cmets 而不是答案:( 【参考方案1】:

我遇到了一个类似的问题,即一些测试在一起运行而不是单独运行时会失败。我意识到这是因为我有异步代码。我有一个 executorService 的完整未来。在 @AfterEach 方法中,我添加了 Thread.sleep(1000) ,这解决了我的问题。您的问题可能不是多线程问题,但最终您可能必须重置 @BeforeEach 或 @AfterEach 中的任何共享值。

我还会尝试注释掉 test,直到您发现事先运行的测试导致您手头的测试失败。

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。 这并不能真正回答问题。如果您有其他问题,可以点击 进行提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review

以上是关于为啥我的测试一起运行时通过,但单独失败?的主要内容,如果未能解决你的问题,请参考以下文章

RSpec capybara:涉及 Ajax 的测试单独通过,但一起运行时失败

当所有单独的测试都通过时,为啥我的 Bazel 测试报告失败?

我的摩卡测试单独工作,但一次运行时失败

Jest Puppeteer 测试在一起运行时失败(同步)

当所有测试一起运行时,Android Instrumented 测试失败

为啥水豚功能规格一起运行时会失败,仅对我而言。但分开时通过?