Xctest    是iOS的单元测试框架,有objective-c和swift两种语言可以选择
Xcuitest  是iOS的UI测试框架
 
 
XCTest 框架类似于python中的unit test框架,声明一个测试case继承XCTestCase和测试方法,测试方法以test开头,然后执行。
 

相关类介绍:

 

Class XCTest

 
XCTest类提供XCTestCase和XCTestSuite用于创建、管理和执行测试的共享功能。在大多数情况下,在项目中定义测试时,应该直接子类化XCTestCase。
 
包含了以下属性:
  1. name:   test 的 name
  2. testCaseCount: case个数
  3. testRun: XCTestRun对象来执行test
  4. testRunClass: 运行测试时实例化的XCTestRun子类,以保存测试结果。
 
包含了以下方法:
  1. perform( XCTestRun ):  执行一个特定的测试
  2. run():创建testRunClass指定的类的实例,并将其作为参数传递给执行perform(_:)方法。
还包含了一系列的断言方法
 

Class XCTestCase

 
具体的属性和方法看文档,主要包含代码块性能检测,异步测试(例如打开文档,其它线程工作,网络活动等等)
 
然后我们看下iOS比较特殊的XCUITest
 

Class XCUITest

 
Xcuitest 的话有三大类
XCUIApplication: 实现了application的launch,active, terminal, state等功能
XCUIElement:定义了元素的操作事件
XCUIElementQuery: 元素查询定位相关
 
XCUIApplication类继承自XCUIElement类,XCUIElement类遵循XCUIElementAttributes和XCUIElementTypeQueryProvider协议,而XCUIElementTypeQueryProvider协议返回的UI元素对象则是XCUIElementQuery类。
 

XCUIApplication

有三种创建application的方法
  1. init()会创建当前test的target application 代理,这个是在Xcode中设置的
  2. init(bundleIdentifier)创建指定bundle ID的application 代理
  3. init(url) 根据URL指定资源创建代理
 
几个常用的方法:
  1. launch( )      启动app
  2. activate() 激活app(如果app进入后台,可以用这个方法激活启动到前台)
  3. terminate() 终止所有app

XCUIApplication.State

判断当前app的运行状态
  1. unknown  未知状态
  2. notRuning  未运行
  3. runningBackgroundSubspended 后台运行但被挂起
  4. runningBackground 后台运行
  5. runningForeground  正在前台运行
 
 

XCUIElement

XCUIElementQuery

Xcuielement 是所有app元素的类,重点记录下如何使用XCUIElementQuery来定位元素
 
创建查询
 
func descendants(matching type: XCUIElement.ElementType) -> XCUIElementQuery
 
返回所有符合元素类型的结果
 
func containing(_ predicate: NSPredicate) -> XCUIElementQuery
 
返回包含匹配特定描述的元素
 
func matching(identifier: String) -> XCUIElementQuery
 
 返回匹配identifier的所有元素
 
func matching(NSPredicate) -> XCUIElementQuery
 
传入NSPredicate作为过滤器返回一个新查询,该查询匹配与所提供描述直接匹配的所有元素。
 
获取匹配元素
 
var allElementsBoundByIndex: [XCUIElement] { get }
 
查询返回对应索引的元素数组
 
var count: Int { get }
 
查询匹配到的元素个数
 
var element: XCUIElement { get }
 
查询的单个匹配元素
 
func element(boundBy index: Int) -> XCUIElement
 
将索引用于查询结果的元素,以确定要使用哪个基础可访问性元素。
 
func element(matching predicate: NSPredicate) -> XCUIElement
 
返回与之匹配的元素
 
这里要介绍下Class NSPredicate
一种逻辑条件的定义,用于约束检索或内存筛选。
 
init(format predicateFormat: String,
argumentArray arguments: [Any]?)
 
通过将给定数组中的值替换为格式字符串并解析结果来初始化匹配器。
例如:
//创建匹配器,匹配placeholderValue的值为Type in number的控件
let predicate = NSPredicate(format: "placeholderValue == %@", "Type in number")
 

Class XCUICoordinate

屏幕上相对于某个UI元素的位置。
 
可以通过xcuielement的
func coordinate(withNormalizedOffset normalizedOffset: CGVector) -> XCUICoordinate
来生成一个UI位置
 
这个点生成的参数CGVector是生成位置的x,y除以当前element的中心点的x,y坐标 
 
在官方文档中还有许多类,但基本基于上述的一些父类实现不同的方法,这个需要根据测试的需要来使用

