JUnit 3套件如何知道它是单独运行还是与其他套件一起运行?

时间:2012-02-16 17:24:02

标签: eclipse junit

我正在Eclipse中编写JUnit 3测试套件,如果它与一堆额外的套件一起运行,我希望该套件能够实现扩展行为,但如果单独运行则省略某些测试。 (明显的例子:正在测试的方法有一个注释,其状态字段在开发过程中为In_Progress,但是Complete后缀。当方法标记为{{1}时,会抛出红色标记的测试当开发人员只测试那个类时会很麻烦,但是在测试所有类时会非常方便,捕获开发人员忘记改变已完成方法状态的情况。另一个例子:一些测试套件将相关测试收集到一个易于运行的单个套件中。但是如果我们在整个软件包中运行所有测试,那么当Eclipse访问他们的类时,将运行此套件中的测试,而不需要在这个相关测试套件中第二次运行。所以当这个套件与其他套件一起运行时,它应该是空的。)

因为这些测试都是从公共基类继承的,所以我可以设置一个In_Progress,这样我就可以知道我何时初始化第二个和后续的套件。但是,第一个测试套件将不知道其他套件是否会遵循它。

Eclipse环境中是否有可用于检测此案例的内容?我已经尝试将static boolean初始化放在我打算先运行的空测试套件中,但在Eclipse中,套件不一定按字母顺序运行。 (我们通过选择包含它们的所有包并选择boolean(或按键或鼠标点击相同的效果)来一起运行这些测试。)

回顾一下:第二套及后续套件可以检测到它们处于多套件运行状态,但第一套套件是否有某种方法可以解决这个问题?或者,我可以以某种方式让Eclipse始终按字母顺序运行测试,即我所选择的配置套件在所有其他之前运行吗?

1 个答案:

答案 0 :(得分:0)

我希望扩展JUnit规范,以便为这个问题提供简单的答案。但是,现在我可以使用以下hack:当Eclipse(3.4时代,RSA / RAD 7.5.5)运行包中的所有测试时,它会向测试运行器传递一个文本文件列表,每行一个,要测试的课程。文本文件位于系统临时目录中,名为testNamesXXXX.txt,其中XXXX似乎是随机生成的大数字。

如果,当我的测试套件开始运行时,这样的文件存在且时间不到2秒,我可以得出结论,我们是作为多套件运行的一部分运行的。如果所有这些文件都超过大约两秒钟,我可以得出结论,我们只运行即时套件。

以下是执行检查的代码:

import static java.lang.System.getProperty;

private static boolean          multiSuite = false;
private static final long       START_TIME = new Date().getTime();
private static final FileFilter TEST_NAMES = new FileFilter() {
  @Override
  public boolean accept(File f) {
    final String n = f.getName();
    return START_TIME - f.lastModified() < 2000 && // two seconds, tweak to suit
           n.endsWith(".txt")                   &&
           n.startsWith("testNames");
  }
};
private static final String     TMP_DIR    = getProperty("java.io.tmpdir");

private static boolean isMultiSuite() {
  if (multiSuite)
    return true;

  if (0 < new File(TMP_DIR).listFiles(TEST_NAMES))
    return multiSuite = true; // single-equals save value and return

  return false;
}

如果我需要更多确定性,我也可以打开文件并验证它a)列出了多行(class),b)这个testsuite类的名称是文件中的一行。 / p>