在每批处理 forkmode 中使用<junit>时,设置每个测试或每个类超时的最佳方法是什么?

2022-09-01 23:01:48

如果有人编写了运行时间超过 1 秒的测试,我想使生成失败,但是如果我在 perTest 模式下运行,则需要更长的时间。

我可能会编写一个自定义任务来解析 junit 报告并基于此使构建失败,但我想知道是否有人知道或可以想到更好的选择。


答案 1

恢复一个老问题,因为答案没有提供一个例子。

您可以指定超时

  1. 每种测试方法:

     @Test(timeout = 100) // Exception: test timed out after 100 milliseconds
     public void test1() throws Exception {
         Thread.sleep(200);
     }
    
  2. 对于使用 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. 全局为使用静态运行类中的所有测试方法的总时间: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. 甚至可以将超时(或 )应用于整个套件中的所有类@Rule@ClassRule

     @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);
     }
    

编辑:最近已弃用超时以利用此初始化

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

您现在应该提供 Timeunit,因为这将为您的代码提供更精细的粒度。


答案 2

如果使用 JUnit 4 和 ,则可以指定将失败的参数,该参数将失败的测试时间超过指定时间。这样做的缺点是,您必须将其添加到每个测试方法中。@Testtimeout

一个更好的选择是使用带有 org.junit.rules.Timeout 的 a。有了这个,你可以按类(甚至在共享的超级类中)执行此操作。@Rule


推荐