2011-10-25 53 views
6

在Eclipse和Ant中运行Junit测试时,我遇到了一个差异。这里是场景:Eclipse如何实际运行Junit测试?

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

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

+5

Eclipse不会使用您的ant构建文件来运行JUnit测试。这是肯定的。 –

+0

我很清楚这一点,我试图弄清楚从Ant运行相同的测试套件与通过Eclipse插件运行它们之间的差异。 –

+0

您可能会从Eclipse Junit测试启动器中获得一些提示,特别是参数选项卡和配置选项卡。 –

回答

17

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

Eclipse不使用Ant来运行测试。


至于Eclipse如何运行JUnit测试,下面是一个快速概述。被警告:在Eclipse JUnit插件中有一些深奥的魔力。

Eclipse有4 JUnit的插件,这些插件都默认在大多数配置安装:

  1. org.eclipse.jdt.junit:混帐://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。运行时: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身份运行)传递给分叉的JVM。如果您正在调试,则可以通过检查运行配置中的Keep alive when debugging复选框来保持这个新的JVM处于活动状态。在这种情况下,JVM将继续存在,现有测试的重新执行将通过套接字发送。

RemoteTestRunner运行测试并通过套接字将结果传回给Eclipse,然后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 repos,将项目导入Eclipse并尝试通过代码工作。

2

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

启动插件项目,并添加org.eclipse.jdt.internal.junit.runnerorg.eclipse.jdt.junit.core在plugin.xml的依赖关系。

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

要查看故障如何被标记和操纵报告,你应该看看org.eclipse.jdt.internal.junit4.runtime assumming您正在使用JUnit 4

总之,准备花同时学习和开发一个插件,如果你想改变Eclipse的JUnit的工作方式。