我们通过junit运行了大量的selenium测试,他们都需要在实际测试之前运行一些步骤。为此,我们有一个父TestCase类,其中包含一些@Before和@After方法。
现在,由于我们网站的一个新功能,我想参数化这个设置的一部分,我想创建一个新的注释来进行一些测试,以指示setup()方法设置是略有不同,同时允许其他人使用默认值。那么,是否可以反射性地访问即将在@Before方法中运行的测试方法?
例如
class SomeTest extends MyTestCase {
@Test
@Flavour(Red.class)
public void testRedFlavouredHomepage() {
testHomepage();
}
@Test
public void testBlueFlavouredHomepage() { // assuming Blue is my default flavour
testHomepage();
}
public void testHomepage() {
// test some stuff
}
}
答案 0 :(得分:0)
我建议为这两种方法使用不同的测试类。
class MyTestCase {
@Before
public void setUp() {
/* Default setup */
}
public void testHomepage() {
// test some stuff
}
}
class MyRedTestCase extends MyTestCase {
@Before
public void setUp() {
super.setUp();
/* Red setup */
}
}
然后你可以将你的测试分别放到MyTestCase和MyRedTestCase扩展的两个不同的类中。
class BlueTest extends MyTestCase {
@Test
public void testBlueFlavouredHomepage() { // assuming Blue is my default flavour
testHomepage();
}
}
class RedTest extends MyRedTestCase {
@Test
public void testRedFlavouredHomepage() {
testHomepage();
}
}
您也可以采用其他方式,而无需引入新课程。在父类中声明一个absract(或具有默认值的具体)方法。
class MyTestCase {
protected abstract Flour getFlour();
}
你的孩子班级将会是这样的
class SomeTest extends MyTestCase {
private Flour flour;
@Test
public void testRedFlavouredHomepage() {
flour = Flour.RED;
testHomepage();
}
@Test
public void testBlueFlavouredHomepage() { // assuming Blue is my default flavour
flour = Flour.BLUE;
testHomepage();
}
public void testHomepage() {
// test some stuff
}
protected abstract Flour getFlour() {
return flour;
}
}
我会说第一种解决方案是“更清洁”;即使您必须创建其他类,也不要在一个类中包含不同类型的逻辑(例如反模式God object)。
答案 1 :(得分:0)
您可以使用@Rule(使用更高版本的JUnit> = 4.9)执行此操作。如果你有一个实现TestRule的类,特别是apply(),你可以在测试运行之前做额外的事情。 Description传递给apply方法,该方法包含方法的注释:
以@Deprecated
为例:
public class ExtraSetupTest {
@Rule
public TestRule moreSetup = new TestRule() {
public Statement apply(Statement base, Description description) {
return statement(base, description);
}
private Statement statement(final Statement base,
final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
if (description.getAnnotation(Deprecated.class) != null) {
System.out.println("more setup here");
}
base.evaluate();
}
};
}
};
@Test
public void noExtraSetup() {
System.out.println("noExtraSetup");
}
@Test
@Deprecated
public void withExtraSetup() {
System.out.println("withExtraSetup");
}
}
这产生输出:
noExtraSetup
more setup here
withExtraSetup