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



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

因为这些测试都继承自一个公共基类,所以我可以设置一个static boolean,这样我就可以知道何时初始化第二个和后续套件。然而,第一个测试套件不知道是否会有其他套件跟随它

Eclipse环境中是否有一些可用的东西可以帮助检测这种情况?我曾尝试将boolean初始化放在一个空的测试套件中,我打算先运行该套件,但在Eclipse中,这些套件不一定按字母顺序运行。(我们通过选择包含所有测试的包并选择Run -> Run As -> JUnit Test(或按键或鼠标点击以达到相同效果)来一起运行这些测试。)

概括一下:第二个和随后的套件可以检测到它们处于多套件运行中,但第一个套件是否也有办法弄清楚这一点?或者,我可以以某种方式让Eclipse始终按字母顺序运行测试吗?也就是说,我选择的配置套件在所有其他配置套件之前?

我希望看到JUnit规范得到扩展,为这个问题提供一个简单的答案。然而,目前我可以使用以下技巧:当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)列出了多行(类),b)这个测试套件类的名称是文件中的一行。

最新更新