XCTestCase(智能测试化工具)

前言:

本文章更像总结归纳,其中主要参考资料有:
风之痕_ : http://www.jianshu.com/p/f4ba532caed0
RasonWu:http://www.jianshu.com/p/8bbec078cabe
CocoaChina: http://www.cocoachina.com/ios/20150702/12253.html

基础介绍:

XCTestCase 这个类,衍生出两个分支:单元测试(Unit Testing)和自动化测试UI自动测试(UnitTest UI)。这两个测试类都是继承于XCTestCase,都只有.m文件


C877AC3D-C118-4D87-93E1-989B411810CE.png

创建完成后一些基本方法展示如下:


81D4223D-AD8D-4742-80F8-F3B83CABB2B7.png

XCTestCase的常用断言一览

@property (nonatomic,assign) int condition1;
@property (nonatomic,assign) int condition2;
@property (nonatomic,assign) int condition3;
@property (nonatomic,strong) NSString *condition4;

//这里的断言基本都以XCT开头,末参数一定为报错时展示的文字信息
//断言,最基本的测试,第一个参数为真,则通过
XCTAssert(_condition1 == _condition2, @"测试过程中出现错误");
//bool测试中的true测试,首参数为真通过
XCTAssertTrue(_condition1 == _condition2,@"BOOL测试中的true测试出错");
//bool测试中的false测试,首参数为假通过
XCTAssertFalse(_condition1 == _condition3,@"BOOL测试中的false测试出错");
    
//相等测试,首参数与次参数相等通过
XCTAssertEqual(_condition1, _condition2,@"相等测试出错");
//不相等测试,首参数与次参数不相等通过
XCTAssertNotEqual(_condition1, _condition3,@"不等测试出错");
//针对loat或double比较,首参数与次参数的差,比第三参数的值小,通过
//大于测试
XCTAssertGreaterThan(_condition1, _condition3, @"大于测试出错");
//大于等于测试
XCTAssertGreaterThanOrEqual(_condition1, _condition2, @"大于或等于测试出错");
//相差测试,首参数与次参数的差,比第三参数的值小,通过
XCTAssertEqualWithAccuracy(0.6, 0.5, 0.11, @"相差测试结果比第三参数大");
//针对loat或double比较,首参数与次参数的差,比第三参数的值大,通过
XCTAssertNotEqualWithAccuracy(0.6, 0.5, 0.01, @"相差测试结果比第三参数小");
    
//首参数为nil,通过
XCTAssertNil(nil, @"nil测试");
//首参数不为nil,通过
XCTAssertNotNil(_condition4,@"非nil测试");
//无条件报错
XCTFail(@"强制失败");

异步测试

Unit Testing除了进行一般测试外还可以进行异步测试。逻辑是设置一个【期望】,然后在异步方法中执行【期望满足】。外部则设定一个时间限制来捕获该【期望】。

//异步测试(期望测试)
- (void)testExpectation {
    //声明一个期望
    XCTestExpectation *exp = [self expectationWithDescription:@"这里写入操作出错的原因描述。。。"];
    //添加一个新线程
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    [queue addOperationWithBlock:^{
        //模拟这个异步操作需要2秒后才能获取结果,比如一个异步网络请求
        sleep(2);
        //模拟获取的异步操作后,获取结果,判断异步方法的结果是否正确
        XCTAssertEqual(_condition1, _condition2,@"返回结果又问题");
        //如果断言没问题,就调用fulfill宣布测试满足期望
        //注:如果你申明了多个期望,每个都需要fulfill
        [exp fulfill];
    }];
    
    //延迟捕获,3秒后未获得满足的期望,会报错。这里修改为"1"就会报错
    [self waitForExpectationsWithTimeout:3 handler:^(NSError * _Nullable error) {
        if (error) {
            NSLog(@"Timeout Error: %@", error);
        }
    }];
}

代码覆盖率测试

Unit Testing还可以测试代码覆盖率(代码覆盖率 = 实际执行的代码行数 / 整个工程总代码行数)
如果某个类中代码覆盖率并不是100%,那么有可能类中存在冗余代码,或者类中有方法被遗忘了,不管哪一种我们都应该尽力解决它。

