Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在eclipse中设置JUnit超时_Java_Eclipse_Unit Testing_Junit_Timeout - Fatal编程技术网

Java 在eclipse中设置JUnit超时

Java 在eclipse中设置JUnit超时,java,eclipse,unit-testing,junit,timeout,Java,Eclipse,Unit Testing,Junit,Timeout,问题 当我使用eclipse运行所有JUnit测试时,是否可以设置默认超时 背景 我的经理坚持编写单元测试,有时需要5分钟才能完成。当我尝试运行整个测试套件(只有大约300个测试)时,可能需要30分钟以上。我想放一些东西在适当的地方,将停止任何测试,需要超过10秒 我知道单个测试可以用以下注释: @Test(timeout=10000) 但这样做会使他的长期测试总是失败。我希望当他在自己的机器上运行它们时,它们能够正常工作(如果在签入项目之前我必须对项目进行一些小的调整,这是可以接受的。但是,

问题

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

背景

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

我知道单个测试可以用以下注释:

@Test(timeout=10000)
但这样做会使他的长期测试总是失败。我希望当他在自己的机器上运行它们时,它们能够正常工作(如果在签入项目之前我必须对项目进行一些小的调整,这是可以接受的。但是,从40个不同的测试文件中删除超时是不实际的)

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

<junit timeout="10000">
  ...
</junit>

...
问题在于,我们通常通过右键单击>运行方式>JUnit测试从eclipse内部运行测试

摘要


那么,是否有一种相对轻松的方法来设置所有测试的超时,可以使用运行配置设置、项目设置、JUnit首选项、环境变量等?我甚至愿意安装一些其他插件,让我右键点击特定的测试文件夹,并以其他方式运行所有测试,比如通过ant或其他什么…

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

有条件地设置超时是错误的,因为您的机器上的单元测试总是会失败。单元测试的要点是能够快速发现您没有破坏任何东西。必须检查失败的测试列表以确保它只是长时间运行的测试,这将使一些bug通过裂缝


正如一些评论员提到的,您应该将测试分为快速运行的单元测试和慢速运行的集成测试,即为您的代码提供一个名为src/main/java的源文件夹,src/test/java用于单元测试,src/integration test/java用于长时间运行的测试。

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

@测试(超时=10000)

我的经理坚持编写单元测试,有时需要5分钟才能完成


这几乎可以肯定地表明,这些测试实际上不是单元测试。切记:尝试重构您的测试套件,以提供等效的测试覆盖率,而不需要运行那么长时间的测试用例。

几乎可以肯定,您的BOSS测试是假装为单元测试的系统测试。如果它们被支持为单元测试,并且速度很慢,那么应该重构它们以使用mock,这样它们运行得更快


无论如何,一个比与你的老板对抗更务实、更外交的方法可能是自己尝试运行更快的。我在一个项目中见过这样的黑客,在这个项目中,慢测试的名字中有
SytemTest
。然后在构建文件中创建了两个ant目标。一个运行所有测试,另一个按类名称过滤掉
SytemTest
s。要实现这一点,您需要做的就是重命名一些测试并编写ant目标。

因此,使用Infinitest和启用的“慢速测试警告”以及过滤功能的组合可能会达到目的。您可以识别超出时间限制的测试并将它们添加到过滤器列表中,这只会影响Eclipse内部的测试。通过CLI/CI等可能的构建脚本运行测试不会受到任何影响。 您可以在此处找到有关设置的详细信息:

可能的解决方案: 从另一个类扩展所有测试类:
TestBase

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

public class TestBase {
    @Rule
    public Timeout globalTimeout = new Timeout(10000);
}

听起来测试套件可以帮你解决这个问题

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

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


或者关于如何将超时应用于套件,该套件将应用于套件中的嵌套套件和类。结合我的上述建议,您可以获得类似的效果。

需要5分钟的测试?听起来他们要么每个测试做的太多,要么是集成测试而不是单元测试……您可以将集成测试与junit测试分开。长时间运行的测试应该在hudson这样的buildserver上运行,而不是在本地的主机上运行。@Donal:不幸的是,它们是单元测试。我不喜欢他们。我不同意他们的观点。然而,我对此无能为力。因此我的问题是。。。我的目标是,至少,解决我盒子上的问题。我想我将编写一个方面,用
@test(timeout=10)
注释所有测试方法。然后,我将永远不会将这方面检查为Subversion。这是我的计划,我认为…方面方法不起作用,因为这些方法已经有@Test注释,并且目前在AspectJ中没有替换注释的机制。。。不过,我认为它正在进行中。
@Test(timeout=10)
表示超时10毫秒而不是10秒。感谢您抽出时间回答,但您正在向唱诗班布道;)我百分之百同意你的意见,但我不能做出这样的改变。所以我的问题更多的是关于消除糟糕的单元测试的影响。@gmale:我们都有过这种经历,伙计,但是如果你不继续和你的老板在一起,一切都不会改变。快速查看一下Ant源代码,它们应用的超时不是JUnit的事情。对于您不需要的特定测试,您可能需要使用@Ignore