菜单

测试框架

相关源文件

此页面介绍了 Immich 项目中使用的测试框架。它涵盖了如何编写和组织测试、可用于测试的实用函数和工厂,以及整体测试架构。

概述

Immich 使用了一个全面的测试框架,支持不同的测试策略,从小型单元测试到大型集成测试。该框架提供了用于模拟依赖项、创建测试数据和设置测试数据库的实用程序。

测试架构

来源:server/test/utils.ts1-369 server/test/small.factory.ts1-314 server/test/medium.factory.ts1-471

核心测试工具

测试框架提供了几个核心工具来简化测试创建

automock 函数

automock 函数创建类的模拟版本,其中所有方法都替换为 Vitest 模拟函数。这用于模拟仓库、服务和其他依赖项。

在没有模拟实现的情况下调用模拟函数时,它们会使测试失败(严格模式),或者悄悄地返回 undefined(非严格模式)。

newTestService 函数

newTestService 函数创建服务实例,并模拟其所有依赖项。它返回服务实例(被测系统)和模拟对象。

getKyselyDB 函数

对于需要数据库访问的测试,getKyselyDB 函数通过克隆模板数据库来创建测试数据库连接。

来源:server/test/utils.ts79-111 server/test/utils.ts170-277 server/test/utils.ts300-318

测试工厂

该框架提供了用于创建测试对象的工厂

小型工厂

小型工厂 (small.factory.ts) 提供了用于创建轻量级内存测试对象的函数,无需数据库交互。这非常适合单元测试。

中型工厂

中型工厂 (medium.factory.ts) 提供了用于创建数据库支持的测试对象的函数。这些函数通过 Kysely 直接与数据库交互,因此适用于集成测试。

来源:21-314 server/test/medium.factory.ts34-470

编写测试

Immich 支持两种主要测试方法

带模拟依赖项的单元测试

单元测试专注于在隔离环境下测试单个组件,所有依赖项都被模拟。此方法用于大多数服务测试。

使用模拟依赖项的服务测试示例

带真实依赖项的集成测试

集成测试使用真实和模拟依赖项的组合。这些测试通常使用 newMediumService 函数来创建具有真实数据库连接的服务。

来源:server/src/services/auth.service.spec.ts1-816 server/test/medium.factory.ts75-115

测试仓库模式

测试框架围绕仓库接口的概念构建。src/types.ts 中的 RepositoryInterface 类型用于创建仓库的类型化模拟。

仓库通过 BaseService 类注入服务,该类将所有仓库依赖项作为构造函数参数。

来源:server/src/types.ts19-22 server/src/services/base.service.ts54-166

服务测试模式

大多数服务测试遵循此模式

  1. 使用 newTestService 创建被测服务及模拟依赖项
  2. 使用小型工厂设置测试数据
  3. 配置依赖项的模拟行为
  4. 调用被测方法
  5. 断言结果和模拟交互

示例

来源:server/src/services/auth.service.spec.ts51-75

使用真实数据库进行测试

对于需要与真实数据库交互的测试,框架提供了 getKyselyDB 函数,它通过克隆模板数据库来创建测试数据库。这在集成测试中使用。

该函数创建一个带有随机或提供后缀的新数据库,克隆 immich 模板数据库,并返回到新数据库的 Kysely 连接。

来源:server/test/utils.ts300-318

测试 Web 组件

Immich 中的 Web 组件使用一种单独的测试方法,专注于组件测试。这些测试使用 Vitest 等框架进行单元测试,并可能包含用于测试 Svelte 组件的工具。

组件测试通常验证

  • 渲染逻辑
  • 组件状态
  • 事件处理
  • 组件交互

来源:web/src/lib/utils/duplicate-utils.spec.ts1-38 web/src/lib/utils/exif-utils.spec.ts1-30

结论

Immich 测试框架提供了一套全面的工具,用于在不同层面测试应用程序的不同部分

  1. 使用 automocknewTestService单元测试,包含完全模拟的依赖项
  2. 使用 getKyselyDBnewMediumService集成测试,包含真实数据库连接
  3. 用于内存对象 (small.factory.ts) 和数据库对象 (medium.factory.ts) 的测试数据工厂

这种方法允许开发人员根据被测试组件的隔离级别和复杂性来编写适当的测试。