如何使用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
相关产品推荐
相关产品推荐

