Orisumi

Database

测试用的 PostgreSQL 实例、用例隔离、迁移与清理

集成测试和端到端测试用 Testcontainers 管理 PostgreSQL 容器,版本与服务使用的相同,见 Storage · PostgreSQL。每个用例拿到一个已经完成迁移的空数据库,用完即删。

实例与隔离

集成测试和端到端测试各用一个容器。容器在测试运行开始时创建、结束时销毁;同一次运行中,同一类测试共用这个容器。

每个需要数据库的用例创建自己的空数据库,名称是 test_<随机 UUIDv7>,UUID 使用不带连字符的 N 格式。用例结束后删除这个数据库。

测试通过 ConnectionStrings:Orisumi 提供用例的连接字符串,被测的后端按服务本身的方式注册数据库。

建表

测试与服务共用 Infrastructure 中的 EF Core 迁移。准备用例时,工具调用 Database.MigrateAsync(),把迁移应用到用例的空数据库。数据库创建成功、迁移也成功,工具才返回 TestDatabase。

公开方法

PostgresTestInstance 和 TestDatabase 都实现了 IAsyncDisposable。

方法或属性结果
PostgresTestInstance.StartAsync(CancellationToken cancellationToken = default)静态方法,返回 Task<PostgresTestInstance>,容器已经启动
instance.CreateDatabaseAsync(CancellationToken cancellationToken = default)返回 Task<TestDatabase>,数据库已经创建并完成迁移
database.ConnectionString只读属性,用例数据库的连接字符串
database.DisposeAsync()返回 ValueTask,删除用例数据库
instance.DisposeAsync()返回 ValueTask,销毁 PostgreSQL 容器

清理与失败

每个用例结束时,调用方按顺序清理:

  1. 释放被测的后端和数据库连接。
  2. 释放 TestDatabase,删除用例数据库。

整次测试运行结束时,调用方释放 PostgresTestInstance,由它销毁容器。

创建数据库或迁移失败时,工具先清理已经创建的资源,再报告错误。清理本身失败,测试同样失败。

贡献者

页面历史