为什么建议为每个测试重新创建整个数据库模式?

问题描述

据说为了使用 Spring 数据(JPA)执行数据库测试,为每个测试重新创建整个数据库模式是一个很好的做法,以便在测试后从数据库删除所有对象并清理整个下一个测试 (https://reflectoring.io/spring-boot-data-jpa-test/) 的环境。但是根据我提出的问题(Sql scripts for creation of same table in repository tests),如果建议为测试创建数据库的整个架构而不只是其中的一部分,为什么不为所有测试重用此架构,如果它们共享相同模式并只删除数据?

谢谢

解决方法

重点是确保您的测试是独立的,并且测试所需或生成的数据不会影响不同测试的结果。

重新创建架构为您提供了这种保证,因为每个测试都将从一个干净的数据库开始。

也就是说,模式的创建/删除是一项非常繁重的操作,您添加到测试套件中的测试越多,它就会变得越慢。 缺点是您需要确保在每次测试后清理数据。这在实践中可能不太复杂(您可能需要特别注意不同测试中的不同实体映射到具有相同名称的表)但是如果您正在处理一个小项目或者您的数据库非常快速地更新架构,这可能不值得麻烦。

由您决定什么适合您的项目。

作为一个实际例子,在 Hibernate Reactive 中,我们需要在几个不同的数据库上运行相同的测试。我们开始为每个单元测试重新创建工厂,但是因为运行测试变得太慢(尤其是在某些数据库上),我们已经切换到为每个测试类重新创建一次工厂。它帮助我们节省了大量时间,因为同一班级的测试变得更快了。

最后,您需要决定测试套件的组织方式以及一种方法相对于另一种方法的优势。但只要您有理由确信测试不会相互影响,您就可以使用您喜欢的解决方案。