XCUITest模拟器克隆网络异常:缓存问题与网络访问疑问
XCTest并行UI测试中的网络缓存与模拟器权限问题
我正在使用XCTest框架为iOS应用编写UI测试,测试流程为:启动应用、点击按钮、填写登录信息并点击登录,应用会向运行在192.168.1.193:8080的服务器发送请求,获取用户数据用于后续测试。
在可见模拟器中串行运行测试时一切正常,但在后台使用模拟器克隆并行运行时,应用从未访问目标服务器,却弹出UIAlertController显示一条仅存在于服务器代码中的旧版本错误信息——即使修改服务器错误字符串或完全关闭服务器,弹窗仍显示旧错误信息。
测试脚本已在运行前通过xcrun simctl shutdown all和xcrun simctl erase all清空所有模拟器,且应用代码中已通过NSURLRequestReloadIgnoringLocalCacheData显式关闭缓存,网络请求代码如下:
NSURL *url = [NSURL URLWithString:urlString]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:360.0]; NSURLSessionConfiguration *defaultsessionconfig = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *urlsession = [NSURLSession sessionWithConfiguration:defaultsessionconfig delegate:taskdelegate delegateQueue:nil]; NSURLSessionDataTask *datatask = [urlsession dataTaskWithRequest:request completionHandler:^(NSData *_Nullable data, NSURLResponse *_Nullable response, NSError *_Nullable error) { // 调用success()或failure()闭包 }]; [datatask resume];
1. 为何会出现网络响应缓存现象?
- 虽然给请求设置了
NSURLRequestReloadIgnoringLocalCacheData,但NSURLSessionConfiguration的默认配置仍会使用全局URLCache,session级别的缓存策略未被显式覆盖,导致缓存残留。 - 并行测试的模拟器克隆环境中,Xcode可能复用了部分系统级缓存资源,或是HTTP协议层面的缓存头未被正确处理,导致旧响应被复用。
- 应用的
failure()闭包可能存在逻辑漏洞:当克隆模拟器无法连接服务器时,直接读取了本地存储的旧错误信息,而非实时处理网络错误。
2. 如何阻止该缓存行为?
- 修改
NSURLSessionConfiguration,完全禁用session级缓存:NSURLSessionConfiguration *defaultsessionconfig = [NSURLSessionConfiguration defaultSessionConfiguration]; defaultsessionconfig.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData; defaultsessionconfig.urlCache = nil; // 彻底关闭session缓存 - 在请求头中添加强制不缓存的字段,覆盖HTTP协议层面的缓存:
[request setValue:@"no-cache, no-store" forHTTPHeaderField:@"Cache-Control"]; [request setValue:@"no-cache" forHTTPHeaderField:@"Pragma"]; - 测试脚本中补充手动清除模拟器系统缓存的命令:
xcrun simctl spawn <device_id> rm -rf /Library/Caches - 检查
failure()闭包逻辑,确保不会从本地存储读取旧错误信息,仅处理实时的网络请求结果。
3. 需做哪些操作确保模拟器克隆与普通模拟器拥有相同网络访问权限?
- 确认克隆模拟器的网络模式为桥接:使用
xcrun simctl list devices查看设备状态,启动时显式指定网络模式:xcrun simctl boot <device_id> --netmode bridge - 关闭Xcode并行测试的网络隔离:在Scheme设置的「Test」选项卡中,取消勾选「Enable Network Isolation for Parallel Testing」(若存在)。
- 检查系统防火墙设置,允许模拟器相关进程(如
SimulatorTrampoline)访问本地服务器192.168.1.193:8080。 - 确保克隆模拟器的系统版本、配置与正常运行的模拟器完全一致,避免因系统差异导致的网络权限问题。
内容的提问来源于stack exchange,提问作者Kenny Wyland
相关产品推荐
相关产品推荐

