介绍
单元测试需要将各个组件与其依赖项隔离开。 依赖被替换为嘲笑 ,这模拟某些使用情况。 这样,我们可以跨各种外部上下文场景验证测试中组件的行为。
可以使用模拟业务逻辑服务对Web组件进行单元测试。 可以针对模拟数据访问存储库对服务进行测试。 但是数据访问层不是单元测试的理想选择 ,因为数据库语句需要针对实际运行的数据库系统进行验证。
集成测试数据库选项
理想情况下,我们的测试应针对类似生产的数据库。 但是使用专用的数据库服务器是不可行的,因为我们很可能有多个开发人员来运行这种集成测试套件。 为了隔离并发测试运行,每个开发人员都需要一个专用的数据库目录。 添加连续集成工具会使情况变得更糟,因为必须并行运行更多测试。
第1课:我们需要一个分叉的测试套件绑定数据库
运行测试套件时,必须启动数据库,并且该数据库仅可用于该特定的测试套件实例。 基本上,我们有以下选择:
- 内存嵌入式数据库
- 临时产生的数据库进程
内存数据库测试的谬误
Java提供了多个内存中关系数据库选项供您选择:
嵌入内存数据库的速度很快,每个JVM都可以运行它自己的隔离数据库。 但是,我们不再针对实际的生产型数据库引擎进行测试,因为我们的集成测试将验证非生产型数据库系统的应用程序行为。
使用ORM工具可能会产生错误的印象,即所有数据库都是相等的,尤其是当所有生成的SQL代码都符合SQL-92时 。
对ORM工具数据库支持的好处可能会使您无法使用数据库特定的查询功能( 窗口函数 , 通用表表达式 , PIVOT )。
因此,集成测试内存数据库可能不支持此类高级查询。 这可能会导致代码覆盖率降低或促使开发人员仅使用常见的有限的SQL查询功能。
即使您的生产数据库引擎提供了内存中的变体 ,