我有两个类,每个类都以不同的方式实现,但两者的测试都相同。如果它们并行运行,每个类都会做一些会影响另一个类的事情,因此它们不能并行运行。 (这是以下代码背后的基本原理)
如果在Eclipse中运行类Both,请参见下面的TestNG测试,可以预期它首先运行ClassAAA类的测试test1和test2,然后运行ClassBBB的相同测试方法,因为ClassBBB' s组注释指定它取决于ClassAAA的注释 然而,你发现的是,看起来,TestNG有一种不同的方式来看待它,而且,似乎"它忽略了组顺序并且并行运行两个分支的测试。
class Both {
@Test(groups={"base"})
public static abstract class BothBase {
@Test public void test1() { System.out.println("test1"+name()); }
@Test public void test2() { System.out.println("test2"+name()); }
protected String name() {
String s = getClass().getName();
s = s.substring( 1 + s.lastIndexOf("$"));
return " - " + s;
}
}
@Test(groups={"gr1"})
public static class ClassAAA extends BothBase { }
@Test(groups={"gr2"},dependsOnGroups={"gr1"})
public static class ClassBBB extends BothBase { }
}
输出结果为:
test1 - ClassAAA
test1 - ClassBBB
test2 - ClassAAA
test2 - ClassBBB
我不喜欢的一种尝试强迫"它遵循所需的组顺序,就是在叶类中添加一个虚拟测试方法,如下所示:
@Test(groups={"gr1"})
public static class ClassAAA extends BothBase {
@Test public void dummyTestMustBeInAllLeavesToEnforceGroupOrder() {
System.out.println("dummyTestMustBeInAllLeavesToEnforceGroupOrder"+name());
}
}
@Test(groups={"gr2"},dependsOnGroups={"gr1"})
public static class ClassBBB extends BothBase {
@Test public void dummyTestMustBeInAllLeavesToEnforceGroupOrder() {
System.out.println("dummyTestMustBeInAllLeavesToEnforceGroupOrder"+name());
}
}
这仍然不能完全按照人们的预期行事。输出是:
test1 - ClassAAA
test2 - ClassAAA
test2 - ClassBBB
dummyTestMustBeInAllLeavesToEnforceGroupOrder - ClassAAA
test1 - ClassBBB
dummyTestMustBeInAllLeavesToEnforceGroupOrder - ClassBBB
这意味着它在完成ClassAAA的测试之前就开始运行ClassBBB的测试 我不喜欢这样一个事实:我必须为每个方法添加一个虚拟/不相关的方法,以使TestNG了解它们不能并行运行。事实上,我并不关心哪个班级首先运行......而且,我并没有真正完成我想要的,因为它们仍在并行运行。
实现此目标的最愚蠢的方法是将测试从基类移动到每个叶类 - 是否假设您在TestNG中执行这些操作?
还有另一种方法吗?我确定有人会提出优先考虑的事项 - 但是,这并没有表达真正的意图 - 我没有优先权 - 只是不希望他们并行运行。我也不想写XML文件......
答案 0 :(得分:0)
这个问题是由静态内部类引起的。尝试以下代码,您将获得所需的输出
import org.testng.annotations.Test;
@Test(groups={"base"})
public abstract class BothBase {
@Test public void test1() { System.out.println("test1"+name()); }
@Test public void test2() { System.out.println("test2"+name()); }
protected String name() {
String s = getClass().getName();
s = s.substring( 1 + s.lastIndexOf("$"));
return " - " + s;
}
}
@Test(groups={"gr1"})
class ClassAAA extends BothBase { }
@Test(groups={"gr2"},dependsOnGroups={"gr1"})
class ClassBBB extends BothBase { }
答案 1 :(得分:0)