【问题标题】:Junit 4 suite is ignored (Eclipse and Maven)Junit 4 套件被忽略(Eclipse 和 Maven)
【发布时间】:2012-07-25 14:42:07
【问题描述】:

我有 2 个测试类和一个用于初始化一些公共资源的套件。在所有类中都有用 @BeforeClass 注释的方法 - 套件和两个测试类以及 @AfterClass 仅在套件中。

当我将西装作为 Eclipse 的单独测试类运行时,它工作正常,但是当我尝试运行项目中的所有测试时,顺序无效。 Eclipse 出于某种原因尝试首先运行测试(由于资源尚未初始化而失败),然后才运行套装本身。 Maven 似乎也忽略了这套西装。如何配置 Maven 和 Eclipse 以正确的顺序运行测试(首先是套件)而不是从套件外部运行这些测试?

这不是代码重复的问题。问题在于无法快速连续初始化和销毁​​的资源。这就是为什么我需要一个只初始化一次资源的套件。

谢谢。

【问题讨论】:

  • 这不是您的问题的答案,但通常您应该编写测试,以便每个测试都是独立的,以便测试可以独立运行并且顺序无关紧要.
  • 我尝试过,但在这种情况下,我不能多次初始化资源。
  • 是否可以检查资源是否已经初始化,如果已经初始化则跳过初始化?

标签: java eclipse maven junit


【解决方案1】:

出于多种原因,您使用套件进行拆解会给您带来问题,尤其是您无法预测 Eclipse(或 Maven)执行测试的顺序这一事实。如需更全面的解释,请参阅我对Has JUnit4 begun supporting ordering of test? Is it intentional? 的回答,但由于 Eclipse 和 maven 通过反射(注解)查找类,您无法保证以何种顺序找到这些类。 [* 你可以使用 maven 和 runOrder,见下面的第 3 点]

Eclipse(和 Maven)将套件视为测试,它是通过相同的机制找到和运行的,并且它们的执行顺序高度依赖于 JVM。

因此,如果您有套件 A(包含测试 B 和 C)和测试 D,那么您将执行以下操作(以不可预知的顺序):

A (which will execute B & C)
B
C
D

一般来说,您应该尝试保持对称,在同一个地方进行设置/拆卸。

因此,您有以下选择:

  1. 仅使用@BeforeClass/@AfterClass(或更好的@ClassRule、ExternalResource),并删除您的测试套件。这是您最干净的选择,因为您正在为每个测试类进行设置。
  2. 仅从 Eclipse 运行测试套件,并使用 Maven Surefire Includes/Excludes 在 Maven 中执行相同操作。请注意,如果您只运行测试套件,最好在套件中完成设置而不是在每个类中完成设置。但是,当仅从 Eclipse 运行单个测试时,这会产生问题。
  3. 按特定顺序运行测试。这不能在 Eclipse 中完成,但可以在 Maven 中完成,请参阅surefire:test runOrder。您必须有一些命名约定。
  4. 使用TestNG,它明确支持类的排序,并且使用要运行的类列表进行设置可能更容易,但在设置/拆卸时仍然会遇到同样的问题。

【讨论】:

  • 好吧,我明白你在说什么。西装没有真正的支持。然后我不明白如果没有人知道如何正确使用它,为什么 Junit 还要麻烦西装支持?此外,在执行测试之前扫描源代码并构建依赖关系树并不是真正的技术挑战。
【解决方案2】:

将带有@BeforeClass 和@AfterClass 的代码放在每个测试类中。

如果您有许多类要测试,请将测试套件抽象化,并确保所有需要逻辑逻辑的类都继承自测试套件。

【讨论】:

  • 请查看更新。这不是代码重复的问题。
猜你喜欢
  • 1970-01-01
  • 2016-09-07
  • 2013-11-19
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
  • 2014-08-12
  • 1970-01-01
  • 2019-03-07
相关资源
最近更新 更多