关于测试时遇到的一些问题
签名与不签名的问题
自动化测试的问题
有关XCUITest的一些补充(一)
今天在编写项目截图的时候,遇到了好几个XCUITest的问题。解决之后,感觉这些问题应该算是蛮经典的,于是把它们记录下来,方便以后查阅。
最先遇到的是测试无法运行成功,提示有两个,一个是“Undefined symbols”,一个是“Linker command failed with exit code 1 (use -v to see invocation)”。
经过查看详细日志,发现是SPM(Swift Package Manager)的问题。当为应用目标时,SPM引入的第三方框架,如果该框架对于其它框架有依赖,那么SPM会自动导入该依赖的框架。但是在XCUITest的时候,或许是没有用到SPM,被依赖的框架并不会自动引用。因此,需要手动添加第三方框架之外,还需要手动再添加第三方框架依赖的框架。具体要添加多少,就要看错误日志提示的是哪个框架了。
解决了这个问题之后,测试终于可以通过。但是同时,又发生了一个新的问题。就是虽然Xcode显示Test成功了。但是却一直显示Testing,长久也没有测试完成。
经过查询,发现这也是Xcode一个bug。当使用XCUITest测试时,需要将并行测试的选项关闭,否则就会一直显示Testing。
还有一个注意事项,就是XCUITest测试时,必须将项目的目标设定为XCUITest这个目标,这个目标默认是隐藏的,必须手动添加出来。如果把应用作为目标,然后运行XCUITest,还是可能会出现一直显示Testing的问题。
最后,如果你需要检测文本,需要注意文本语言问题,将翻译的strings文件添加到XCUITest的目标,并不能自动调用并使用NSLocalizedString宏,因此,需要用或进行检测,像这样:
XCTAssertTrue(app.staticTexts["使用云端服务"].exists || app.staticTexts["Try Cloud"].exists)
参考
iCloud Key-Value同步nil值后,再次同步会出错问题的绕过
这个问题我已经向苹果报告了。FB13171112
具体的内容可以看我的这篇推文。
临时的解决办法,就是不直接使用nil,而是把它封装起来。
// 之前
var foo:Int? = nil
// 现在
struct Bar:Codable {
var foo:Int? = nil
}
这样就能避免直接使用nil了。缺点就是需要将它转换成Data再同步,多了几步。不过如果使用第三方框架的话,步骤其实不用多,第三方框架已经写好了。