What's the best way to set up a per-test or per-class timeout when using <junit> in perBatch forkmode?

我怕爱的太早我们不能终老 提交于 2019-11-30 02:41:43

问题


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.


回答1:


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.




回答2:


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).



来源:https://stackoverflow.com/questions/8743594/whats-the-best-way-to-set-up-a-per-test-or-per-class-timeout-when-using-junit

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!