实现方法:
点击product->scheme->Edit Scheme
进入编辑方案页面


1D0E6ACA-61E7-438F-9710-798722AB36EF.png

打开代码覆盖率计数功能(XCode关闭后会自动关闭)


E5A6B8D3-387C-4086-93F9-6A4BCE043BBA.png

以Test模式运行项目,快捷键commond+U
测试通过后,在Report Navigator窗口可以查看代码覆盖率


7EDD08A8-3B2C-4602-954A-AEC0817B937D.png

双击类或者方法,可以打开,查看具体方法的执行情况。


AD4DB30F-3BB7-4E66-9EA2-2F851C57B926.png

XCTestCase与CocoaPods

如果在XCTestCase中使用CocoaPods的话,Pod中导入的库在XCTestCase是不能直接使用的。
会发生找不到路径的错误,需要进行如下配置

Podfile

platform :ios, '7.0'
pod 'AFNetworking', '~> 2.5.0'
pod 'STAlertView', '~> 1.0.0'

1.修改 TARGETS => XCTestCaseTests => Build Phases => Header Search Paths


1306128-119ee1f0f17dcffb.gif

2.修改 TARGETS => XCTestCaseTests => Build Phases => 新增 => PODS_ROOT


1306128-e298d476bd2553e1.gif

3.如果想使用Http地址进行网络访问
Info.plist => 添加 => NSAppTransportSecurity(类型Dictionary)。
NSAppTransportSecurity => NSAllowsArbitraryLoads(类型Boolean) =>设置值YES

4.如果想要在#import "xxxx" 中显示你导入的第三方库中类的名称
采用如下方法(消耗一定内存):


63CCC2DD-FD94-4D14-8534-4BAAC1F4846A.png

其中【$(SRCROOT)】可以再约束下成为更精准的定位,今后再研究
成果展示:

0F094A08-3CB9-42E8-A34D-214576FA7F2D.png

另外:1、2两步骤还有另外一种操作方式可以达到同样效果

CF206FEB-D237-42D9-960C-C71C829365AD.png

UnitTest UI测试

这个测试工具主要功能是自动执行设置的UI操作流程,达到自动化测试的目的。对于一些逻辑复杂的调试情况十分有利。例子:登陆后填写表单,测试表单中每一行测试缺失的报错情况。
操作流程:


0C5CF711-2223-4F65-881D-53FAD268512E.png

附录:XCTest的三种UI测试对象

1.XCUIApplication 当前测试应用target
2.XCUIElementQuery 定位查询当前UI中xctuielement的一个类
3.XCUIElement UI测试中任何一个item项都被抽象成一个XCUIElement类型

出现过的问题:

问题一、"library not found for - xxxxxx"
问题原因:项目中使用pods,但xcode编译时找不到目标库
解决方案:在Library Search Paths中指定缺失的路径
注:我发生的情况Test缺失了Path路径,所以直接从项目XCTestCase中把对应的路径拷贝到Test的Build Setting中就好了

1F8C5EBD-F962-4213-9AF4-7444A38EF47C.png

资料:
http://www.jianshu.com/p/f4ba532caed0
http://www.jianshu.com/p/8bbec078cabe
http://www.cocoachina.com/ios/20150702/12253.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,077评论 25 707
  • layout: post title: "Xcode 7智能测试化工具XCTest学习" ...
    风之痕_阅读 22,654评论 14 101
  • 编写测试可不是一项迷人的工作;然而,由于测试可以避免使你的宝贝应用程序变成一块充斥错误的大垃圾场,所以编写测试又是...
    cosWriter阅读 1,581评论 0 4
  • 秋水是凝望,凝望是眼眸里的伤,伤是泪里折射下的华光,华光是落寞的收场。 然后夕阳凄美了走廊,时间斑驳了围墙,背影拉...
    赵清欢阅读 407评论 0 0
  • 以前在学习Runtime,概念性东西太多,总是有种朦胧的感觉。现在潜心研究Runtime。发现越深入了解,越能接触...
    城市之光阅读 492评论 2 0