2

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

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

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

谢谢。

4

2 回答 2

0

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

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

于 2012-07-25T15:00:07.590 回答
0

由于多种原因,您使用套件进行拆解会导致您出现问题,但特别是您无法预测 Eclipse(或 Maven)执行测试的顺序这一事实。有关更全面的解释,请参阅我对Has JUnit4 是否开始支持测试排序的回答?是故意的吗?,但是由于 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,它明确支持类的排序,并且可能更容易使用要运行的类列表进行设置,但您的设置/拆卸仍然会遇到同样的问题。
于 2012-07-25T16:16:55.163 回答