0

junitを介して実行されているセレンテストはたくさんあり、実際のテストの前に実行する必要のあるいくつかのステップがあります。このために、いくつかの@Beforeメソッドと@Afterメソッドを含む親TestCaseクラスがあります。

さて、私たちのサイトの新機能のために、このセットアップの一部をパラメーター化したいと思います。セットアップがわずかに異なることを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

これらの 2 つのメソッドには、異なるテスト クラスを使用することをお勧めします。

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;
    }

}

最初の解決策は「よりクリーン」だと思います。追加のクラスを作成する必要がありますが、1 つのクラスに異なる型のロジックを含めることはありません (アンチパターンのGod オブジェクトのように)。

于 2012-08-07T12:33:57.007 に答える
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
于 2012-08-07T13:03:55.490 に答える