iOS 单元测试

作者: 尤先森 | 来源:发表于2019-04-02 22:47 被阅读0次

啥是单元测试

单元测试,是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
更详细内容请看百度百科

iOS中的单元测试 XCTestCase

XCTestCase

用于定义测试用例、测试方法和性能测试的主要类。

XCTestCase中有一系列的相关方法,在测试方法执行前后,会分别执行
setup:提供在测试用例开始之前自定义初始状态的机会。
teardown:提供在测试用例结束后执行清理的机会。

- (void)setUp {
    [super setUp];
    NSLog(@"初始化");
}
- (void)tearDown {
    [super tearDown];
    NSLog(@"销毁清除");
}
如何开始测试

在我们创建工程时,底下红框内的选项是默认勾选的,看名字也知道,选了这两个就可以用他们来做测试。


image.png

工程创建之后,就会有这两个文件夹,里面的.m文件就是我们测试的操作对象了。


image.png

先看UnitTestTests.m,我在这个文件中新添加了一个方法

image.png

会发现在代码的左边行数的地方,多了很多绿色打钩图标,代表这些方法是测试通过的,在后面还会展示没有测试通过的案例。
我们先看看log日志

image.png
可以看到,在每个测试方法执行前后,都分别执行了setup teardown

好了,基本方法有了一定的了解,继续往下

XCTestCase运用

新建,注意图中选项是Unit Test Case Class


image.png image.png

然后我们在原ViewController中写几个方法.h里面也声明一下方法

-(int)getSum:(int)a b:(int)b{
    return a+b;
}
//异步回调
- (void)loadData:(void (^)(id data))dataBlock{   
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [NSThread sleepForTimeInterval:2];
        NSString *dataStr = @"回调字符串";
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"刷新UI");
            dataBlock(dataStr);
        });
    });
}
//耗时操作
-(void)forFunction{
    for (int i = 0; i<1000; i++) {
        NSLog(@"这是耗时操作");
    }
}

然后在ViewControllerTests中调用测试

逻辑测试

通过给定条件进行测试,判断是否达到预期

image.png

XCTAssertEqual()中传入的三个参数分别为
第一个参数:方法调用结果
第二个参数:给与期望值
第三个参数:测试没通过的警告

这里给一个测试没通过的例子


image.png
性能测试

测试方法执行效率

testPerformanceExample中执行上面的耗时操作

image.png
灰色代表没有设置一个baseline做评定标准,设置一下,再跑一遍 image.png

当我们的基准线耗时低于当前的耗时时,就会提示测试未通过。


image.png

反之测试通过的结果


image.png

注意:测试案例必须以test作开头

UI测试

开始UI测试之前

在开始UI测试之前,有几点得先说
1.不是录制了就立马能用了
2.输入内容需要自行操作如果按照录制内容,很容易就崩,不能好好玩
3.录制代码自动补全主要还是辅助功能,不能完全满足需求。

1. 先command+R 运行项目

然后在文件对应的tests.m文件中,选择一个test开头的方法。如下图。

我们当前的期望是这样的,两个输入框分别输入,然后点击按钮查看结果,显示在label上。

image.png
image.png

我们这里先把原本已经录制的代码删除,反复触发控件,代码将会开始自己补全。


image.png

但是这些参数并不顶用,我们这里需要的是这几个参数
XCUIApplication *app
XCUIElementQuery *buttonElementsQuery
XCUIElement *textField
XCUIElement *textField2
XCUIElement *button
获取到我们想要的内容后,需要自己开始组织,这里提供一份组织好的...我也不知道该怎么写了,就看代码吧

- (void)testExample {
    XCUIApplication *app = [[XCUIApplication alloc] init];
    XCUIElementQuery *buttonElementsQuery = [app.otherElements containingType:XCUIElementTypeButton identifier:@"Button"];
    //要拿到控件,记得反复点。。直到他出现
    //拿到textfield
    XCUIElement *textField = [[buttonElementsQuery childrenMatchingType:XCUIElementTypeTextField] elementBoundByIndex:0];
    XCUIElement *textField2 = [[buttonElementsQuery childrenMatchingType:XCUIElementTypeTextField] elementBoundByIndex:1];

    //拿到button
    XCUIElement *button = app.buttons[@"Button"];

    //UI操作
    [textField tap];
    //输入操作得手动写,录制的那个不靠谱
    [textField typeText:@"123456"];
    [textField2 tap];
    [textField2 typeText:@"123"];

    [button tap];
    
}
注意:UI测试必须在程序是执行状态中,才能执行否则将会报错如下图
image.png

UI测试原理思路

程序运行起来之后,我们可以通过下图查看当前界面的图层结构,以及左侧的层级关系。UI测试也是类似的。


image.png

回到刚刚那份测试案例。
通过打断点,打印app来看


image.png
由上图,便可以很清楚的找到创建的4个控件。

UI测试参数说明

XCUIApplication:可以启动和终止的应用程序的代理。
XCUIElementQuery:可以定位UI元素的查询类
XCUIElement:程序的UI元素,在iOS中,提供手势交互,如tap、press按压、swiping滑动、pinching挤压和rotating旋转。

相关文章

  • iOS开发——单元测试

    iOS开发——单元测试 iOS开发——单元测试

  • 单元测试

    内容 单元测试 参考文章: [iOS单元测试系列]单元测试框架选型 iOS单元测试:Specta + Expect...

  • 【开发技巧】单元测试

    iOS XCTest单元测试 iOS开发:XCTest单元测试(附上一个单例的测试代码) [iOS单元测试系列]单...

  • 2019-08-28

    浅谈iOS单元测试 iOS单元测试从入门到应用 - 简书

  • 关于iOS单元测试几点Tips

    相关文章: 1、走出 iOS 单元测试的困境2、iOS单元测试--百度Hi iOS团队技术周报 一、单元测试有什么...

  • 浅谈iOS单元测试

    浅谈iOS单元测试

  • IOS单元测试

    IOS单元测试 单元测试开始- (void)setUp {[super setUp];// Put setup c...

  • iOS单元测试

    参考博客:iOS单元测试概念了解iOS异步测试Xcode:为你的项目集成单元测试(unit tests)时记得避开...

  • 单元测试

    转:iOS 使用Kiwi测试框架进行单元测试

  • iOS单元测试

    iOS单元测试 前言 单元测试使用XCTest框架 单元测试的目标:模型文件 用处:不基于界面UI的情况下,保证模...

网友评论

    本文标题:iOS 单元测试

    本文链接:https://www.haomeiwen.com/subject/bcugbqtx.html