自动化工具 KIF - iOS 集成测试工具试用

Anson · 2015年06月18日 · 最后由 王凯 回复于 2017年02月28日 · 2189 次阅读

KIF

KIF GitHub描述:
    KIF, which stands for Keep It Functional, is an iOS integration test framework. 
    It allows for easy automation of iOS apps by leveraging the accessibility attributes that the OS makes available for those with visual disabilities.

前段时间,在 Blog 上看到,Google Chrome 的 iOS 版也使用到了 KIF 作为测试工具。

后来自己按照网上的几篇 Blog 和官方的文档,试着整合到自己的项目中,都失败。

这两天翻看 EverNote 时发现,竟然在半年以前就把 KIF 的某些 Blog 存在了自己的 EverNote 了。
于是又折腾了下 KIF,终于搞定,可以运行测试案例了。

KIF Demo 项目

用来 Demo 的项目是这个KIF Tutorial Blog中提到的Solanum

下载 Solanum XCode Project

Solanum XCode 源码,按此下载。

处理 Solanum 源码

将 Solanum 压缩包作解压缩包,得到文件夹kif-solanum
由于 Tutorial 已经是很久以前的了,所以在我的机器上,整合好的 KIF 是跑不通了,出 Error。
所以这里,要做些处理。

打开 Solanum 源码文件夹:

  • 把文件夹KIF-2.0.0UI Tests给删了。
  • 双击 Solanum 项目空间文件solanum.xcworkspace,在 XCode 打开。
  • 在 Xcode 中,打TARGETS清单的UI Tests删了。

KIF 安装

KIF 安装支持 CocoaPods 整合,GitHub 方式整合,也支持源码手动整合。

由于之前没有 CocoaPodsd 的使用经验,此处就使用源码手动整合。

  1. 打开 Solanum 源码文件夹。
  2. 在 Solanum 源码文件夹根目录下,新建文件夹Frameworks
  3. 在新建文件夹Frameworks目录下。
  4. 在 GitHub 下载 KIF 项目源码,点此下载
  5. 将 KIF 项目源码解压缩到Frameworks目录下,可以将 KIF 源码文件夹重名为KIF

下面操作,是在 XCode 的 Salanum 项目中。

  1. 新建Target,选择 iOS-->Other-->Cocoa Touch Testing Bundle。`
  2. Product Name = "UITest",Language = Objective-C, Target to be Tested = "solanum",之后点Finish按钮,完成测试 Targe 的创建。
  3. 在上面的 KIF 项目源码文件夹中,找到 KIF 项目的 XCode 项目文件KIF.xcodeproj
  4. KIF.xcodeproj拖到 Solanum XCode 中左边导航栏的 UITest 文件目录下。按照 KIF 的 GitHub 指导,是个坑,它说是拖动到导航栏中就可以,其实是要拖到测试目标的文件夹内才行的。



下面是配置测试目标UITest

1. 选中 Target`UITest
2. 在 Build Phases-->Link Binary With Libraries 中,添加libKIF.aCoreGraphics.frameworkIOKit.framework
3. IOKit.framework这个,可能会搜索不到,可以在 Xcode 里面找到,假设你的 Xcode 的路径是/Applications/XCode.appIOKit.framework在路径/Applications/XCode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKS/iPhoneOS.sdk/System/Library/Frameworks可以找到,找到后,直接把IOKit.framework拖进去就可以了。
4. 在 Build Settings-->Search Paths-->Framework Search Paths 中,把$(DEVELOPER_DIR)/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks删掉。
5. 在 Build Settings-->Linking-->Other Linker Flags 中,添加-ObjC


而此,就完成了测试 Target 的配置了。

写个 Test Case 跑一跑

既然整合好了,那就写个 Test Case 试一试了。

  1. 在 UITest 文件夹下,新建文件。
  2. 选择 iOS-->Source-->Cocoa Touch Class
  3. Class: "UITest", Subclass of: "KIFTestCase", Language: "Objective-C"。
  4. 测试 Target 一定要选"UITest"。

打开 UITest.m,将下面的代码加进 implement 中。

 - (void)beforeAll {
     [tester tapViewWithAccessibilityLabel:@"Settings"];
     [tester setOn:YES forSwitchWithAccessibilityLabel:@"Debug Mode"];
     [tester tapViewWithAccessibilityLabel:@"Clear History"];
     [tester tapViewWithAccessibilityLabel:@"Clear"];
     [tester waitForTimeInterval:1];
}





保存后,按COMMAND + U,就开始跑 Test Case 了。
可以看到,Solanum 在 iPhone Simulator 构建完后,KIF 就开始接管了。

问题

很奇怪的是,按照 TestNG 或 JUnit 的经验,beforeAll() 方法应该是每个 Test Case 首先跑的,很多时候,测试人员都会在这里放一些测试前的设置代码。
但在 KIF 中,在我的机器上,经常出现,beforeAll() 方法不会跑的情况。
原因未知,还没找到解决方法。

共收到 3 条回复 时间 点赞

感谢分享!

不知道楼主有没有在 webview 上跑过,前段时间试过还是会有点小坑。

- (void) beforeAll; 在本类中第一个 test case 执行前执行一次
用处:执行本类中各个测试函数的公共操作
注意:因为不能保证这个方法与 test case 是同一个类实例,所以不能用来设置实例变量的值,但是可以设置静态变量
- (void) beforeEach; 在每一个 test case 执行前执行一次
用处:执行各个函数需要的测试环境
注意:因为确保这个方法与 test case 是同一个类实例,所以可以用来设置实例变量
- (void) afterEach; 在每一个 test case 执行后执行一次
用处:用来将 App 恢复至 test case 之前的状态,可以包含一些条件判断逻辑,从失败的 test case 中恢复,以确保不影响之后的测试
- (void) afterAll; 执行完测试类的最后一个 test case 后执行一次
用处:用于将 App 恢复至测试的初始状态

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册