在spring-boot应用程序中进行慢速单元测试

Gre*_*reg 6 java spring unit-testing maven

我还是单元测试的新手.我开始读一本关于它的书.但最重要的一点是,测试必须是第一个(快速,隔离,可重复,自我验证,及时).

好的,现在我已准备好进行一些练习.但是当我在春季靴子中构建单元测试时.我喜欢让他们分开.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = UnitTestApplication.class, loader = SpringApplicationContextLoader.class)
@WebIntegrationTest("server.port:9000")
public class FirstTestClassTest{

    ...

}


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = UnitTestApplication.class, loader = SpringApplicationContextLoader.class)
@WebIntegrationTest("server.port:9001")
public class SecondTestClassTest{

    ...

}
Run Code Online (Sandbox Code Playgroud)

这给我的问题是,对于每个测试类,都有一个新的实例启动了应用程序.

所以,假设我介绍了一个新功能,并希望测试bug.我在命令行中使用mvn test.然后运行所有测试,但我认为通过大量测试的实际应用程序需要很长时间.

我有一种方法,只有一个实例启动并保持测试快速但我可以在不同的类中保持测试?

Mar*_*nik 11

我会参考你的句子:

所以,假设我介绍了一个新功能,并希望测试bug.我在命令行中使用mvn test.然后运行所有测试,但我认为通过大量测试的实际应用程序需要很长时间.

你在这里提出的这个问题非常重要,所以我将尝试在这里提供一个架构观点而不深入研究技术实现.

有许多不同类型的测试.你所指的是一个集成测试,而不是一个单元测试.在单元测试中你测试一个类和所有其他类的那两个之间的差异应该被模拟(有像EasyMock或Mockito这样的框架).

单元测试有很多限制:

  • 您无法访问任何外部组件(Web服务器,数据库等)
  • 单元测试仅在内存中运行
  • 它们非常快(第二颗粒).

在测试类的功能时,这些测试非常有用

现在,当功能的开发完成时,是时候测试该功能是否在"半实际"环境中工作.通常在运行时,可以使用数据库以及弹簧容器.对于运行此类测试,您可以使用spring测试扩展并使用不同的技术(例如,将整个应用程序spring上下文替换为"partial"上下文,或者使用存根或其他内容覆盖某些bean.

现在,这个差异在您的问题的上下文中很有意思,因为在应用程序中应该有许多单元测试和大大减少的集成测试.因此,如果你可以覆盖你用单元测试编写的东西 - 编写单元测试.它的性质非常快,你可以在很短的时间内运行很多(数千个).只有当您(很少)无法在单元测试中覆盖您的功能时 - 编写集成测试.这通常与针对DB运行的代码相关,并且您希望测试组件生成的查询是否真的有效.

所以一般来说,如果你有两种类型的测试,你应该被覆盖,并且应该没有那么多的集成测试,所以运行它们不应该是一个真正的麻烦.