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

Java JUnit&;集成测试-是否可以在运行任何测试之前运行一个测试,java,junit,Java,Junit,我从我的多模块设置中提取了所有集成测试,并将它们全部放在一个单独的项目中。这些集成测试基于spring和一个使用真实数据库的应用程序。我使用的是dbmaintain,这是一个数据库版本控制工具,它自动跟踪需要应用的SQL文件,并保持数据库处于正确状态 我希望能够运行代码,确保在运行任何测试之前数据库是最新的。因此,如果您运行所有测试(在我的例子中是Eclipse或Maven),它将首先执行一次db检查,或者如果您运行单个测试,它将首先执行db检查。无论运行多少测试,它都应该始终运行db检查 现在

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

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

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


我希望有一种更干净的方法。

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

我认为最好是将DB更新代码添加到测试套件设置中(而不是JUnit框架的一部分)。使用调用DB代码,将其绑定到。您将希望确保在运行测试时,您确实可以


JUnit有一个更明确的定义数据库依赖关系的概念。它可能比基类多出几行代码,但根据您的期望,它可能更优雅。

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

我认为最好是将DB更新代码添加到测试套件设置中(而不是JUnit框架的一部分)。使用调用DB代码,将其绑定到。您将希望确保在运行测试时,您确实可以

JUnit有一个更明确的定义数据库依赖关系的概念。它可能比基类多出几行代码,但根据您的期望,它可能更优雅。

在Maven中: (1) 添加dbmaintain插件: (2a)在调用test之前显式调用适当的目标(例如updateDatabase) (2b)或者,如果您希望在特定阶段执行依赖关系,那么maven也支持这一点:

然后,您可以将Eclipse连接到这些Maven更改: 在Maven内部: (1) 添加dbmaintain插件: (2a)在调用test之前显式调用适当的目标(例如updateDatabase) (2b)或者,如果您希望在特定阶段执行依赖关系,那么maven也支持这一点:

然后,您可以将Eclipse连接到这些Maven更改:
JUnit不支持测试排序。您将需要为此使用。例如:

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

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

@Test(dependsOnGroups = "init")
public void test2() { ... }
在本例中,将首先运行initDatabase(),并且只有当它成功时,才会运行test1()和test2()。如果initDatabase()失败,test1()和test2()将不会运行,并且它们将在报告中标记为“跳过”


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

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

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

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

@Test(dependsOnGroups = "init")
public void test2() { ... }
在本例中,将首先运行initDatabase(),并且只有当它成功时,才会运行test1()和test2()。如果initDatabase()失败,test1()和test2()将不会运行,并且它们将在报告中标记为“跳过”

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