美文网首页iOS-Developer-OC
XCTestCase(智能测试化工具)

XCTestCase(智能测试化工具)

作者: Mi欧阳 | 来源:发表于2016-11-04 14:43 被阅读808次

    前言:

    本文章更像总结归纳,其中主要参考资料有:
    风之痕_ : 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

    相关文章

      网友评论

        本文标题:XCTestCase(智能测试化工具)

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