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框架实践相关推荐

  1. 移动周刊第 182 期:谈 Android 开发技巧、 iOS 系统框架实践

    写在前面 移动周刊第 182 期如约而至.如果你有好的文章以及优化建议,请发送邮件至mobilehub@csdn.net,在技术探索的道路上我们共同进步. YouTube 推出 VR 视频和 360 ...

  2. appuim框架二次封装-UI自动化-自整理亲自实践

    IDE下载(eclipse/IDEA等) IDEA的下载地址 (IDEA下载社区版-Community就够用)(用例是用java来编写) 备注:建议用IEDA,在编写用例的时候,效率会高很多 Mave ...

  3. iOS开发库和框架大全

    音频 AudioBus:下一代 App 到 App 的实时音频路由.官网 AudioKit:一个强大的音频合成,处理和分析的工具集.官网 EZAudio:一个基于 Core Audio 的 iOS/O ...

  4. lisp 线性标注自动避让_自动化数据增强:实践、理论和新方向

    选自Stanford AI Lab Blog 作者:Sharon Y. Li 机器之心编译 参与:Panda 对当今需要大量数据的机器学习模型而言,数据增强是一种具有显著价值的技术--既可用于缓解数据 ...

  5. xcode 选择configuraftions 打包_分利宝IOS自动化打包

    前言 在iOS开发中,我们常用的打包上传方式就是用Xcode的archive方式打包.到了测试阶段,需要频繁的打包提交到测试平台,整个流程包括:编译-打包-上传,整个过程需要我们去坚守每一步操作,提交 ...

  6. 开启iOS自动化测试之门

    开启iOS appium自动化测试之门 Appium介绍 Appium是一个开源.跨平台的测试框架,可以用来测试原生及混合的移动端应用.Appium支持iOS.Android及FirefoxOS平台. ...

  7. 自动化数据增强:实践、理论和新方向

    本文转载自机器之心. 选自Stanford AI Lab Blog 作者:Sharon Y. Li 机器之心编译 参与:Panda 对当今需要大量数据的机器学习模型而言,数据增强是一种具有显著价值的技 ...

  8. 【IOS自动化解放双手系列一】unity3D导出xcode 工程并配置各种权限

    打包是程序员必经之路.如何实现自动化是一个程序员的基本素质.(都是因为我懒,哈哈哈). 使用环境 :unity3D 2017.4.7 Mac Pro 打包分一下几个部分 : 1.unity3D导出xc ...

  9. ios图像和图形最佳实践(三)

    没有前面进度的同学还是从(二)开始,否则会感觉比较突兀 ios图像和图形最佳实践(二) - 对于我们的app所附带的图片 苹果强烈建议我们使用图像素材来存储 这其中有很多原因 图像素材针对基于名称和基 ...

最新文章

  1. svm rbf人脸识别 yale_实操课——机器学习之人脸识别
  2. 固态器件理论(4)电子和“空穴”
  3. [YTU]_2640( 编程题:运算符重载---矩阵求和)
  4. Activity调用栈的分析
  5. 技术系列课|从0到1 构建实时音视频引擎
  6. HDU - 5667 Sequence(矩阵快速幂+费马小定理降幂)
  7. linux cgi命令,Linux之cgi实现系统主机监控
  8. 我可以在CSS中使用onclick效果吗?
  9. 转:NAT traversal 的概念
  10. 使用Python构建的七大应用程序
  11. 从C#程序中调用非受管DLLs
  12. 升级Spring Boot内嵌Tomcat版本
  13. atmega328 48手动解锁 擦除
  14. 歌曲从DTS转换为MP3的方法
  15. 呼叫中心服务器怎么设置,呼叫中心服务器类型有哪几种?
  16. Mac 下 Netty 4.1 代码编译与运行
  17. iOS 上的 WebSocket 框架 Starscream
  18. OLTP和OLAP有何区别?
  19. 文件名字超出计算机无法删除,win7文件名太长无法移动和删除的解决方法
  20. 群响刘思毅 | 创始人的流量焦虑

热门文章

  1. 动态规划——独立任务最优调度问题
  2. arm linux使用 usbmon 抓取usb总线数据包
  3. 欧姆龙cp1E plc和台达变频器modbus rtu通讯 变頻器可实现正反转,停止,频率的设定、加减速
  4. scrapy pipelines(MySQL )
  5. 浅克隆和深克隆的区别与实现
  6. 【论文精读】Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation(R-CNN)
  7. 分子模拟可视化_fanviz数据可视化狂热分子
  8. 软甲开发的瀑布模型,快速原型型,螺旋型,敏捷开发
  9. Springboot项目启动后自动弹出页面
  10. 电脑开机黑屏一串英文_电脑开机显示器黑屏都是英文字母怎么办?