3

Configパラメータに基づいてjunitテストを有効/無効にする最良の方法は何ですか? 特定の一連のテストを無効にするソフトウェアの状態を指示する Config クラスがあるとします。

テストの本体をテスト メソッド内の if ステートメントに入れることができます。たとえば、次のようになります。

@Test
public void someTest() {
   if(Config.shouldIRunTheTests()) {
      //do the actual test
   }
}

実際にこれらのテストをスキップしたいときに、これらのケースのテストパスを実際に取得するため、これは悪いようです。次のようなものが欲しい:

@Test[Config.shouldIRunTheTests()] 
public void someTest() {
    //do the actual test
}

これは可能ですか?

4

3 に答える 3

3

実際、この場合の最善の解決策は、独自のorg.junit.Runner. 見た目ほど複雑ではありません。簡単なサンプルは次のとおりです。

ランナー:

package foo.bar.test;

import org.junit.runner.Description;
import org.junit.runner.Runner;
import org.junit.runner.notification.Failure;
import org.junit.runner.notification.RunNotifier;
import org.junit.runners.JUnit4;
import org.junit.runners.model.InitializationError;

public class MyRunner extends Runner {

    private final Runner runner;

    public MyRunner(final Class<?> klass) throws InitializationError {
        super();
        this.runner = new JUnit4(klass);
    }

    @Override
    public Description getDescription() {
        return runner.getDescription();
    }

    @Override
    public void run(final RunNotifier notifier) {
        for (Description description : runner.getDescription().getChildren()) {
            notifier.fireTestStarted(description);
            try {
                // here it is possible to get annotation:
                // description.getAnnotation(annotationType)
                if (MyConfiguration.shallExecute(description.getClassName(), description.getMethodName())) {
                    runner.run(notifier);
                }
            } catch (Exception e) {
                notifier.fireTestFailure(new Failure(description, e));
            }
        }
    }

}

テストケース:

package foo.bar.test;

import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(MyRunner.class)
public class TestCase {

    @Test
    public void myTest() {
        System.out.println("executed");
    }

}

そして構成クラス:

package foo.bar.test;

public class MyConfiguration {

    public static boolean shallExecute(final String className, final String methodName) {
        // your configuration logic
        System.out.println(className + "." + methodName);
        return false;
    }

}

ここで素晴らしいのは、独自の注釈を実装できることです。たとえば: @TestKey("testWithDataBase")、上記のサンプル ソースのコメントを参照してください。また、構成オブジェクトはテストを実行するかどうかを定義できるため、テストをグループ化できます。これは、グループ化する必要があるテストが多数ある場合に非常に役立ちます。

于 2012-07-25T19:51:00.953 に答える
3

実際、Googleでこれを見つけたようです: http://old.nabble.com/How-to-enable-disable-JUnit-tests-programatically---td23732375.html

編集:

これは私のために働いた:

@Test 
public void someTest() {
   org.junit.Assume.assumeTrue(Config.shouldIRunTheTests());
   //do the actual test
}
于 2012-07-25T19:27:26.893 に答える