名称: tunit 描述: 使用 Playwright 运行 TUnit 测试。当用户要求运行测试、执行测试或检查测试是否通过时使用。
运行 TUnit 测试
本项目使用 TUnit 与 Playwright 进行测试。测试位于 tests/SummitUI.Tests.Playwright/ 目录中。
运行所有测试
dotnet run --project tests/SummitUI.Tests.Playwright
以有限并行度运行测试(推荐)
为防止运行 Playwright 测试时系统过载,请限制并行测试执行:
# 以最多 1 个并行测试运行(顺序执行)
dotnet run --project tests/SummitUI.Tests.Playwright -- --maximum-parallel-tests 1
# 以最多 2 个并行测试运行
dotnet run --project tests/SummitUI.Tests.Playwright -- --maximum-parallel-tests 2
使用过滤器运行测试
TUnit 使用 --treenode-filter 并遵循路径模式:/程序集/命名空间/类/测试
按类名过滤:
dotnet run --project SummitUI.Tests.Playwright -- --treenode-filter '/*/*/类名/*'
按精确测试名过滤:
dotnet run --project SummitUI.Tests.Playwright -- --treenode-filter '/*/*/*/测试名'
示例:
# 运行所有 Select 可访问性测试
dotnet run --project tests/SummitUI.Tests.Playwright -- --treenode-filter '/*/*/SelectAccessibilityTests/*'
# 按名称运行特定测试
dotnet run --project tests/SummitUI.Tests.Playwright -- --treenode-filter '/*/*/*/Trigger_ShouldHave_RoleCombobox'
# 运行匹配模式的测试(测试名中使用通配符)
dotnet run --project tests/SummitUI.Tests.Playwright -- --treenode-filter '/*/*/*/Keyboard*'
# 运行命名空间中的所有测试
dotnet run --project tests/SummitUI.Tests.Playwright -- --treenode-filter '/*/SummitUI.Tests.Playwright/*/*'
在调试模式下运行测试
当调试器附加时,Playwright 将通过 Hooks.cs 中的设置自动在调试模式(PWDEBUG=1)下运行。
查看测试输出
添加 --report 标志以获取不同的输出格式:
# 带有详细信息的控制台输出
dotnet run --project tests/SummitUI.Tests.Playwright -- --output-format console-detailed
# 生成 TRX 报告
dotnet run --project tests/SummitUI.Tests.Playwright -- --report-trx
减少测试不稳定性
测试项目包含多项功能以减少不稳定性:
- 自动重试:测试失败时自动重试最多 2 次(GlobalSetup.cs 中的
[Retry(2)]) - 完全顺序执行:所有测试通过 GlobalSetup.cs 中的
[assembly: NotInParallel]顺序运行 - 服务器就绪检查:
Hooks.cs在测试开始前等待 Blazor 服务器完全就绪 - 延长超时时间:通过
tunit.json配置更长的测试和钩子超时时间
项目结构
GlobalSetup.cs- 程序集级别的测试配置(重试、并行度)Hooks.cs- 测试会话设置/拆卸(启动 Blazor 服务器)BlazorWebApplicationFactory.cs- 用于托管测试服务器的 WebApplicationFactorytunit.json- TUnit 配置文件*AccessibilityTests.cs- 继承自PageTest的可访问性测试类
测试约定
- 测试继承自
TUnit.Playwright.PageTest以获取Page访问权限 - 使用
[Before(Test)]进行每个测试的设置 - 使用
[Before(TestSession)]/[After(TestSession)]进行会话范围的设置 - 通过
Hooks.ServerUrl访问正在运行的服务器