You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:23:34