使用Xamarin.UITest运行测试时iPhone模拟器启动耗时数分钟如何解决?
Xamarin.UITest iOS模拟器卡顿/重启/无头问题解决方案
核心问题根因
该问题是Xamarin.UITest 3.2.0与Xcode 12.5+、Big Sur系统的兼容性问题导致的:UITest默认每次运行前会强制校验模拟器状态,触发不必要的重启、重置逻辑,正常调试不走UITest的启动逻辑,因此不会触发异常。
可落地修复步骤
调整iOS启动配置,禁用强制模拟器重启逻辑
你注释的UITEST_FORCE_IOS_SIM_RESTART环境变量应该设置为0而非1,同时可明确指定模拟器UDID、应用路径,避免UITest反复扫描匹配模拟器,减少启动耗时:
public static IApp StartApp(Platform platform) { if (platform == Platform.Android) { return ConfigureApp.Android.StartApp(); } // 禁用UITest强制重启模拟器的逻辑 Environment.SetEnvironmentVariable("UITEST_FORCE_IOS_SIM_RESTART", "0"); // 禁用无头运行模式,显示模拟器窗口 Environment.SetEnvironmentVariable("UITEST_DISABLE_HEADLESS_RUN", "1"); // 可选配置:提前指定目标模拟器UDID,避免扫描匹配耗时 // 模拟器UDID可在Xcode->Window->Devices and Simulators中查看 // .DeviceIdentifier("你的目标模拟器UDID") // 可选配置:指定.app路径,避免UITest查找应用耗时 // .AppBundle("path/to/your/iOS项目/bin/iPhoneSimulator/Release/你的应用名.app") IApp app = ConfigureApp.iOS .StartApp(Xamarin.UITest.Configuration.AppDataMode.DoNotClear); return app; }
添加DeviceIdentifier和AppBundle参数后,平均启动耗时可压缩到30秒以内,不会再触发反复重启。
调整测试初始化逻辑,避免重复启动应用
你当前使用的[SetUp]注解会在每一条测试用例执行前都重启一次应用,是频繁触发模拟器重启的核心原因,改成[OneTimeSetUp]在整个测试类运行前仅启动一次应用即可:
IApp app; Platform platform; public Tests(Platform platform) { this.platform = platform; } // 替换SetUp为OneTimeSetUp,整个测试类仅启动一次应用 [OneTimeSetUp] public void BeforeAllTests() { app = AppInitializer.StartApp(platform); } // 可选:如果需要每条用例回到初始状态,仅做页面跳转不重启应用 [SetUp] public void BeforeEachTest() { // 例如调用原生端注册的重置方法回到登录页,无需重启应用 // app.Invoke("resetAppToLoginState", null); }
额外优化(针对高频测试场景)
提前手动启动目标模拟器,等待完全加载到主界面后再执行UITest,UITest会直接复用已启动的模拟器,不会再触发重启、卡顿逻辑,启动速度最快。
验证步骤
修改完成后按以下顺序操作验证:
- 清理所有后台运行的模拟器进程,重启Visual Studio
- 手动启动目标iPhone模拟器,等待加载到系统主界面
- 执行测试用例,观察模拟器不会重启,应用直接拉起,简单登录流程测试耗时不会超过1分钟
内容的提问来源于stack exchange,提问作者HtpaaPeterH
相关产品推荐
相关产品推荐

