【问题标题】:Different Behavior using JUnit via Ant versus IntelliJ IDEA通过 Ant 与 IntelliJ IDEA 使用 JUnit 的不同行为
【发布时间】:2011-07-17 19:07:46
【问题描述】:

通过 IntelliJ IDEA 10 运行一些集成测试并从命令行使用 Ant 时,我遇到了不同的行为。具体来说,调用单例的测试通过 Ant 失败并通过 IDEA 成功。我知道使用单例的缺点,但这是我继承的代码,并希望在删除它们之前创建测试:)

我已验证两者都使用相同版本的 JUnit (4.8.1)。

这是 Ant build.xml 文件中的一个 sn-p:

<junit printsummary="yes"
           fork="yes"
           forkmode="perTest"
           haltonfailure="no">
        <classpath refid="classpath.test"/>
        <formatter type="xml"/>
        <batchtest todir="${report.home}/tmp">
            <fileset dir="${test.home}">
                <include name="**/*Test.java"/>
                <exclude name="**/*TransactionalTests.java"/>
            </fileset>
        </batchtest>
    </junit>

由于我在 IDEA 中找不到有关 JUnit 默认设置的文档,因此在运行测试时我无法确定它们是否/如何分叉等。

非常感谢任何有关通过 Ant 和 IntelliJ 获得相同行为的建议。

【问题讨论】:

  • 测试是什么样的?他们是使用@Before 来初始化东西,还是自初始化字段?
  • 测试是否以相同的顺序运行?我在 Maven 和 Eclipse 中运行测试时遇到了问题,其中测试以不同的顺序运行。这导致 Singleton 对象在两个运行环境中的状态不同。
  • 下面是一个遇到此行为的测试示例:gist.github.com/875322

标签: ant junit intellij-idea


【解决方案1】:

IDEA 在单个 JVM 实例中运行所有测试,而您通过 Ant 分叉以在其自己的 JVM 实例中运行每个测试。由于您的代码中有单例,因此结果可能会有所不同。 IDEA 目前无法选择 fork 测试,尽管此功能已在计划中。

执行顺序也可能是这种情况,因为您使用的是单例。 IDEA 按字母顺序运行测试,无法更改。因此,要获得相同的行为,如果测试的顺序很重要(这不是一个好主意),您需要告诉 Ant 以相同的顺序运行测试。

另外,你有一些通过 Ant 排除的测试,IDEA 没有这样的选项。如果您的其他测试依赖于排除的测试,结果会有所不同。

【讨论】:

  • 我应该在前面提到这一点,但我在我的 Ant 构建中尝试了所有分叉组合。重新排序测试也没有帮助。我排除的测试只是其他测试扩展的基类。
  • 接受您的回答,因为您有很好的建议。在这一点上,我已经通过一些小的代码更改来解决测试失败的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 2012-01-24
相关资源
最近更新 更多