2012-01-18 16 views
0

JUnitのパラメータ化されたテスト機能を使用して、異なるテストで同じテストを繰り返し実行しました。私が持っている質問は、テストのタイムアウトが個々のテストの実行に適用されるかどうかです。JUnit、パラメータ化されたテストのタイムアウト

具体的には、1つのパラメータでのみテストを実行し、テストのタイムアウトが10分の場合、同じテストを実行するためにさらに2つのエントリを追加すると、テストのタイムアウトは30分?

もしそうでなければ、どうすれば設定できますか?

+0

基本的にタイムアウトは入力のサイズに比例しますか? – dierre

答えて

4

私はちょうどJUnitコードを見て、parameterizedテストメソッドを実行するたびにtimeoutが適用されます。各パラメータセットのランは独立しています。

+0

+1これは正しい –

2

jackrabbitは、タイムアウトが各実行に適用され、メソッドには適用されないと言ったときに正しいと言います。これは彼の答えの拡張です。一例として、次のコードを使用した:

@RunWith(Parameterized.class) 
public class ParameterWithTimeoutTest { 
    @Parameters 
    public static Iterable<Object[]> data() { 
     return Arrays.asList(new Object[][] {{ 5 }, { 2 }, { 1 }}); 
    } 

    private long input; 

    public ParameterWithTimeoutTest(long input) { 
     this.input = input; 
    } 

    @Test(timeout=3000) 
    public void testTimeout() throws Exception { 
     Thread.sleep(input*1000); 
    } 
} 

testTimeout方法は、それぞれのパラメータ5、2,1と、三回実行されます。タイムアウトにより、最初の実行だけが失敗します。

あなたはクラスの実行時にグローバルタイムアウトを設定したい場合は、@ClassRule Timeout使用することができます。

public class ParameterWithTimeoutTest { 
    @ClassRule 
    public static final TestRule globalTimeout = new Timeout(5000); 

    @Parameters 
    public static Iterable<Object[]> data() { 
     return Arrays.asList(new Object[][] {{ 5 }, { 2 }, { 1 }}); 
    } 

    // ... 

をしかし、これはInteruptedException、ないタイムアウトエラーで失敗します。しかし、少なくともそれはタイムアウトします。これは、一連のテストに必要な場合にスイートで使用できます。

+0

優れた実験!時間がなかったので、ショートカットを取った。 – jackrabbit

関連する問題