ios技巧 -- 单元测试

单元测试:是检查是否每个代码单元(例如类或函数)是否能产⽣预期
的结果。
单元测试是独⽴运⾏的,不依赖于其他模块或组件。

FIRST

  1. Fast:测试模块应该是快速⾼效的;
  2. Independent/Isolated:测试模块应该是独⽴相互不影响的;
  3. Repeatable :测试实例应该是可以重复使⽤的,测试结果应该是相同的;
  4. Self-validating:测试应完全⾃动化。输出结果要么是“成功”,要么是“失败”;
  5. Timely:理想情况下,应该在编写要测试的⽣产代码之前编写测试(测试驱动开发)。

单元测试需要启动APP。所以每次都会进行加载,产生耗时操作,所以这个时候就需要在测试的启动自己的FakeAppDelegate
这个时候我们可以从main函数中进行调试

int main(int argc, char * argv[]) {
    NSString * appDelegateClassName;
    @autoreleasepool {
        // Setup code that might create autoreleased objects goes here.

        appDelegateClassName = NSStringFromClass([AppDelegate class]);
    }
    return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}

原理只要将appDelegateClassName换成我们自己的测试FakeAppDelegate就可以了,但是会将自己整成的程序污染,这个时候就需要NSStringFromClass,NSStringFromClass只有被编译的类才会查找到,而UnitTest类只有测试时才会参与编译,所以我们可以改成

int main(int argc, char * argv[]) {
    NSString * appDelegateClassName;
    @autoreleasepool {
        // 方法 字符串->class
        id cls = NSClassFromString(@"XCTest");
        appDelegateClassName = cls ?  @"FakeAppDelgate" : NSStringFromClass([AppDelegate class]);
    }
    // 进行单元测试的时候 FakeAppDelgate
    return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}

swift中也是同理
新建main.swift


let cls = NSClassFromString("XCTest") != nil
let appDelegateClassName = cls ? NSStringFromClass(LGFakeAppDelegate.self) : NSStringFromClass(AppDelegate.self)

UIApplicationMain(CommandLine.argc, CommandLine.unsafeArgv, nil, appDelegateClassName)

编译完成之后我们我们打开app包所在位置,除了我们应用的app包还有个测试包

测试包.png

里面有几个动态库,我们的单元测试是不是有个方法进入,我们引入这个库,位置是 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks
我们通过xcconfig来引入

// 1. header
HEADER_SEARCH_PATHS = $(inherited) "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks/XCTest.framework/Headers"
//2.链接动态库

// 传统方式
OTHER_LDFLAGS = $(inherited) -F"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks" -framework "XCTest"

LD_RUNPATH_SEARCH_PATHS = $(inherited) "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks"

这个时候我们只要导入#import <XCTest/XCTest.h>就可以在项目中直接使用单元测试,我们把test.m中的内容拷贝进入。

    XCTestSuite *suite = [XCTestSuite defaultTestSuite];
    // 初始化 testCase
    LoginAppUITests *testCase = [LoginAppUITests new];
    // testCase -》 suite
    [suite addTest:testCase];
    for (XCTest *test in suite.tests) {
        [test runTest];
    }

如果直接创建就相当于执行一个单元测试,测试完就会崩溃,主要是[XCTestSuite defaultTestSuite]只能执行一次。

//起个别名
    XCTestSuite *suite = [XCTestSuite testSuiteWithName:@"MyTest"];
//指定某个方法
    [suite addTest:[LoginAppUITests testCaseWithSelector:@selector(testExample)]];
    
    for (XCTest *test in suite.tests) {
        [test runTest];
    }
}

OC&swift测试

swiftTest调用OC方法

新建一个测试文件swiftTest,会自动创建UnitTest工程的桥接文件,再在主工程创建swift类生成主工程的桥接文件,在主工程桥接文件中导入创建的类,在swiftTest导入主工程模块,就可以直接使用了。

导入主模块.png

如果要测试swift代码就需要@testable import "testApp",这样就可以支持测试open,public, internal权限的代码

OC调用swift方法

直接#import "testApp-Swift.h"会提示无法找到,这时候需要在TARGET找到单元测试的target,在buildsetting中的Header Search Path中将路径添加进去$CONFIGURATION_TEMP_DIR/testApp.build/DerivedSources,注意修改自己的项目名称

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

推荐阅读更多精彩内容