如何在Unity构建命令执行前自动运行全部单元测试?
当然有办法实现!结合Unity的构建预处理回调和内置的Unity Test Framework(UTF),你可以轻松在构建前自动触发所有单元测试,甚至能在测试失败时直接终止构建,避免发布有问题的版本。
先给你完整的实现代码,替换你原来的CustomPreProcessBuild类就行:
using UnityEditor; using UnityEditor.Build; using UnityEditor.Build.Reporting; using UnityEditor.TestTools.TestRunner.Api; using UnityEngine; class CustomPreProcessBuild : IPreprocessBuildWithReport { // 设定回调优先级,确保这个逻辑在其他构建准备工作前执行 public int callbackOrder => 1; public void OnPreprocessBuild(BuildReport report) { Debug.Log($"CustomPreProcessBuild: 开始预处理构建,目标平台 {report.summary.platform},输出路径 {report.summary.outputPath}"); // 初始化测试运行器API var testRunnerApi = ScriptableObject.CreateInstance<TestRunnerApi>(); // 配置测试过滤规则:这里选择运行所有测试(编辑模式+播放模式) var testFilter = new Filter() { testMode = TestMode.All, // 如果你只想跑特定类别的测试,可以添加过滤条件 // categoryNames = new[] { "UnitTests" } }; // 注册测试结果回调,然后执行测试 testRunnerApi.RegisterCallbacks(new TestResultCallbacks()); testRunnerApi.Execute(new ExecutionSettings(testFilter)); } // 自定义回调类,处理测试结果并控制构建流程 private class TestResultCallbacks : ITestRunnerCallbacks { public void RunStarted(ITestAdaptor testsToRun) { Debug.Log($"🔍 开始运行单元测试,共 {testsToRun.TestCount} 个用例"); } public void RunFinished(ITestResultAdaptor result) { Debug.Log($"✅ 测试完成:通过 {result.PassCount} 个,失败 {result.FailCount} 个,跳过 {result.SkipCount} 个"); // 如果有测试失败,直接终止构建 if (result.FailCount > 0) { Debug.LogError("❌ 单元测试失败,已终止构建流程!"); throw new BuildFailedException("单元测试未通过,构建终止"); } } // 以下回调方法按需实现,这里留空即可 public void TestStarted(ITestAdaptor test) {} public void TestFinished(ITestResultAdaptor result) {} public void RunFinished(Exception exception) {} } }
关键细节说明:
- 接口选择:用
IPreprocessBuildWithReport替代你原来的IPreprocessBuild,它能提供更详细的构建上下文信息,也是Unity推荐的新版构建回调接口。 - 测试运行控制:通过
TestRunnerApi调用UTF的测试能力,你可以灵活过滤测试(比如只跑编辑模式测试、只跑特定命名空间/类别的测试)。 - 构建终止逻辑:当测试失败时,抛出
BuildFailedException,Unity会自动中断构建流程,这在CI/CD自动化构建中尤其有用。 - 放置位置:这段代码必须放在项目的
Editor文件夹下(没有的话新建一个),因为它属于编辑器扩展代码,不会被打包到最终游戏中。
额外提示:
如果你的Unity版本低于2019.3,可能需要使用旧版的测试运行器API,但核心逻辑是一致的——在构建前触发测试,根据结果决定是否继续构建。
内容的提问来源于stack exchange,提问作者eagle
相关产品推荐
相关产品推荐

