自动化测试是什么?
自动化测试是指在预设条件下运行系统或者应用程序,评估运行结果,预先条件包括正常条件和异常条件。---- 摘自《百度百科》
iOS自动化测试的目的?
在进行版本迭代的过程,开发同学和测试同学都会app进行测试,不管对应的业务在该版本中有没有发生变化,只要有新的bug 产生,那么在以后的发版中又会重新对该bug 进行测试,造成了非常多的人力资源浪费,而且还不高效。
iOS 自动化测试的框架
如果您是iOS 开发,相信您一定会关注每年的WWDC 大会,苹果自带的XCTest 是在2015 年 WWDC 上提出来的,而且官方还给出了一个Demo。如果您感兴趣,戳这里https://developer.apple.com/videos/play/wwdc2015/406/
除此之外,也有一些其他的自动化测试框架。
- Frank
- KIF
- Calabash
- Appium
至于这些框架的简介、优缺点等等,网上的资源很多,这里就一笔带过,用的比较多的是 Appium。笔者嫌弃它配置麻烦,就没有研究,今天我们主要说说 iOS 自带的XCTest。
添加执行文件
在我们创建一个项目的时候,如果需要加入UI Test,那么就要勾选 Inclide UI Tests 还有一个是 Inclide Unit Tests 这个是单元测试(今天暂且不说)。
如果是现有项目,那么新建一个 Target 就好了。
相关 API
官方API:https://developer.apple.com/documentation/xctest/xcuielementquery?preferredLanguage=occ 只要花上半天或者一天的时间就可以将这些API 看完。下面我们说一下常用的一些API。
1、- childrenMatchingType:
查询所有的直接子代元素, 返回值是一个新的查询
2、- descendantsMatchingType:
查询所有的后代子元素(包括子代元素),返回值是一个新的查询
3、matchingIdentifier:
根据标识查找后代元素,返回值是一个新的查询。使用该方法时,需要在xib 或者代码中给一个UI 的accessibilityIdentifier
赋值,否则查询不到。
4、element
返回一个查询的元素, 返回值是一个元素。
5、- elementBoundByIndex:
根据下标返回查询结果中匹配的元素。
6、exists
: 判断元素是否存在。
7、hittable
判断该元素是否能够响应事件。
8、Typing Text
文本输入(一般是UITextField 或者 UITextView)
9、tap
,doubleTap
单击,双击手势。
10、swipeLeft
,swipeRight
,swipeUp
, swipeDown
,上下左右滑动等等。
代码编写
刚开始的时候,我们进行代码录制。在我们的 UITests的.m 文件中,系统会自动创建一个testExample
方法。当我们点击录制按钮的时候, Xcode 会根据用户的操作在testExample
生产相对应的代码。
通常情况下,自动生成的代码是会报错的,因为我们的按钮的title,cell 上的内容等等都是中文。有两种方式解决这个问题。
- 将对应的编码改成我们对应的汉字
- 将编码中的
\U
改成\u
另外,系统生产的代码通常情况下是很乱的,需要我们进行过滤或者验证一遍,有时候甚至会生产一些错误的代码,这个时候就需要我们进行调试和修改。这里给出一个Example。
- (void)testLogin {
for (int i = 0; i < self.names.count; i++) {
XCUIElement *textFieldUser = self.app.textFields[@"用户名"];
[textFieldUser tap];
[self.app.buttons[@"Clear text"] tap];
[textFieldUser typeText:self.names[i]];
sleep(1);
XCUIElement *textFieldPwd = self.app.secureTextFields[@"密码"];
[textFieldPwd tap];
[self.app.buttons[@"Clear text"] tap];
[textFieldPwd typeText:self.pwds[i]];
XCUIElement *button = self.app.buttons[@"登录"];
[button tap];
sleep(2);
if (!button.exists) {
// 登录成功
}
}
}
我们简单说明一下上面的代码, 我声明了两个数组,一个用来存储用户名(names)一个用来存贮密码(pwds),循环遍历,依次输入用户名和密码,如果错误则重新输入直到正确为止。
iOS 自动化测试遇到的问题
- iOS 轮播图的和
TableView
或者CollectionView
混合使用的时候,无法拿到轮播图的响应时间,可以使其左右滑动,但是无法响应点击,如果有哪位同学知道,烦请告知我,不甚感激。 - 如果项目中用到了
UIDatePicker
或者UIPickerView
时,用adjustToPickerWheelValue
方法进行赋值。 - 如果想要依次点击每行cell, 可以通过
cells.count
获取所有的cell数量。