【发布时间】:2017-11-06 19:26:14
【问题描述】:
在我的应用程序中,我有几个集成测试,它们都执行以下操作:
- 设置应用程序上下文
- 创建测试数据库
- 用数据填充测试数据库
每次集成测试总是执行这三个初始步骤需要时间。我希望它们成为所有集成测试的某种基础。 有没有人有这方面的经验,可以通过文章、工具、线程等为我指明正确的方向?
感谢您的帮助!
/理查德
【问题讨论】:
在我的应用程序中,我有几个集成测试,它们都执行以下操作:
每次集成测试总是执行这三个初始步骤需要时间。我希望它们成为所有集成测试的某种基础。 有没有人有这方面的经验,可以通过文章、工具、线程等为我指明正确的方向?
感谢您的帮助!
/理查德
【问题讨论】:
你应该使用Junit5的@BeforeAll。
正如文档所说,@BeforeAll 用于表示应在当前测试类中的所有测试之前执行带注释的方法。
因此,使用这种方法,所有数据库设置都可以为类完成一次,而不是为每个单个方法完成一次。
【讨论】:
@BeforeAll 逻辑创建一个抽象类,然后继承你的类
这里的一个选择是使用@BeforeClass 方法创建一个基类,这样每当您需要重用它时 - 只需通过您的测试类扩展它即可。
另一种选择是使用org.junit.runner.notification.RunListener。它为您提供了将代码连接到不同事件的可能性,例如测试开始,测试完成等:
class TestListener extends RunListener {
@Override
public void testRunStarted(Description description) throws Exception {
// Called before any test has started
}
@Override
public void testRunFinished(Result result) throws Exception {
// Called when all tests have finished
}
@Override
public void testStarted(Description description) throws Exception {
}
@Override
public void testFinished(Description description) throws Exception {
}
@Override
public void testFailure(Failure failure) throws Exception {
}
@Override
public void testAssumptionFailure(Failure failure) {
}
@Override
public void testIgnored(Description description) throws Exception {
}
}
您甚至可以通过在插件配置中添加以下代码来使用 Maven 的surefire(单元测试)插件或故障安全插件(集成测试):
<properties>
<property>
<name>listener</name>
<value>com.your.awersome.TestListener</value>
</property>
</properties>
如果您只需要为一个项目执行此解决方案,那么与第一个选项相比,此解决方案更灵活,但恕我直言。
【讨论】: