0

我们有很多通过 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
  }
}
4

2 回答 2

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 扩展的 2 个不同的类中。

class BlueTest extends MyTestCase {

    @Test
    public void testBlueFlavouredHomepage() {  // assuming Blue is my default flavour
        testHomepage();
    } 

}

class RedTest extends MyRedTestCase {

    @Test
    public void testRedFlavouredHomepage() {
        testHomepage();
    }

}

你也可以用另一种方式来做,而不需要引入新的类。在父类中声明一个抽象(或具有默认值的具体)方法。

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中)。

于 2012-08-07T12:33:57.007 回答
0

您可以使用@Rule来执行此操作(使用更高版本的 JUnit >= 4.9)。如果你有一个实现TestRule的类,特别是 apply(),你可以在测试运行之前做一些额外的事情。描述被传递给 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
于 2012-08-07T13:03:55.490 回答