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 容器 |
清理与失败
每个用例结束时,调用方按顺序清理:
- 释放被测的后端和数据库连接。
- 释放
TestDatabase,删除用例数据库。
整次测试运行结束时,调用方释放 PostgresTestInstance,由它销毁容器。
创建数据库或迁移失败时,工具先清理已经创建的资源,再报告错误。清理本身失败,测试同样失败。