XCTest-iOS单元测试框架的更多相关文章

  1. iOS单元测试1

    iOS单元测试1 iOS单元测试分为两种类型的测试: 应用测试.应用程序测试可以检查app的代码组件,比如计算机的算术运算的例子.你可以利用应用程序测试来确保你的UI空间控件保持原有位置,并且你的控件 ...

  2. Xcode 5 单元测试(一)使用XCTest进行单元测试

    在Objc.io #1的Testing View Controllers中讲解的就是单元测试的相关内容.本文说下如何通过Xcode 5中集成的XCTest框架进行简单的单元测试. 什么是单元测试 首先 ...

  3. 爱上iOS单元测试系列之爱上她就要先了解她:单元测试入门

    前言 对于单元测试一开始我是拒绝的.单元测试是一个什么东东,因为我喜欢做iOS开发是因为喜欢写APP的啊,一切和这一目标不相干的东西我没兴趣啊,所以从事iOS开发几年都没去深入学习过单元测试(主要是之 ...

  4. xcode 5 使用 XCTest 做单元测试

    xcode 5 使用 XCTest 做单元测试 什么是单元测试,请看 百度百科 单元测试 一:在xcode5 之前,我们新建项目时,可以选择是否集成单元测试:如今在xcode5,我们新建立的项目默认就 ...

  5. XCode下的iOS单元测试

    XCode 内置了 OCUnit 单元测试框架,但目前最好用的测试框架应该是 GHUnit.通过 GHUnit + OCMock 组合,我们可以在 iOS 下进行较强大的单元测试功能.本文将演示如何在 ...

  6. unittest单元测试框架前言

    一.在我们没有学习过python语言的时候领导让我们做接口测试 我们都使用工具来做测试,一般常用的如jemeter,postman这些个工具,我来推荐使用postman 这个工具来进行接口测试,有的小 ...

  7. python单元测试框架笔记

    目录 单元测试概述 什么是单元测试 单元测试什么进行? 单元测试由谁负责? 单元测试需要注意 单元测试覆盖类型 python 单元测试框架 unittest pytest 测试框架 单元测试概述 什么 ...

  8. javascript单元测试框架mochajs详解

    关于单元测试的想法 对于一些比较重要的项目,每次更新代码之后总是要自己测好久,担心一旦上线出了问题影响的服务太多,此时就希望能有一个比较规范的测试流程.在github上看到牛逼的javascript开 ...

  9. Google C++单元测试框架GoogleTest(总)

    之前一个月都在学习googletest框架,对googletest的文档都翻译了一遍,也都发在了之前的博客里,另外其实还有一部分的文档我没有发,就是GMock的CookBook部分:https://g ...

随机推荐

  1. linux的定时器(timer_create,timer_gettime,timer_delete,SIGEV_SIGNAL)

    ref : http://blog.chinaunix.net/uid-28458801-id-5035347.html   系统中的一个模块需要频繁的获取系统时间,使用linux中内置的函数开销过大 ...

  2. CodeFirst实体类中,为什么都把ICollection<x>定义成virtual?

    主要是用于延迟加载,提高性能用的 只有定义成virtual后才可以延迟加载. 延迟加载,默认情况下,延迟加载被支持,如果你希望禁用它,必须显式声明,最好的位置是在 DbContext 的构造器中. p ...

  3. No database provider has been configured for this DbContext

    var context = ((IInfrastructure<IServiceProvider>)set).GetService<DbContext>(); 在EF Core ...

  4. 解决设置了display:none的元素,会先展示再隐藏

    问题:元素明明设置了display:none,但是在刷新页面的时候却会先显示了出来,然后才会隐藏,实现display:none 原因:由于元素渲染的时候,样式还没有应用上去,导致的 解决办法:使用内联 ...

  5. 客户想要的 vs 客户实际预算:漫画解读软件开发模式 ​​​​

    转自:http://blog.jobbole.com/113230/ 1913 年,美利坚工业之神——亨利福特,发明了世界上第一条流水线,汽车工业从此进入了大规模生产的时代.丰田公司提出的丰田生产系统 ...

  6. react route使用HashRouter和BrowserRouter的区别-Content Security Policy img-src 404(Not found)

    踩坑经历 昨天看了篇关于react-route的文章,说BrowserRouter比HashRouter好一些,react也是推荐使用BrowserRouter,毕竟自己在前端方面来说,就是个小白,别 ...

  7. PHP点击按钮拷贝

    一.PHP中点击按钮拷贝文本,我一个页面有多个按钮,相同颜色的标注代表了相同的列或ID 二.这是HTML代码 <tr> <td>直播流地址(延时60秒)</td> ...

  8. SVN建立分支和合并代码

    1.SVN建立分支正确SVN服务器上会有两个目录:trunk和branches.trunk目录下面代码就是所谓的主版本,而branches文件夹主要是用来放置分支版本.分支版本是依赖于主版本的,因此建 ...

  9. 实用:Java基础流计算

    java的流不常用,每次学习完都懂,过了一段时间就全忘了... 记录下一点实用的东西... 需求: 截取文件的前250kb内容 public static void main(String[] arg ...

  10. Python MySQL 数据库连接不同方式

    PyMySQL 驱动连接 什么是 PyMySQL?PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb. PyMySQL 遵循 P ...