关于测试时遇到的一些问题
签名与不签名的问题
自动化测试的问题
有关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)
参考
iOS项目CocoaPods的安装与使用
安装
网上看了好几篇文章,综合起来才成功,这个是在macOS Sierra 10.12.4 (16E195)下正确安装CocoaPods的步骤:
1. 替换源为镜像
gem sources -l
查看当前的gem源的地址,由于墙的缘故,如果源是https://rubygems.org/
,我们需要将它删除。
gem sources --remove https://rubygems.org/
然后替换为ruby china的镜像。
gem sources --add https://gems.ruby-china.org/
确认源替换是否成功
gem sources -l
2. 升级gem
系统自带的gem版本较低,使用时会出现莫名其妙的问题,因此要把它升级到最新版
sudo gem update --system
如果上面代码提示没有权限,改成
sudo gem update -n /usr/local/bin --system
3. 安装cocoapods
在macOS 10.11和10.12中安装时,安装到/usb/bin会提示错误,因此需要安装到/usb/local/bin里
sudo gem install -n /usr/local/bin cocoapods
4. 替换源
默认的源更新起来很慢,需要替换才能变快。如果你想使用默认的,可以跳过这一步。
查看当前的源:
pod repo
删除master:
pod repo remove master
添加清华的源:
git clone https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git ~/.cocoapods/repos/master
更新源:
pod repo update
5. 更新pod
如果你做过上一步,可以跳过这一步。
pod setup
这步时间较长,需要耐心等待。
使用
如果你使用了第4步的替换源,那么需要在你的每个Podfile的最前面,添加一行。
source 'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git'
- 新建一个iOS的项目。
- 在终端,进入到该项目的文件夹。
- 执行
pod init
- 打开自动生成的
Podfile
文件 - 在其中添加你要使用的框架的名称
- 保存好
Podfile
文件 - 执行
pod install
- 在Xcode中,关闭你的项目
- 在文件夹,找到pod生成的
.xcworkspace
文件,打开它。 - 像平常一样使用框架就可以了。
比如我新建的项目叫PodTest
,添加了RealmSwift
,最终的Podfile
如下:
这其中大部分的内容都是pod自动生成的,我需要修改/添加的只有第三行,iOS的版本。第四行,去除警告。以及pod 'RealmSwift'
的那一行。
最后的那段,是RealmSwift
网站要求的。你需要什么框架,就到那个框架的官网,按照提示复制粘贴上去就可以了。
最后记得,每次修改完Podfile
之后,都要记得运行一遍pod install
。
# Uncomment the next line to define a global platform for your project
platform :ios, '10.3'
inhibit_all_warnings!
target 'PodTest' do
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks
use_frameworks!
pod 'RealmSwift'
# Pods for PodTest
target 'PodTestTests' do
inherit! :search_paths
# Pods for testing
end
target 'PodTestUITests' do
inherit! :search_paths
# Pods for testing
end
end
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '3.1'
end
end
end
小技巧
- 第四行的
inhibit_all_warnings!
,可以使得Xcode不对框架中不当的帮助说明生成警告。因为框架是第三方的,我们即便看到了,也不会修改它。 - 有时会由于网络问题导致下载的框架不全,此时可以使用这个命令重新下载。
pod deintegrate && pod install