JUnit&集成测试 - 是否可以在运行的任何测试之前运行一个

时间:2011-06-22 16:47:06

标签: java junit

我从多模块设置中提取了所有集成测试,并将它们全部放入一个单独的项目中。这些集成测试基于spring并使用真正的数据库。我正在使用dbmaintain这是一个数据库版本控制工具,它会自动跟踪需要应用哪些SQL文件并使数据库保持正确状态。

我希望能够在运行任何测试之前运行确保数据库是最新的代码。因此,如果您运行所有测试(在我的情况下来自Eclipse或Maven)它将首先执行db检查一次,或者如果您运行单个测试,它将首先执行db检查。无论运行多少个测试,它都应该始终运行db检查。

现在我想我将在基础测试类中使用@BeforeClass(所有测试最终都从这个类扩展),它将实例化一个单例来完成它的工作。那个单身人士将控制一切,以确保只运行一次。

我希望有更清洁的方式。

3 个答案:

答案 0 :(得分:2)

默认情况下,JUnit的Maven运行器保留重新排序测试的权利。这实际上是一件好事(tm),因为您可以告诉Maven JUnit插件运行tests in parallel,这意味着您无论如何都不会知道订单。此外,可以设置其他工具(如TeamCity)以首先运行失败的测试。

我认为最好的办法是将数据库更新代码添加为测试套件设置的一部分(不是JUnit框架的一部分)。使用Exec Maven Plugin调用您的数据库代码,将其绑定到generate-test-resources phase。您需要确保在运行测试时实际上call Maven to run the test

JUnit确实具有ExternalResource的概念,这是一种更明确的方式来声明数据库依赖性。它会比基类多几行代码,但根据你的需要,它可能会更优雅。

答案 1 :(得分:1)

在Maven中: (1)添加dbmaintain插件:http://source.mysema.com/display/maven/Maven+Plugins (2a)在调用test之前显式调用适当的目标(例如updateDatabase) (2b)或者,如果您希望在特定阶段执行依赖项,那么maven也支持这一点:http://maven.apache.org/plugins/maven-dependency-plugin/usage.html

然后,您可以将Eclipse连接到这些Maven更改: How do I start Maven "compile" goal on save in Eclipse?

答案 2 :(得分:1)

JUnit不支持测试排序。您需要使用TestNG。例如:

@Test(groups = "init")
public void initDatabase() { ... }

@Test(dependsOnGroups = "init")
public void test1() { ... }

@Test(dependsOnGroups = "init")
public void test2() { ... }

在此示例中,将首先运行initDatabase(),并且只有在成功时才运行test1()和test2()。如果initDatabase()失败,test1()和test2()将不会运行,它们将在报告中标记为“跳过”。

另请注意,您可以随时向任何组添加方法,并且依赖项将按照您期望的方式继续工作。