SuperAPI AI 工具集

testing

测试与质量

查看项目

更新于 10-15 21:12

技能介绍

用途:说明 EF Core 仓库测试基础设施的实现细节,适用于修改测试 fixture、SQL 基线断言、测试辅助类或测试类层级时参考。

主要能力与测试分类:单元测试位于 test/EFCore.Tests/、test/EFCore.Relational.Tests/ 和各 Provider 的 test/EFCore.{Provider}.Tests/,通过 *TestHelpers.Instance.CreateConventionBuilder() 构建模型、从 CreateContextServices() 解析服务,无需数据库。规范测试定义“测什么”(LINQ 查询与预期结果),不能直接运行,由 Provider 测试重写以验证“怎么执行”(生成 SQL):核心在 test/EFCore.Specification.Tests/,关系型在 test/EFCore.Relational.Specification.Tests/。功能测试位于 test/EFCore.{Provider}.FunctionalTests/,继承规范测试,多数含 SQL 基线断言。

测试类层级与辅助类:查询示例为 QueryTestBase<TFixture> → NorthwindWhereQueryTestBase<TFixture> → NorthwindWhereQueryRelationalTestBase<TFixture> → NorthwindWhereQuerySqlServerTest。Provider 重写模式为先 await base.Where_simple(async) 运行 LINQ 并断言结果,再用 AssertSql 断言 Provider 特有的 SQL。TestHelpers 层级为 TestHelpers(抽象)、InMemoryTestHelpers、RelationalTestHelpers(抽象)、SqlServerTestHelpers、SqliteTestHelpers;关键方法有 CreateConventionBuilder()、CreateContextServices(model)、CreateOptions()。

Fixture:SharedStoreFixtureBase 让多个测试共用一个数据库,在 InitializeAsync() 中创建 TestStore 与池化 DbContextFactory 并只播种一次数据,适合读多的测试;NonSharedModelTestBase 每个测试新建模型与存储,每个测试调用 InitializeAsync<TContext>(onModelCreating, seed, ...),适合需要独立架构的测试。

SQL 基线断言:TestSqlLoggerFactory 捕获 SQL,AssertSql("""...""") 与预期比较;设置 EF_TEST_REWRITE_BASELINES=1 可通过 Roslyn 自动重写基线。

新增测试流程:规范测试加到 EFCore.Specification.Tests(核心)或 EFCore.Relational.Specification.Tests(关系型);在每个继承该基类的 Provider 功能测试类中重写并加 Provider 合适的断言;单元测试加到 EFCore.{Provider}.Tests;用 EF_TEST_REWRITE_BASELINES=1 捕获初始基线;启用项目重建运行测试(不要用 --no-build)以反映代码改动;测试跨平台代码(如文件路径、路径分隔符)时需在 Windows 与 Linux/macOS 上验证。

直接对已构建程序集运行测试时,用 dotnet exec 调用测试 DLL 并附加 --filter-not-trait category=failing --ignore-exit-code 8,除非测试程序集刚在上一步构建,否则不要加 --no-build。

常见问题:基线不匹配(SQL 或编译模型)可用 EF_TEST_REWRITE_BASELINES=1 重跑;Check_all_tests_overridden 失败需在每个继承的 Provider 类中重写新测试;较低兼容级别缺少 SQL Server 特性时用 [SqlServerCondition(...)] 限定。