3

Testクラスを指定された回数実行できるようにしたい。クラスは次のようになります:

@RunWith(Parameterized.class)
public class TestSmithWaterman {

    private static String[] args;
    private static SmithWaterman sw;
    private Double[][] h;
    private String seq1aligned;

    @Parameters
    public static Collection<Object[]> configs() {
        // h and seq1aligned values 
    }

    public TestSmithWaterman(Double[][] h, String seq1aligned) {
        this.h = h;
        this.seq1aligned = seq1aligned;
    }

    @BeforeClass
    public static void init() {
        // run smith waterman once and for all
    }

    @Test
    @Repeat(value = 20) // does nothing
    // see http://codehowtos.blogspot.gr/2011/04/run-junit-test-repeatedly.html
    public void testCalculateMatrices() {
        assertEquals(h, sw.getH());
    }

    @Test
    public void testAlignSeq1() {
        assertEquals(seq1aligned, sw.getSeq1Aligned());
    }

    // etc
}

上記のテストはいずれも失敗する可能性があります(同時実行のバグ-編集:失敗は有用なデバッグ情報を提供します)ので、クラスを複数回実行し、できれば結果を何らかの方法でグループ化できるようにしたいと思います。Repeatアノテーションを試しましたが、これはテスト固有であり(実際には機能しませんでした-上記を参照)、 Junit4に転送できないように見えるRepeatedTest.classに苦労しました-SOで見つけた最も近いものはこれです-しかし明らかにJunit3です。Junit4では、私のスイートは次のようになります。

@RunWith(Suite.class)
@SuiteClasses({ TestSmithWaterman.class })
public class AllTests {}

これを複数回実行する方法がわかりません。 空のオプションでパラメータ化することは実際にはオプションではありません-とにかくパラメータが必要なので

だから私は何度も何度もEclipseでControl+F11を押すのに行き詰まっています

ヘルプ

編集(2017.01.25):誰かが先に進んで、私が明示的に言った受け入れられた答えがここに当てはまらない質問の重複としてこれにフラグを立てました

4

1 に答える 1

1

コメントで@MatthewFarwellによって提案されたように、私は彼の答えに従ってテストルールを実装しました

public static class Retry implements TestRule {

    private final int retryCount;

    public Retry(int retryCount) {
        this.retryCount = retryCount;
    }

    @Override
    public Statement apply(final Statement base,
            final Description description) {
        return new Statement() {

            @Override
            @SuppressWarnings("synthetic-access")
            public void evaluate() throws Throwable {
                Throwable caughtThrowable = null;
                int failuresCount = 0;
                for (int i = 0; i < retryCount; i++) {
                    try {
                        base.evaluate();
                    } catch (Throwable t) {
                        caughtThrowable = t;
                        System.err.println(description.getDisplayName()
                            + ": run " + (i + 1) + " failed:");
                        t.printStackTrace();
                        ++failuresCount;
                    }
                }
                if (caughtThrowable == null) return;
                throw new AssertionError(description.getDisplayName()
                        + ": failures " + failuresCount + " out of "
                        + retryCount + " tries. See last throwable as the cause.", caughtThrowable);
            }
        };
    }
}

私のテストクラスのネストされたクラスとして-そして追加されました

@Rule
public Retry retry = new Retry(69);

同じクラスのテストメソッドの前。

これは確かにトリックを実行します-テストを69回繰り返します-いくつかの例外の場合、いくつかの統計と元のThrowableを原因として含む個々のメッセージを含む新しいAssertionErrorがスローされます。したがって、統計はEclipseのjUnitビューにも表示されます。

于 2014-01-25T09:52:24.797 に答える