我正在Eclipse中编写JUnit 3测试套件,如果它与一堆额外的套件一起运行,我希望该套件能够实现扩展行为,但如果单独运行则省略某些测试。 (明显的例子:正在测试的方法有一个注释,其状态字段在开发过程中为In_Progress
,但是Complete
后缀。当方法标记为{{1}时,会抛出红色标记的测试当开发人员只测试那个类时会很麻烦,但是在测试所有类时会非常方便,捕获开发人员忘记改变已完成方法状态的情况。另一个例子:一些测试套件将相关测试收集到一个易于运行的单个套件中。但是如果我们在整个软件包中运行所有测试,那么当Eclipse访问他们的类时,将运行此套件中的测试,而不需要在这个相关测试套件中第二次运行。所以当这个套件与其他套件一起运行时,它应该是空的。)
因为这些测试都是从公共基类继承的,所以我可以设置一个In_Progress
,这样我就可以知道我何时初始化第二个和后续的套件。但是,第一个测试套件将不知道其他套件是否会遵循它。
Eclipse环境中是否有可用于检测此案例的内容?我已经尝试将static boolean
初始化放在我打算先运行的空测试套件中,但在Eclipse中,套件不一定按字母顺序运行。 (我们通过选择包含它们的所有包并选择boolean
(或按键或鼠标点击相同的效果)来一起运行这些测试。)
回顾一下:第二套及后续套件可以检测到它们处于多套件运行状态,但第一套套件是否有某种方法可以解决这个问题?或者,我可以以某种方式让Eclipse始终按字母顺序运行测试,即我所选择的配置套件在所有其他之前运行吗?
答案 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>