关于Java:在Eclipse中设置JUnit超时

Set JUnit timeout in eclipse

当我使用Eclipse运行所有JUnit测试时,是否可以设置默认超时?

背景

我的经理坚持要编写单元测试,有时可能需要5分钟才能完成。当我尝试运行整个测试套件(仅约300个测试)时,可能需要30分钟以上。我想放置一些东西来停止任何需要超过10秒的测试。

我知道可以为单个测试添加注释:

1
@Test(timeout=10000)

但是这样做会使他的长时间测试始终失败。我希望它们在框上运行时可以工作(如果需要在检入项目之前对项目进行细微调整,那是可以接受的。但是,从40个不同的测试文件中删除超时是不切实际的)。

我也知道我可以创建一个ant任务来为所有测试设置默认超时,如下所示:

1
2
3
<junit timeout="10000">
  ...
</junit>

问题在于,我们通常使用Eclipse> Run As> JUnit Test从Eclipse内部运行测试。

概要

那么,是否存在一种相对轻松的方法来设置所有测试的超时时间,例如使用"运行配置"设置,项目设置,JUnit首选项,环境变量等等?我什至会安装其他插件,让我右键单击特定的测试文件夹,然后以其他方式(例如通过ant或其他方式)运行所有测试...


可能的解决方案:
从另一个类扩展所有Test类:例如,TestBase

添加到TestBase全局超时。此超时将应用于所有扩展类:

1
2
3
4
public class TestBase {
    @Rule
    public Timeout globalTimeout = new Timeout(10000);
}


因此,结合使用Infinitest和"慢速测试警告"以及过滤功能可以解决问题。您可以识别超出时间限制的测试并将其添加到过滤器列表中,这只会影响Eclipse内部的测试。通过CLI / CI等通过可能的构建脚本运行测试完全不会受到影响。
您可以在此处找到有关设置的更多信息:http://improvingworks.com/products/infinitest/infinitest-user-guide/


My manager insists on writing Unit tests that sometimes take up to 5 minutes to complete

几乎可以肯定地说,这些测试实际上不是单元测试。消除Gordian的难题:尝试重构测试套件,以提供等效的测试范围,而无需运行如此长时间的测试用例。


如果要将测试配置为最多运行十秒钟,可以尝试以下操作:

@Test(timeout=10000)


听起来好像测试套件会帮助您。

您可以有两个测试套件。 QuickTestsAllTests。在AllTests套件中包括QuickTests,以及需要很长时间的测试。然后,所有其他测试将进入快速测试套件。

通过eclipse,您可以一次运行整个测试套件。因此,您将运行QuickTests,这样所有其他慢速测试将不会运行。

或查看有关如何对套件应用超时的问题,该超时将应用于套件中的嵌套套件和类。结合我上面的建议,可以达到与您想要的类似的效果。


几乎可以肯定,您的老板测试是假装为单元测试的系统测试。如果它们被假定为单元测试并且速度很慢,则应将其重构为使用模拟,以便它们运行得更快。

无论如何,比在这种情况下与老板面对面更务实,更外交的方法可能是自己尝试和运行速度更快的人。我曾在一个慢速测试名称中使用SytemTest的项目中看到过这样做的黑客。然后在构建文件中创建了两个ant目标。一个可以运行所有测试,另一个可以通过类名称SytemTest s过滤掉。要实现这一目标,您要做的就是重命名一些测试并编写您的ant目标。


我知道这并不能真正回答您的问题,但是简单的答案就不能!

有条件地设置超时是错误的行为,因为这样会使您的计算机上进行单元测试,从而导致您总是会失败。单元测试的重点是能够快速看到您没有破坏任何东西。必须检查失败的测试列表以确保它只是长时间运行的测试,这一定会使一些错误通过裂缝。

正如一些评论者提到的那样,您应该将测试分为快速运行的单元测试和运行速度较慢的集成测试,即,对于您的代码,有一个名为src / main / java的源文件夹,对于单元测试有一个src / test / java的源文件夹,而对于src / Integration-test / java,用于运行时间更长的测试。