mcpField
U
uloop-run-tests

uloop-run-tests

github.com/hatayama测试与质量58640 次安装1 天前更新
代码仓库

关于 uloop-run-tests

uloop-run-tests 是运行 Unity Test Runner 的技能,适用于 Unity 项目的测试执行与诊断。它会在测试前编译脚本、处理未保存的场景更改,并在测试失败时保存 NUnit XML 结果。

主要功能

  1. 01运行 EditMode 或 PlayMode 测试
  2. 02按名称、正则或程序集筛选
  3. 03测试前编译脚本
  4. 04处理未保存的场景和预制件更改
  5. 05失败时保存 NUnit XML

适用场景

  1. 01验证脚本更改是否通过测试
  2. 02定位失败测试及堆栈信息
  3. 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-modestringEditMode测试模式:EditMode、PlayMode
--filter-typestringall筛选类型:all、exact、regex、assembly、class
--filter-valuestring-筛选值(测试名称、模式、程序集或类名)
--unsaved-changesstringsavesave 会写入未保存的场景/Prefab Stage 更改;fail 在仍有未保存更改时停止;discard 会重新加载磁盘状态(未命名场景会失败)
--skip-compileflag-运行测试前跳过 CLI 端编译;仅在验证活动热重载补丁时使用。Unity 仍会导入上次编译后保存的脚本编辑内容。
--timeout-secondsinteger600等待 RunFinished 后取消等待的最长秒数(最大值为 1500)。长时间运行的测试套件可调高此值;超时后,Test Runner 可能仍在运行,直到停止处理生效
--respect-enter-play-mode-settingsflag-仅限 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 或 ExecutionFailed
  • HasFailures(布尔值):是否有任何已发现的测试失败
  • 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>

评论

支持 Markdown