我有2个测试类和一个用于初始化一些公共资源的套件。在所有类(套件和两个测试类)中都有用@BeforeClass
注释的方法,并且仅在套件中使用@AfterClass
注释。
当我将套装作为与Eclipse分开的测试类运行时,它可以正常工作,但是当我尝试在项目中运行所有测试时,顺序无效。 Eclipse由于某种原因尝试首先运行测试(由于尚未初始化资源而失败),然后才运行测试程序本身。
Maven似乎也忽略了诉讼。我该如何配置Maven和Eclipse以正确的顺序运行测试(首先是Suit),而不是从套件外部运行这些测试?
这与代码重复无关。问题在于无法快速连续初始化和销毁的资源。这就是为什么我需要一个仅将资源初始化一次的套件。
谢谢。
最佳答案
使用Suite进行拆卸的原因有很多,这会给您带来问题,但特别是您无法预测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
通常,您应该尝试保持对称性,并在同一位置进行设置/拆卸。
因此,您有以下选择:
仅使用@ BeforeClass / @ AfterClass(或更好的@ ClassRule,ExternalResource),并删除测试套件。这是最干净的选择,因为您正在为每个测试类进行设置。
仅从Eclipse运行测试套件,并使用Maven Surefire Includes/Excludes在Maven中执行相同的操作。请注意,如果只运行测试套件,则最好在套件中而不是在每个类中进行设置。但是,仅从Eclipse运行单个测试时,就会出现问题。
以特定顺序运行测试。这无法在Eclipse中完成,但可以在Maven中完成,请参见surefire:test runOrder。您必须具有一些命名约定。
使用TestNG,它明确支持类的排序,并且可能更容易通过要运行的类列表进行设置,但是在设置/拆卸中仍然会遇到同样的问题。