IOS自动化之KIF框架实践
KIF的全称是Keep it functional。它是一个建立在XCTest的UI测试框架,通过accessibility来定位具体的控件,再利用私有的API来操作UI。由于是建立在XCTest上的,所以你可以完美的借助XCode的测试相关工具。
一, 测试环境搭建
KIF框架依赖工程源码进行测试的,所以要能从开发处拿到被测试工程的源码,然后在搭建相应的测试环境。
1,命令行安装pod:
sudo gem install cocoapods
2,修改或创建工程的pod文件 :Podfile,如下所示:
# platform :ios, '9.0'
target 'TenMinDemo' do
# Uncomment the next line if you're using Swift or would like to use dynamic frameworks
# use_frameworks!
# Pods for CYXText
pod 'AFNetworking', '~> 3.0'
pod "SDWebImage"
pod "MJExtension"
pod "MJRefresh"
pod 'SVProgressHUD'
pod 'ReactiveObjC'
end
target 'TenMinDemoTests' do
use_frameworks!
pod 'KIF', '~> 3.5.1'
end
其中如下一段内容为新添加的:
target 'TenMinDemoTests' do //测试工程名
use_frameworks!
pod 'KIF', '~> 3.5.1'
end
3,执行安装命令:
pod install
安装相应的内容。
4,在现有工程中添加Target实现
选择File→New→Target…菜单项, 从中选择iOS→Other中的Cocoa Touch Unit Testing Bundle模板.如下图所示:
单击下一步,进行相应的设置页:
5,设置测试工程相关项:
(1) Product Name:KIF测试工程名,可以自由命名,最好是测试工程名+”Tests”。
(2) Organization Name, Organization identifier, Bundle identifier,根据需要自行全名即可。
(3) Language:编码语言,有Objective-C和Swift,默认选择OC.
(4) Project和Target to be Tested:为对应的要测试的工程名,一定要保证是正确的。
(5) 单击“Finish”创建完成。
(6) 工程创建完成,如下所示:
- 生成TenMinDemoTests工程,同时生成TenMinDemoTests.m文件和info.plist文件。
- 在Products文件夹中生成“TenMinDemoTests.xctest”文件。
- TenMinDemoTests.m文件内容如下:
// TenMinDemoTestsB.m
// TenMinDemoTestsB
//
// Created by GrowingIO on 2018/5/30.
// Copyright © 2018年 SXF. All rights reserved.
//
#import <XCTest/XCTest.h>
@interface TenMinDemoTests : XCTestCase
@end
@implementation TenMinDemoTests
- (void)setUp {
[super setUp];
// Put setup code here. This method is called before the invocation of each test method in the class.
}
- (void)tearDown {
// Put teardown code here. This method is called after the invocation of each test method in the class.
[super tearDown];
}
- (void)testExample {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct results.
}
- (void)testPerformanceExample {
// This is an example of a performance test case.
[self measureBlock:^{
// Put the code you want to measure the time of here.
}];
}
@end
各个函数相互作用及执行顺序如下图所示:
二, 测试用例编写
KIF和其他测试框架类似,通过OC编写代码实现我们的测试步骤,进而去检测操作完成的结果。下面我们以一个简单而完整的用例来说明一下测试用例如何编写:
1,手工用例步骤介绍:
(1)我从网上下载的一个Demo,工程名为TenMinDemo,选择其中的一个功能,登录:打开app,选择“博文”项
(2)输入用户名:dingdone和密码:123456,单击“登录”按钮,登录成功。
(3)检测是否进入到了列表页。
2,代码测试用例如下:
//LoginTests.m
//
// LoginTest.m
// TenMinDemoTests
//
// Created by GrowingIO on 2018/5/31.
// Copyright © 2018年 SXF. All rights reserved.
//#import "LoginTest.h"
@implementation LoginTest
- (void)setUp {
// Put setup code here. This method is called before the invocation of each test method in the class.
}
- (void)tearDown {
// Put teardown code here. This method is called after the invocation of each test method in the class.
}
- (void)testLogin {
//单击“博文”
[tester tapViewWithAccessibilityLabel:@"博文"];
//输出用户名和密码
[tester clearTextFromViewWithAccessibilityLabel:@"usename"];
[tester enterText:@"dingdone\n" intoViewWithAccessibilityLabel:@"usename"];
[tester clearTextFromViewWithAccessibilityLabel:@"password"];
[tester enterText:@"123456\n" intoViewWithAccessibilityLabel:@"password"];
//等待1秒
[tester waitForTimeInterval:1];
//单击登录按钮
[tester tapViewWithAccessibilityLabel:@"login"];
[tester waitForTimeInterval:5];
//获取列表页view
UITableView *utable=[tester waitForViewWithAccessibilityLabel:@"tableView"];
//获取tableview第二行
NSIndexPath *index = [NSIndexPath indexPathForRow:1 inSection:0];
UITableViewCell *utvc=[tester waitForCellAtIndexPath:index inTableView:utable];
if (@available(iOS 11.0, *)) {
//判断第二行的内容是否符合预期
//NSLog(@"Cell Content:%@",utvc.textLabel.text);
XCTAssertEqualObjects(utvc.textLabel.text, @"第2行");
} else {
// Fallback on earlier versions
}
}
@end
上面的代码添加了详细的注释,内容也比较简单,就不逐步介绍了。注意:KIF是基于XCText的,基本的判断语句都是XCTest的。
3,KIF API简介
KIF API相关的介绍挺多,只是不太全面,下面我介绍几个不错的网站:
(1)KIF API的中文翻译https://www.jianshu.com/p/87bbbb798926,
感觉好像不太全;
(2)官网上的源码及其介绍:https://github.com/kif-framework/KIF.
(3) KIFUITestActor Doc:http://cocoadocs.org/docsets/KIF/3.2.1/Classes/KIFUITestActor.html,这个网站内容比较全面,只是英文的,不翻墙能不能打开还不清楚。
很多新的技术都有一个特点,就是相关的文档非常少,这也没有办法;可是换个想法来看,如果相关技术文档到处都是,这项技术学了也没有什么优势了。
三,测试用例集及命令行执行
目前KIF一个Kiftestcase类就相当于一个测试用例集,我们可以简单地利用类的方式来组织测试用例,类中的每个以test****开头的函数均是一个测试用例。当然基于KIF开源的特性,我们可以开发其他的用例集管理方式或是工具,如下图所示:
(图片来源于:https://tech.meituan.com/iOS-UITest-KIF.html)
任何自动化测试最终的归宿都是CI(持续化集成),当然我们的KIF自动化也需要做持续化集成。而在做持续化集成前,需要调研如何通过命令行来执行测试用例?
(1)将项目设置成shared
从product->Scheme->manage schemes,查看项目是否是shared,如果不是,则选中后面的复选框将其共享。
(2)借助于xctool来执行测试用例
Xctool源码地址:https://github.com/facebook/xctool,可以去查看一下如何安装和使用:https://blog.csdn.net/jeikerxiao/article/details/51669451
而运行我们的示例代码应该是:
xctool -workspace XXX.xcworkspace –schem XXYYY run-tests XXXtests:测试用例集 -sdk "iphonesimulator11.3"
同时可以通过-only来指定运行某个用例
(a)运行单个测试用例
xctool -workspace TenMinDemo.xcworkspace -scheme TenMinDemo run-tests -only TenMinDemoTests:LoginTest/testlogin -sdk "iphonesimulator11.3"
(b)运行一个测试用例集
xctool -workspace TenMinDemo.xcworkspace -scheme TenMinDemo run-tests TenMinDemoTests:LoginTest -sdk "iphonesimulator11.3"
四,生成测试报告
xctool的reporter选项可以生成不同形式的测试报告:
- pretty: (默认) 一个文字化的输出器,使用 ANSI 颜色和 unicode 符号来进行美化输出。
- plain: 类似 pretty, 不过没有颜色和 Unicode。
- phabricator: 把构建/测试的结果输出为 JSON 数组,它可以被 Phabricator 的代码评审工具读取。
- junit: 把测试结果输出成和 JUnit/xUnit 兼容的 XML 文件。
- json-stream: 一个由构建/测试事件组成的 JSON 字典流,每行一个(示例输出)。
- json-compilation-database: 输出构建事件的 JSON Compilation Database ,它可以用于基于 Clang Tooling 的工具,例如 OCLint.
而我们通常使用xml格式测试报告,一则做持续化集成的时候,Jenkins可以直接这个报告;二则我们可以借助于ant将期转换成 html的报告:
1,生成junit报告:
xctool -workspace TenMinDemo.xcworkspace -scheme TenMinDemo run-tests TenMinDemoTests:LoginTest -sdk "iphonesimulator11.3" -reporter junit:/Users/growingio/Documents/report.xml
2,转换测试报告xml成html
由于xctool输出的报告中含有中间输出信息,所以不能直接转换,需要先处理一下,去掉无用的信息。或是先将报告转化成json格式,然后再提取出合适的信息,生成xml文件。这个方法需要另外写脚本转换一下。
生成报告的步骤如下:
(1)安装ant
(2)优化xctool生成的xml,把中间输出信息去掉
(3)创建builld.xml文件
<project name="TestNG_WORKSPACE" default="junit-report" basedir=".">
<!-- Sets the property variables to point to respective directories -->
<property name="junit-xml-dir" value="${basedir}/junitreports"/> //junit报告文件的路径
<property name="report-dir" value="${basedir}/html-report" /> //生成html生成报告的位置
<!-- Ant target to generate html report -->
<target name="junit-report">
<!-- Delete and recreate the html report directories -->
<delete dir="${report-dir}" failοnerrοr="false"/>
<mkdir dir="${report-dir}" />
<mkdir dir="${report-dir}/Junit" />
<!-- Ant task to generate the html report.
todir - Directory to generate the output reports
fileset - Directory to look for the junit xml reports.
report - defines the type of format to be generated.
Here we are using "noframes" which generates a single html report.
-->
<junitreport todir="${report-dir}/Junit">
<fileset dir="${junit-xml-dir}">
<include name="**/*.xml" />
</fileset>
<report format="noframes" todir="${report-dir}/Junit" /> //format:"frames",还左边框的报告,“noframes”,无边框的报告
</junitreport>
</target>
</project>
(4)将juntreport.xml的路径设置好,同时将build.xml给保存到相应的位置,然后在build.xml的路径下执行命令:ant,则会生成如下格式的html报告
五,持续化集成
持续化集成的核心思想就是借助于Jenkins的任务调度功能,将自动化测试用例放到Git/Svn上,然后配置相应的代码库地址,执行脚本命令等。根据不同的触发条件,完成自动运行的机制。其中还要根据需要进行相关的配置等等,网上相应的步骤比较多,在此就不详细介绍了,可以参考一下:“基于 KIF 的 iOS UI 自动化测试和持续集成(https://tech.meituan.com/iOS-UITest-KIF.html)”
在做持续化集成的时候,一定要考虑到因为环境原因,网络原因等造成的非正常失败的情况,故要加上用例失败重跑机制。
Commands如下所示:
xctool -workspace TenMinDemo.xcworkspace -scheme TenMinDemo run-tests TenMinDemoTests:LoginTest -sdk "iphonesimulator11.3" -reporter junit:/Users/growingio/Documents/report.xml
array=( TimerTests HistoryTests )
for data in ${array[@]}
do
xctool -workspace TenMinDemo.xcworkspace -scheme TenMinDemo run-tests -only TenMinDemoTests:${data} -sdk "iphonesimulator11.3" -reporter junit:/Users/growingio/Documents/report.xml
done
六,总结
最近在公司以KIF框架做了一些IOS自动化测试相关的东西,中间磕磕碰碰的遇到了不少问题,也查了资料进行了解答。现在就整个项目的实现过程给总结一下,以方便知识的总结和记录,也有利于后来者进行快速入门。
由于经验有限,难免会存在不足之处,后续会不断更新和完善。
IOS自动化之KIF框架实践相关推荐
- 移动周刊第 182 期:谈 Android 开发技巧、 iOS 系统框架实践
写在前面 移动周刊第 182 期如约而至.如果你有好的文章以及优化建议,请发送邮件至mobilehub@csdn.net,在技术探索的道路上我们共同进步. YouTube 推出 VR 视频和 360 ...
- appuim框架二次封装-UI自动化-自整理亲自实践
IDE下载(eclipse/IDEA等) IDEA的下载地址 (IDEA下载社区版-Community就够用)(用例是用java来编写) 备注:建议用IEDA,在编写用例的时候,效率会高很多 Mave ...
- iOS开发库和框架大全
音频 AudioBus:下一代 App 到 App 的实时音频路由.官网 AudioKit:一个强大的音频合成,处理和分析的工具集.官网 EZAudio:一个基于 Core Audio 的 iOS/O ...
- lisp 线性标注自动避让_自动化数据增强:实践、理论和新方向
选自Stanford AI Lab Blog 作者:Sharon Y. Li 机器之心编译 参与:Panda 对当今需要大量数据的机器学习模型而言,数据增强是一种具有显著价值的技术--既可用于缓解数据 ...
- xcode 选择configuraftions 打包_分利宝IOS自动化打包
前言 在iOS开发中,我们常用的打包上传方式就是用Xcode的archive方式打包.到了测试阶段,需要频繁的打包提交到测试平台,整个流程包括:编译-打包-上传,整个过程需要我们去坚守每一步操作,提交 ...
- 开启iOS自动化测试之门
开启iOS appium自动化测试之门 Appium介绍 Appium是一个开源.跨平台的测试框架,可以用来测试原生及混合的移动端应用.Appium支持iOS.Android及FirefoxOS平台. ...
- 自动化数据增强:实践、理论和新方向
本文转载自机器之心. 选自Stanford AI Lab Blog 作者:Sharon Y. Li 机器之心编译 参与:Panda 对当今需要大量数据的机器学习模型而言,数据增强是一种具有显著价值的技 ...
- 【IOS自动化解放双手系列一】unity3D导出xcode 工程并配置各种权限
打包是程序员必经之路.如何实现自动化是一个程序员的基本素质.(都是因为我懒,哈哈哈). 使用环境 :unity3D 2017.4.7 Mac Pro 打包分一下几个部分 : 1.unity3D导出xc ...
- ios图像和图形最佳实践(三)
没有前面进度的同学还是从(二)开始,否则会感觉比较突兀 ios图像和图形最佳实践(二) - 对于我们的app所附带的图片 苹果强烈建议我们使用图像素材来存储 这其中有很多原因 图像素材针对基于名称和基 ...
最新文章
- svm rbf人脸识别 yale_实操课——机器学习之人脸识别
- 固态器件理论(4)电子和“空穴”
- [YTU]_2640( 编程题:运算符重载---矩阵求和)
- Activity调用栈的分析
- 技术系列课|从0到1 构建实时音视频引擎
- HDU - 5667 Sequence(矩阵快速幂+费马小定理降幂)
- linux cgi命令,Linux之cgi实现系统主机监控
- 我可以在CSS中使用onclick效果吗?
- 转:NAT traversal 的概念
- 使用Python构建的七大应用程序
- 从C#程序中调用非受管DLLs
- 升级Spring Boot内嵌Tomcat版本
- atmega328 48手动解锁 擦除
- 歌曲从DTS转换为MP3的方法
- 呼叫中心服务器怎么设置,呼叫中心服务器类型有哪几种?
- Mac 下 Netty 4.1 代码编译与运行
- iOS 上的 WebSocket 框架 Starscream
- OLTP和OLAP有何区别?
- 文件名字超出计算机无法删除,win7文件名太长无法移动和删除的解决方法
- 群响刘思毅 | 创始人的流量焦虑
热门文章
- 动态规划——独立任务最优调度问题
- arm linux使用 usbmon 抓取usb总线数据包
- 欧姆龙cp1E plc和台达变频器modbus rtu通讯 变頻器可实现正反转,停止,频率的设定、加减速
- scrapy pipelines(MySQL )
- 浅克隆和深克隆的区别与实现
- 【论文精读】Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation(R-CNN)
- 分子模拟可视化_fanviz数据可视化狂热分子
- 软甲开发的瀑布模型,快速原型型,螺旋型,敏捷开发
- Springboot项目启动后自动弹出页面
- 电脑开机黑屏一串英文_电脑开机显示器黑屏都是英文字母怎么办?