为啥我的测试一起运行时通过,但单独失败?
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 测试报告失败?