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文件


XCTestCase(智能测试化工具)_第1张图片
C877AC3D-C118-4D87-93E1-989B411810CE.png

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


XCTestCase(智能测试化工具)_第2张图片
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
进入编辑方案页面


XCTestCase(智能测试化工具)_第3张图片
1D0E6ACA-61E7-438F-9710-798722AB36EF.png

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


XCTestCase(智能测试化工具)_第4张图片
E5A6B8D3-387C-4086-93F9-6A4BCE043BBA.png

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


XCTestCase(智能测试化工具)_第5张图片
7EDD08A8-3B2C-4602-954A-AEC0817B937D.png

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


XCTestCase(智能测试化工具)_第6张图片
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


XCTestCase(智能测试化工具)_第7张图片
1306128-119ee1f0f17dcffb.gif

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


XCTestCase(智能测试化工具)_第8张图片
1306128-e298d476bd2553e1.gif

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

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


XCTestCase(智能测试化工具)_第9张图片
63CCC2DD-FD94-4D14-8534-4BAAC1F4846A.png

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

XCTestCase(智能测试化工具)_第10张图片
0F094A08-3CB9-42E8-A34D-214576FA7F2D.png

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

XCTestCase(智能测试化工具)_第11张图片
CF206FEB-D237-42D9-960C-C71C829365AD.png

UnitTest UI测试

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


XCTestCase(智能测试化工具)_第12张图片
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中就好了

XCTestCase(智能测试化工具)_第13张图片
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(智能测试化工具))