关于 uloop-run-tests
uloop-run-tests 是运行 Unity Test Runner 的技能,适用于 Unity 项目的测试执行与诊断。它会在测试前编译脚本、处理未保存的场景更改,并在测试失败时保存 NUnit XML 结果。
主要功能
- 01运行 EditMode 或 PlayMode 测试
- 02按名称、正则或程序集筛选
- 03测试前编译脚本
- 04处理未保存的场景和预制件更改
- 05失败时保存 NUnit XML
适用场景
- 01验证脚本更改是否通过测试
- 02定位失败测试及堆栈信息
- 03为缺少测试程序集的项目生成建议配置
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ hatayama/ unity-cli-loop --skill uloop-run-tests安装后在 Claude Code 中输入/uloop-run-tests确认已加载。
详细介绍
uloop run-tests
执行 Unity Test Runner。测试失败时,NUnit XML 结果(包含错误消息和堆栈跟踪)会自动保存。读取 XmlPath 中的 XML 文件,详细诊断失败原因。
uloop run-tests 会在运行测试前自动编译待处理的脚本更改。仅在验证正在生效的热重载补丁时传入 --skip-compile,因为编译会清除这些补丁;否则请使用默认编译,让编译暴露错误,并针对当前脚本运行测试。--skip-compile 仅跳过 CLI 端的编译:Unity 仍会导入上次编译后保存的脚本编辑,并在运行结束、释放程序集锁后立即重新加载域,从而丢弃生效中的补丁并结束请求。
执行测试前,uloop run-tests 会根据 --unsaved-changes(默认值为 save)处理已加载场景和 Prefab Stage 中未保存的更改:save 会先保存这些更改,fail 会在仍有未保存更改时停止,discard 会重新加载磁盘状态,让测试针对已保存的文件运行。未命名场景无法丢弃,因此会导致失败。如果所选模式无法继续执行,它会返回 Success: false,将 TestCount 保持为 0,在 Message 中列出相关项目,并且不会启动 Unity Test Runner。
开始执行测试前,会自动清除生效中的暂停点(同时移除底层代码补丁)。清除的 ID 会报告在响应的 ClearedPausePointIds 字段中。
测试运行可能会丢弃生效中的热重载更改:运行期间导入的脚本编辑会在测试运行器释放程序集重载锁时编译,延迟的域重载会清除这些补丁,即使测试本身是在应用补丁的状态下运行。响应的 Warning 字段会报告此情况;请在下次 Play 或运行测试前重新应用 'uloop hot-reload',或使用 'uloop compile' 将编辑内容编译进程序集。
NoTestsFound 表示没有匹配的测试,并非测试失败。请查看 NoTestsFoundExplanation 和 Message 中的 asmdef 提示。如果未筛选的运行未找到测试,且项目没有适用于 TestMode 的测试程序集,ProposedTestAsmdef 会提供一份可直接写入的 .asmdef:将 Content 保存到 AssetPath,把测试脚本移到该文件夹下,然后编译并重新运行。
用法
uloop run-tests [options]
参数
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
--test-mode | string | EditMode | 测试模式:EditMode、PlayMode |
--filter-type | string | all | 筛选类型:all、exact、regex、assembly、class |
--filter-value | string | - | 筛选值(测试名称、模式、程序集或类名) |
--unsaved-changes | string | save | save 会写入未保存的场景/Prefab Stage 更改;fail 在仍有未保存更改时停止;discard 会重新加载磁盘状态(未命名场景会失败) |
--skip-compile | flag | - | 运行测试前跳过 CLI 端编译;仅在验证活动热重载补丁时使用。Unity 仍会导入上次编译后保存的脚本编辑内容。 |
--timeout-seconds | integer | 600 | 等待 RunFinished 后取消等待的最长秒数(最大值为 1500)。长时间运行的测试套件可调高此值;超时后,Test Runner 可能仍在运行,直到停止处理生效 |
--respect-enter-play-mode-settings | flag | - | 仅限 PlayMode:保留项目的 Enter Play Mode 设置,而不是强制关闭 Domain Reload。运行期间发生 Domain Reload 后会继续运行;重载后会恢复结果。适用于库要求进入 Play Mode 时执行 Domain Reload 的项目。 |
默认情况下,PlayMode 仍会强制关闭 Domain Reload。使用 --respect-enter-play-mode-settings 时,可能会执行 Domain Reload,命令也会耗时更长;重载后恢复的结果中不会包含暂停点和热重载说明。在此模式下取消 CLI(Ctrl-C)不会停止 Unity 端的运行。
exact 会匹配完整测试名称(Namespace.Class.Method);class 会按裸类名或带命名空间的类名运行该类的所有测试,例如 --filter-type class --filter-value PlayerTests;名称会按字面值完整匹配,因此 PlayerTests 不会运行 EnemyPlayerTests。regex 会针对完整测试名称匹配 .NET 正则表达式,例如 --filter-type regex --filter-value '^MyGame\.Tests\.'
输出
返回包含以下内容的 JSON:
Success(布尔值):所有测试是否均通过Status(字符串):机器可读的执行状态,例如Passed、Failed、NoTestsFound或ExecutionFailedHasFailures(布尔值):是否有任何已发现的测试失败Message(字符串):摘要消息NoTestsFound(布尔值):Unity Test Runner 是否发现零个匹配测试NoTestsFoundExplanation(字符串):当NoTestsFound为 true 时,面向 Agent 的说明;否则为空CompletedAt(字符串):运行完成时的 ISO 时间戳TestCount(数字):执行的测试总数PassedCount(数字):通过的测试数FailedCount(数字):失败的测试数SkippedCount(数字):跳过的测试数XmlPath(字符串):NUnit XML 结果文件的路径。未保存 XML 时为空字符串(通常发生在Success: true时);仅当测试失败且 XML 文件存在于磁盘上时才会填入路径。ClearedPausePointIds(字符串数组,可选):测试执行前已清除的暂停点 ID。如果没有启用暂停点,则不在 JSON 中包含此项。FailedTests(数组,可选):最多包含 10 个失败的叶级测试,字段为FullName、Message,以及当堆栈跟踪中包含路径:行号位置时的File和Line。没有测试失败时不包含此项。当FailedCount大于 10 时,Message以first 10 of N failures listed; see XmlPath for full results.结尾。SkippedTests(字符串数组,可选):最多包含 10 个跳过的叶级测试的完整名称。没有测试被跳过时不包含此项。当SkippedCount大于 10 时,仅列出前 10 个名称。ProposedTestAsmdef(对象,可选):可直接写入的测试.asmdef的AssetPath和Content(测试程序集连接配置,以及对项目中受测程序集的引用)。仅当未筛选的运行未发现测试,且该 TestMode 不存在测试程序集时才会提供。CompileNote(字符串,可选):说明测试前已自动执行编译且编译成功,并指出可使用--skip-compile跳过编译。如果编译响应包含 Warning(例如域重新加载时丢弃了仍处于活动状态的热重载更改),此说明会重复该警告。传入--skip-compile时不包含此项;编译失败时则返回编译错误响应。
XML 结果文件
测试失败时,NUnit XML 结果会自动保存到 {project_root}/.uloop/outputs/TestResults/<timestamp>.xml。XML 包含每个测试用例的结果,包括:
- 测试名称和完整名称
- 通过/失败/跳过状态及持续时间
- 对于失败的测试:
<message>(断言错误)和<stack-trace>