【问题标题】:How does Eclipse actually run Junit tests?Eclipse 如何实际运行 Junit 测试?
【发布时间】:2011-12-15 01:52:45
【问题描述】:

我在 Eclipse 和 Ant 中运行 Junit 测试时遇到了差异。这是场景:

一切都在 Eclipse 中按预期运行,但是,在运行我创建的 Ant 构建脚本时,我无法获得准确的 Junit 报告。我对我们的测试运行程序和测试用例进行了一些更改(简而言之,我将 Test suite() 方法添加到我的所有测试用例中)返回一个新的 Junit4TestAdapter,并让我们的自定义运行程序执行 RunNotifier.fireTestAssumptionFailed(Failure)而不是 fireTestAssumption。现在在 Ant 中一切运行良好,但在 Eclipse 中运行时将失败标记为通过。

是否有任何 Eclipse 文档可以准确解释它如何运行 Junit 测试?我基本上想知道 Eclipse 如何执行 Junit 测试,是否直接通过 Ant 运行,是否使用 Java 与 Junit 交互等。如果有人知道该问题的实际解决方案,我也欢迎,但我会真的很想尝试自己解决这个问题,我只需要指出正确的方向。

【问题讨论】:

  • Eclipse 不使用您的 ant 构建文件来运行 JUnit 测试。这是肯定的。
  • 我很清楚这一点,我试图弄清楚从 Ant 运行相同的测试套件与通过 Eclipse 插件运行它们之间的差异是什么。
  • 您可能会从 Eclipse Junit 测试启动器中获得一些提示,尤其是参数选项卡和配置选项卡。
  • 我查看了运行配置窗口,但似乎没有任何解决方案。本质上,我知道问题出在哪里,Junit 插件显然没有处理 testAssumptionFailure 事件,我不知道为什么。 Ant 和 Junit 都应该以相同的方式运行测试,除非像 Eclipse 插件这样的东西不支持 Test suite() 方法,这是我试图追踪的问题类型。
  • 如果您需要 Eclipse 使用的命令来运行 JUnit 测试,请在测试运行时转到调试透视图并右键单击 JUnit 测试的 java 进程并检查属性将显示命令。

标签: java eclipse junit


【解决方案1】:

下载适用于 Eclipse 的插件开发工具 (PDT)

启动一个插件项目并将 org.eclipse.jdt.internal.junit.runnerorg.eclipse.jdt.junit.core 添加到您的 plugin.xml 的依赖项中.

探索这些类,您将了解 JUnit 是如何启动的。它根本不使用 Ant。

要查看如何标记故障并处理报告,您应该查看 org.eclipse.jdt.internal.junit4.runtime 假设您使用的是 JUnit 4。

总之,如果您想改变 Eclipse 的 JUnit 的工作方式,请准备好花时间学习和开发插件。

【讨论】:

    【解决方案2】:

    首先回答您的问题,如果 Ant junit 和 Eclipse JUnit 之间存在差异,则可能是类路径或环境问题。最简单的方法是找到一个在两者之间执行不同的测试并打印出系统属性,然后从那个方向开始工作。另一件事是在 Eclipse 中运行 ant 脚本,看看这是否有什么不同(因为环境会改变)

    Eclipse 不使用 Ant 来运行测试。


    至于 Eclipse 如何运行 JUnit 测试,这里有一个快速概述。请注意:Eclipse JUnit 插件中有一些深奥的魔力。

    Eclipse 有 4 个 JUnit 插件,大部分配置都默认安装:

    1. org.eclipse.jdt.junit: git://dev.eclipse.org/org.eclipse.jdt/org.eclipse.jdt.junit.git
    2. org.eclipse.jdt.junit.core: git://dev.eclipse.org/org.eclipse.jdt/org.eclipse.jdt.junit.core.git
    3. org.eclipse.jdt.junit.runtime: git://dev.eclipse.org/org.eclipse.jdt/org.eclipse.jdt.junit.runtime.git
    4. org.eclipse.jdt.junit4.runtime: git://dev.eclipse.org/org.eclipse.jdt/org.eclipse.jdt.junit4.runtime.git

    这些是实际 CVS 存储库的 git 镜像。上次我尝试使用它们时,它们没有编译,但它们会给你代码,你至少可以将项目导入 Eclipse 并查看它们。

    如果我们忽略配置页面、插件如何创建运行配置、JUnit 视图本身的代码以及它如何找到要运行的相关测试,我们可以专注于它如何运行测试。

    核心类是org.eclipse.jdt.junit.launcher.JUnitLaunchConfigurationDelegateorg.eclipse.jdt.internal.junit.runner.RemoteTestRunnerJUnitLaunchConfigurationDelegate 读取启动配置并派生一个将在其中运行测试的 JVM。这个新 JVM 的主类是 RemoteTestRunner。要运行的测试作为参数传递给分叉的 JVM,可以作为单个测试,也可以作为临时文件中的测试列表(如果您在项目上以 JUnit 方式运行)。如果您正在调试,可以通过选中运行配置中的 Keep alive when debugging 复选框来保持这个新的 JVM 处于活动状态。在这种情况下,JVM 将继续存在,现有测试的重新运行将通过套接字发送。

    RemoteTestRunner 运行测试并通过套接字将结果传递回 Eclipse,然后更新 JUnit 视图。其核心是 org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference,它运行测试(对于 JUnit 4)和 org.eclipse.jdt.internal.junit4.runner.JUnit4TestListener,它是这些测试的 RunListener。 JUnit4TestListener 扩展了RunListener,但没有覆盖testAssumptionFailure,这可能是您的测试在Eclipse 中通过的原因。 RunListener.testAssumptionFailure 是一个空方法,它什么都不做,所以你的通知将被忽略。

    我会首先克隆 git 存储库,将项目导入 Eclipse 并尝试处理代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-10
      • 2019-01-30
      • 2019-10-13
      • 2015-01-06
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多