Junit 4套件被忽略(Eclipse和Maven)

时间:2012-07-25 14:42:07

标签: java eclipse maven junit

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

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

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

感谢。

2 个答案:

答案 0 :(得分:0)

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

如果你有很多要测试的类,那就让测试套件抽象化,并确保所有需要tre逻辑的类都继承自测试套件。

答案 1 :(得分:0)

由于多种原因,您使用套件进行拆卸会导致您出现问题,但特别是您无法预测Eclipse(或Maven)执行测试的顺序。有关更全面的解释,请参阅我对Has JUnit4 begun supporting ordering of test? Is it intentional?的回答,但因为Eclipse& maven通过反射(注释)找到类,你无法保证将找到类的顺序。 [*你可以使用maven和runOrder,见下面的第3点]

Eclipse(和Maven)将Suite视为一个Test,它通过相同的机制找到并运行,并且它们的执行顺序高度依赖于JVM。

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

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

一般情况下,你应该尝试保持对称,在同一个地方进行setUp / teardown。

因此,您有以下选择:

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