What's the best way to set up a per-test or pe

2019-02-16 15:58发布

I want to fail the build if anyone writes a test that takes longer than 1 second to run, but if I run in perTest mode it takes much, much longer.

I could probably write a custom task that parses the junit reports and fails the build based on that, but I was wondering if anyone knows or can think of a better option.

2条回答
何必那么认真
2楼-- · 2019-02-16 16:35

Reviving an old question since the answer doesn't provide an example.

You can specify timeout

  1. Per test method:

    @Test(timeout = 100) // Exception: test timed out after 100 milliseconds
    public void test1() throws Exception {
        Thread.sleep(200);
    }
    
  2. For all methods in a test class using Timeout @Rule:

    @Rule
    public Timeout timeout = new Timeout(100);
    
    @Test // Exception: test timed out after 100 milliseconds
    public void methodTimeout() throws Exception {
        Thread.sleep(200);
    }
    
    @Test
    public void methodInTime() throws Exception {
        Thread.sleep(50);
    }
    
  3. Globally for the total time to run all test methods in the class using a static Timeout @ClassRule:

    @ClassRule
    public static Timeout classTimeout = new Timeout(200);
    
    @Test
    public void test1() throws Exception {
        Thread.sleep(150);
    }
    
    @Test // InterruptedException: sleep interrupted
    public void test2() throws Exception {
        Thread.sleep(100);
    }
    
  4. And even apply timeout (either @Rule or @ClassRule) to all classes in your entire suite:

    @RunWith(Suite.class)
    @SuiteClasses({ Test1.class, Test2.class})
    public class SuiteWithTimeout {
        @ClassRule
        public static Timeout classTimeout = new Timeout(1000);
    
        @Rule
        public Timeout timeout = new Timeout(100);
    }
    

EDIT: timeout was deprecated recently to utilize this initialization

@Rule
public Timeout timeout = new Timeout(120000, TimeUnit.MILLISECONDS);

You should provide the Timeunit now, as this will provide more granularity to your code.

查看更多
3楼-- · 2019-02-16 16:48

If you use JUnit 4 and @Test, you can specifiy the timeout parameter that will fail a tests that's taking longer than specified. Downside for that is that you'd have to add it to every test method.

A probably better alternative is the use of a @Rule with org.junit.rules.Timeout. With this, you can do it per class (or even in a shared super class).

查看更多
登录 后发表回答