2016-08-12 51 views
2

我想让测试类知道它们当前是否在Suite内执行。 我有一个测试套件,在所有测试之前启动服务器,并在所有测试后使用ExternalResource关闭服务器。完美的作品。 在编写新测试时,我想运行一个测试(或者来自同一个测试类的所有测试)来启动和停止服务器。所以我希望这些类能够意识到它们当前是否在套件内部执行,并相应地启动服务器启动。 这似乎是不可能的。套件Description永远不会传递到@Rule s或@ClassRule看来。我也无法获得目前运行当前测试的Runner的参考信息。如何使JUnit测试知道它们当前是否在套件内运行

有没有办法做到这一点?

更新由于首次提出答案:

请注意,有可能测试套件之前和之后运行许多其他测试。因此我不能依靠JVM关闭。 我的主要需求是在编写测​​试之后立即在IDE(eclipse)中运行单个测试,并且仍然启动服务器并关闭服务器。尽管套件中的每个测试都不应该发生。

回答

0
  1. 使所有的测试类扩展一些AbstractServerTest
  2. 在其中添加@BeforeClass方法来检查服务器是否已在运行,如果不是,则启动它。
    • 请记住,将为每个子类调用@BeforeClass,因此if语句是必需的。
  3. 当最后一次测试完成时,JVM将关闭,所以只要您的服务器运行在相同的JVM中(而不是单独的进程),则不需要执行任何清理。
    • 如果你的服务器运行的是作为一个独立的进程,在你@BeforeClass方法,你可以添加一个shutdownHook将执行一些命令停止服务器时,JVM关闭。
+0

总的来说,我同意这种方法,除了继承,通常的问题适用于此。你可以用'Rule'来完成,并避免完全继承 – tddmonkey

+0

@tddmonkey是否需要将此规则添加到每个类?在这两种情况下,所有测试类都必须改变,但在我看来'扩展AbstractServerTest'比添加注释更加简单,这是其他领域的一个噪音。你也必须记住公开场地,否则将被忽略。继承你不能犯这样的错误。 –

+0

可以工作,但不是在我的情况。有几百个其他的JUnit测试可以在使用服务器的测试之前或之后运行。这意味着在完成最后一次测试后,JVM不一定会关闭。 – sorrymissjackson

0

也许我只是建议使用端口的探测和检查,如果一个端口是JUnit测试规则内已经绑定(或@Before/@BeforeClass标注的方法),并只初始化服务端口是否仍然可用。通过这种方式,您可以在外部或套件内启动该服务,并在测试中重新使用该服务,或者在测试之前对其进行初始化(如果端口仍然可用)。这当然需要固定的端口分配,仅用于测试时所需的特定服务。

正如您明显正在执行集成测试一样,您可能也会对如何设置MavenGradle自动在测试集成阶段执行测试感兴趣。

相关问题