iOS 单元测试和UI测试

什么是单元测试

  • 检查是否每个代码单元(例如类或函数)是否能产生预期的结果
  • 独立运行的,不依赖于其他模块或组件

什么是UI测试

  • 是属于端到端的测试,是从应用程序启动到结束的测试过程
  • 完全按照用户和应用程序交互的方式来复制与应用程序的交互
  • 比单元测试慢,运行起来更耗费资源

测试注意事项

测试应该涵盖:
  • 核⼼功能:模型类和⽅法及其与控制器的交互
  • UI⼯作流程
  • 特殊的边界条件
  • Bug处理
测试原则FIRST
  • Fast:测试模块应该是快速⾼效的;
  • Independent/Isolated:测试模块应该是独⽴相互不影响的;
  • Repeatable :测试实例应该是可以重复使⽤的,测试结果应该是相同的;
  • Self-validating:测试应完全⾃动化。输出结果要么是“成功”,要么是“失败”;
  • Timely:理想情况下,应该在编写要测试的⽣产代码之前编写测试(测试驱动开发)

单元测试

  • 可以通过新建TestAppDelegate,防止业务代码对测试的影响
int main(int argc, char * argv[]) {
    NSString * appDelegateClassName;
    @autoreleasepool {
        // Setup code that might create autoreleased objects goes here.        
        id XCTest = NSClassFromString(@"XCTest");

        appDelegateClassName = XCTest ? @"TestAppDelegate" :  NSStringFromClass([AppDelegate class]);
    }
    return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}
  • 通过Product --> Test运行项目后,我们打开当前程序的可执行文件,会发现多了一个YPLoginAppUITests-Runner.app

    image.png

  • 显示YPLoginAppUITests-Runner.app的包内容,发现里面有三个动态库

    image.png

  • 新建一个YPLoginApp.test.xcconfig文件配置测试环境,链接动态库XCTest

XCODE_LIBARAR = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library

FRAMEWORK_SEARCH_PATHS = $(inherited) "${XCODE_LIBARAR}/Frameworks"

HEADER_SEARCH_PATHS = $(inherited)  "${XCODE_LIBARAR}/Frameworks/XCTest.framework/Headers"
   

OTHER_LDFLAGS = $(inherited) -framework "XCTest"

LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '${XCODE_LIBARAR}/PrivateFrameworks' '${XCODE_LIBARAR}/Frameworks'
  • 现在可以直接在项目中手动调用XCTest,实现边运行边测试
#import <XCTest/XCTest.h>

   // 管理者 XCTestSuite
    XCTestSuite *suite = [XCTestSuite defaultTestSuite];
    // 初始化 testCase
    LoginAppUITests *testCase = [LoginAppUITests new];
    // testCase --> suite
    [suite addTest:testCase];
    for (XCTest *test in suite.tests) {
        [test runTest];
    }
    //指定执行的具体sel
    //[suite addTest:[LoginAppUITests testCaseWithSelector:@selector(testExample)]];
  • 可以通过添加测试断点来进行调试
    image.png

第三方库

SYTimer
SYCSSColor

  • 我们可以通过pod导入SYTimerSYCSSColor到测试项目中

  • Product --> Test运行后,可以看到项目中具体文件执行的代码比例

    image.png

  • 点击箭头,跳转到具体代码页,其中红色代表未使用的代码,绿色代表使用的代码,红色注释形状代表此处部分代码被使用


    image.png
代表

UI测试

  • 下面是一个账号密码登录的测试,可以实现自动登录
    XCUIApplication *app = [[XCUIApplication alloc] init];
    [app launch];
    XCUIElement *nameinputTextField = app.textFields[@"nameInput"];
    XCUIElement *passwordInputTextField = app.secureTextFields[@"passwordInput"];
    [nameinputTextField tap];
    [nameinputTextField typeText:@"Cat\n"];
    
    [passwordInputTextField doubleTap];
    [passwordInputTextField typeText:@"123"];

    [app.buttons.staticTexts[@"登录"] tap];
  • 其中nameInputpasswordInput登录是通过accessibilityIdentifiler或者accessibilityLabel属性设置标志
    image.png

第三方

KIF -- UI自动化测试框架

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

推荐阅读更多精彩内容

  • 前言 单元测试和UI测试大致步骤网上很多文章都有,如果会的可以忽略,关键是错误总结,网上很少有文章提及到,感兴趣的...
    _YGL_阅读 5,171评论 20 23
  • 单元测试不是一个小工程,需要多用些时间才能做好,不要希望通过这个文章就能掌握单元测试,这只是一个入门,需要自己动手...
    勇不言弃92阅读 7,818评论 9 60
  • https://juejin.im/post/5c1b60a8e51d4523ca0a14c6 单元测试 http...
    贝灬小晖阅读 242评论 0 0
  • 找出要测试的内容 在编写任何测试之前,了解基础知识很重要。您需要测试什么? 如果您的目标是扩展现有应用程序,则应首...
    Joker_King阅读 873评论 0 1
  • 编写测试可不是一项迷人的工作;然而,由于测试可以避免使你的宝贝应用程序变成一块充斥错误的大垃圾场,所以编写测试又是...
    cosWriter阅读 1,581评论 0 4