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

如何使用CakeBuild.net构建并运行Xamarin单元测试/UI测试?

当然可行!我来帮你搞定用Cake构建并运行Xamarin单元测试和UI测试的方案,结合你现有的脚本一步步拆解:

一、Xamarin单元测试(支持.NET Standard/平台专属测试项目)

如果你的Xamarin单元测试是基于xUnit的(不管是共享的.NET Standard测试项目,还是Android/iOS专属的测试项目),可以直接在现有脚本基础上扩展任务:

首先,你已经引用了xunit.runner.console,满足基础需求,新增一个运行单元测试的任务即可:

Task("Run-Xamarin-Unit-Tests")
    .IsDependentOn("Build") // 依赖你现有的构建任务,确保测试项目已编译
    .Does(() => {
        // 筛选出测试项目的输出DLL,排除obj目录和非构建输出的文件
        var testDlls = GetFiles("./**/*Tests*.dll")
            .Where(dll => !dll.FullPath.Contains("obj"))
            .Where(dll => dll.FullPath.EndsWith("bin/Debug/netstandard2.0") || dll.FullPath.EndsWith("bin/Release/netstandard2.0"));

        foreach (var dll in testDlls)
        {
            // 用xUnit2运行测试,生成XML报告(和你引用的XunitXmlResultParser兼容)
            XUnit2(dll, new XUnit2Settings
            {
                OutputDirectory = "./TestResults/Unit",
                ReportName = $"UnitTest-Report-{dll.GetFilenameWithoutExtension()}",
                XmlReport = true,
                NoAppDomain = true // 针对Xamarin项目可能需要禁用AppDomain,避免加载问题
            });
        }
    });

如果是Android/iOS专属的单元测试项目(比如继承自Android.App.Instrumentation的测试),可以用Cake.Xamarin提供的RunAndroidTests方法,示例:

Task("Run-Android-Unit-Tests")
    .IsDependentOn("Build-Android-Test")
    .Does(() => {
        RunAndroidTests(new AndroidTestSettings
        {
            ApkFile = "./MyApp.Android.Tests/bin/Release/com.myapp.tests.apk",
            DeviceId = "emulator-5554", // 模拟器或真机ID,可通过adb devices获取
            TestRunnerPackage = "mono.android.test.runner"
        });
    });
二、Xamarin UI测试(Xamarin.UITest)

Xamarin.UI测试需要先构建目标应用的APK/IPA,再启动模拟器/真机运行测试,Cake.Xamarin提供了对应的工具支持:

首先,先添加UITest的工具引用到你的脚本开头:

#tool "nuget:?package=Xamarin.UITest"

然后编写UI测试任务,以Android为例:

Task("Run-Xamarin-UI-Tests")
    .IsDependentOn("Build-Android-App") // 依赖Android应用构建任务,确保APK已生成
    .Does(() => {
        // 1. 启动指定的Android模拟器(提前创建好模拟器)
        StartAndroidEmulator("Pixel_5_API_33");

        // 2. 等待模拟器完全启动(可选,避免测试启动过早失败)
        Thread.Sleep(TimeSpan.FromMinutes(2));

        // 3. 找到UI测试项目的输出DLL
        var uiTestDll = GetFiles("./**/*UITests*.dll")
            .Where(dll => !dll.FullPath.Contains("obj"))
            .FirstOrDefault(dll => dll.FullPath.Contains("bin/Release"));

        if (uiTestDll != null)
        {
            // 4. 运行UITest,指定目标APK路径
            DotNetCoreRun(new DotNetCoreRunSettings
            {
                Project = uiTestDll.FullPath,
                Arguments = $"--app-path ./MyApp.Android/bin/Release/com.myapp.myapp.apk"
            });

            // 或者用nunit控制台运行(如果UITest用NUnit框架)
            // StartProcess("nunit3-console.exe", new ProcessSettings
            // {
            //     Arguments = $"{uiTestDll.FullPath} --result=./TestResults/UI/UiTest-Report.xml;format=nunit3"
            // });
        }

        // 5. 测试完成后关闭模拟器(可选)
        StopAndroidEmulator("Pixel_5_API_33");
    });

如果是iOS UI测试,逻辑类似,替换成StartiOSSimulator和指定IPA路径即可:

StartiOSSimulator("iPhone 14");
// 运行测试逻辑...
StopiOSSimulator("iPhone 14");
三、关键注意事项
  • 确保你的构建任务(Build)包含了所有测试项目的编译,比如通过MSBuild或DotNetBuild命令覆盖所有解决方案项目。
  • 对于UI测试,必须保证模拟器/真机的环境正常,比如Android模拟器已创建、iOS模拟器已安装对应的SDK版本。
  • 可以利用你已引用的XunitXmlResultParser来解析所有测试报告,生成统一的汇总结果。

内容的提问来源于stack exchange,提问作者Trejon House

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:50:44