在持续集成环境中 运行 编写集成测试的最佳实践或有效方法
Best practices or the effective approach to write integration test which run in a continues integration environment
一般来说,我从我的服务/远程处理层编写集成测试到数据库,这样我就可以检查服务器端层是否已集成和测试,我想将回滚保持为 false,否则我们会错过数据库约束级别验证。这是个人喜好。
我们可以采用不同的方法
- 为每个测试用例创建数据并在执行后删除它
- 运行 具有一定数量的现有公共数据,例如(用户)
可能有实体依赖于其他几个实体,为了能够测试这样的流程,需要大量的努力来为每个测试用例或 class 创建每个实体,如果我们做出决定我们创建一定数量的数据并执行具有一定数量测试的业务流程并清除数据。这些东西会消耗很多时间来 运行 这样的测试用例。
业界是否有一种有效的方法或最佳实践可以在持续集成环境中编写集成测试。我通常使用 TestNG,因为它提供 spring 支持。有没有基于Java的框架
我认为这真的取决于一个项目,这里没有银弹解决方案。
你说的方法确实有很多,我就说几个吧:
在测试中利用 Spring 的 @Transactional
注释。在这种情况下,spring 将在每次测试后执行回滚。这样即使测试通过,测试更改的数据也不会真正保存在数据库中。
不要使用@Transactional,但要组织测试以免干扰(每个测试将使用自己的一组数据,这些数据可以与其他测试数据共存)。如果测试失败并且没有 "clean-up" 它的东西,那么其他测试应该仍然 运行。此外,如果测试 运行 并行进行,它们仍然不应干扰。
为每个测试使用新模式(显然很昂贵,但对于某些项目来说仍然是一个可行的选择)。
现在,真正的问题是您要测试什么。
如果您测试 java 代码,例如您的 SQL 已正确创建,那么第一种方法可能是可行的。
当然,这也取决于测试期间执行的命令,并非所有数据库中所有命令都可以在事务中(例如,在 Postgres 中,您可以在事务中使用 DDL,在 Oracle 中,您可以't,等等)。
在连续测试过程中要考虑的另一个问题是测试的性能。
集成测试很慢,如果你有一个 运行 数百个的整体应用程序,那么构建将非常缓慢。管理 运行 小时的构建非常痛苦。
我想在这里提到 2 个可以帮助这里的想法:
在这种情况下转向微服务有很大帮助(每个微服务 运行 只是它的一堆测试,因此每个微服务本身的构建速度自然要快得多)
另一个需要考虑的有趣选项是 运行针对数据库的 docker 容器进行测试,该容器在测试用例中启动(它也可以被缓存,以便并非每个测试都会引发 docker 容器)。这种方法的一大好处是一切 运行 都在本地(在构建服务器上),因此即使某些测试失败,也不会与远程数据库进行交互(性能)+资源清理是自动完成的. Docker 容器死亡,tets 放入的所有数据都会自动清理。看看 Testcontainers 项目也许你会发现它有帮助
一般来说,我从我的服务/远程处理层编写集成测试到数据库,这样我就可以检查服务器端层是否已集成和测试,我想将回滚保持为 false,否则我们会错过数据库约束级别验证。这是个人喜好。
我们可以采用不同的方法 - 为每个测试用例创建数据并在执行后删除它 - 运行 具有一定数量的现有公共数据,例如(用户)
可能有实体依赖于其他几个实体,为了能够测试这样的流程,需要大量的努力来为每个测试用例或 class 创建每个实体,如果我们做出决定我们创建一定数量的数据并执行具有一定数量测试的业务流程并清除数据。这些东西会消耗很多时间来 运行 这样的测试用例。
业界是否有一种有效的方法或最佳实践可以在持续集成环境中编写集成测试。我通常使用 TestNG,因为它提供 spring 支持。有没有基于Java的框架
我认为这真的取决于一个项目,这里没有银弹解决方案。
你说的方法确实有很多,我就说几个吧:
在测试中利用 Spring 的
@Transactional
注释。在这种情况下,spring 将在每次测试后执行回滚。这样即使测试通过,测试更改的数据也不会真正保存在数据库中。不要使用@Transactional,但要组织测试以免干扰(每个测试将使用自己的一组数据,这些数据可以与其他测试数据共存)。如果测试失败并且没有 "clean-up" 它的东西,那么其他测试应该仍然 运行。此外,如果测试 运行 并行进行,它们仍然不应干扰。
为每个测试使用新模式(显然很昂贵,但对于某些项目来说仍然是一个可行的选择)。
现在,真正的问题是您要测试什么。 如果您测试 java 代码,例如您的 SQL 已正确创建,那么第一种方法可能是可行的。
当然,这也取决于测试期间执行的命令,并非所有数据库中所有命令都可以在事务中(例如,在 Postgres 中,您可以在事务中使用 DDL,在 Oracle 中,您可以't,等等)。
在连续测试过程中要考虑的另一个问题是测试的性能。 集成测试很慢,如果你有一个 运行 数百个的整体应用程序,那么构建将非常缓慢。管理 运行 小时的构建非常痛苦。 我想在这里提到 2 个可以帮助这里的想法:
在这种情况下转向微服务有很大帮助(每个微服务 运行 只是它的一堆测试,因此每个微服务本身的构建速度自然要快得多)
另一个需要考虑的有趣选项是 运行针对数据库的 docker 容器进行测试,该容器在测试用例中启动(它也可以被缓存,以便并非每个测试都会引发 docker 容器)。这种方法的一大好处是一切 运行 都在本地(在构建服务器上),因此即使某些测试失败,也不会与远程数据库进行交互(性能)+资源清理是自动完成的. Docker 容器死亡,tets 放入的所有数据都会自动清理。看看 Testcontainers 项目也许你会发现它有帮助