Xcode单元测试

单元测试
上面的单元测试的百度词条解释,下面咱们就来说一下Xcode上单元测试的使用。

第一步、新建工程,勾选Include Unit Tests,如下图
Xcode单元测试_第1张图片
49C52B25-1B43-43A8-BDA4-F18D76794945.png
第二步、点击下一步,创建工程之后,你会发现多出一个ProjectNameTests的文件夹,如下图
Xcode单元测试_第2张图片
211E7389-BE3D-48D9-8F54-6417C251CC68.png
如果在创建项目时没有勾选这一项,也可以通过下面的方式来创建,如下图
Xcode单元测试_第3张图片
屏幕快照 2017-08-03 上午10.00.45.png
Xcode单元测试_第4张图片
屏幕快照 2017-08-03 上午10.01.15.png
Xcode单元测试_第5张图片
屏幕快照 2017-08-03 上午10.01.33.png

第三步、UnitTestDemoTests.m的说明和使用
1、UnitTestDemoTests.m的说明

/*
 *用于在测试前设置好要测试的方法,在测试方法调用之前调用,如,初始化的代码
 */
- (void)setUp {
    [super setUp];
    // Put setup code here. This method is called before the invocation of each test method in the class.
}

/*
 *用于在测试后将设置好的要测试的方法拆卸掉,释放资源
 */
- (void)tearDown {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    [super tearDown];
}

/*
 *测试示例,一定要以test开头
 *比如,你可以创建, - (void)testMyProject{}
 */
- (void)testExample {
    // This is an example of a functional test case.
    // Use XCTAssert and related functions to verify your tests produce the correct results.
}

/*
 *性能测试示例
 */
- (void)testPerformanceExample {
    // This is an example of a performance test case.
    [self measureBlock:^{
        // Put the code you want to measure the time of here.
        //在这里存放需要测试性能的代码
    }];
}

2、使用
ViewController中声明一个函数并实现,如,

- (BOOL)getMyBoolValue;
...
...
- (BOOL)getMyBoolValue
{
    return YES;
}

UnitTestDemoTests.m中导入ViewController的头文件,声明一个ViewController的对象并在setUp方法中初始化。如下,

#import 
#import "ViewController.h"
@interface UnitTestDemoTests : XCTestCase

@property (nonatomic,strong) ViewController *viewController;

@end

@implementation UnitTestDemoTests

/*
 *用于在测试前设置好要测试的方法,在测试方法调用之前调用,如,初始化的代码
 */
- (void)setUp {
    [super setUp];

    self.viewController = [[ViewController alloc]init];//初始化
}

/*
 *用于在测试后将设置好的要测试的方法拆卸掉,释放资源
 */
- (void)tearDown {

    self.viewController = nil;//释放

    [super tearDown];
}

/*
 *测试示例,一定要以test开头
 *比如,你可以创建, - (void)testMyProject{}
 */
- (void)testMyBoolFunc
{
    BOOL result = [self.viewController getMyBoolValue];
    XCTAssertEqual(result, NO,@"测试没通过");
}

接着,Command+U进行测试,然而,控制台可能会输出类似下面的错误提示:

Connection peer refused channel request forr"dtxproxy:XCTestDriverInterface:XCTestManager_IDEInterface"; channel canceled Failed to run tests: The operation couldn’t be completed. (DTXProxyChannel error 1.)

这时候,就要先Command + R运行一下项目,然后再Command+U进行测试。
当然,上面的例子没有测试通过,如下

屏幕快照 2017-08-03 上午10.35.45.png

控制台输出

Xcode单元测试_第6张图片
屏幕快照 2017-08-03 上午10.37.16.png

XCTAssertEqual(result, NO,@"测试没通过");NO修改为YES,测试通过,如下

屏幕快照 2017-08-03 上午10.39.44.png

控制台输出

Xcode单元测试_第7张图片
屏幕快照 2017-08-03 上午10.40.03.png

3、testPerformanceExample性能测试示例的使用和解释
如下,写一个for循环并输出值,然后Command+U进行测试,

Xcode单元测试_第8张图片
屏幕快照 2017-08-03 上午10.45.26.png

图中的 0.145 sec只是CPU运算的时间,时间显示和输出的时间可能比这个值要大一些
4、最后介绍一下 XCTAssertEqual以及相关的宏定义函数。

XCTFail(format…) 生成一个失败的测试;

XCTAssertNil(a1, format...)为空判断,a1为空时通过,反之不通过;

XCTAssertNotNil(a1, format…)不为空判断,a1不为空时通过,反之不通过;

XCTAssert(expression, format...)当expression求值为TRUE时通过;

XCTAssertTrue(expression, format...)当expression求值为TRUE时通过;

XCTAssertFalse(expression, format...)当expression求值为False时通过;

XCTAssertEqualObjects(a1, a2, format...)判断相等,[a1 isEqual:a2]值为TRUE时通过,其中一个不为空时,不通过;

XCTAssertNotEqualObjects(a1, a2, format...)判断不等,[a1 isEqual:a2]值为False时通过;

XCTAssertEqual(a1, a2, format...)判断相等(当a1和a2是 C语言标量、结构体或联合体时使用,实际测试发现NSString也可以);

XCTAssertNotEqual(a1, a2, format...)判断不等(当a1和a2是 C语言标量、结构体或联合体时使用);

XCTAssertEqualWithAccuracy(a1, a2, accuracy, format...)判断相等,(double或float类型)提供一个误差范围,当在误差范围(+/-accuracy)以内相等时通过测试;

XCTAssertNotEqualWithAccuracy(a1, a2, accuracy, format...) 判断不等,(double或float类型)提供一个误差范围,当在误差范围以内不等时通过测试;

XCTAssertThrows(expression, format...)异常测试,当expression发生异常时通过;反之不通过;(很变态)

XCTAssertThrowsSpecific(expression, specificException, format...) 异常测试,当expression发生specificException异常时通过;反之发生其他异常或不发生异常均不通过;

XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format...)异常测试,当expression发生具体异常、具体异常名称的异常时通过测试,反之不通过;

XCTAssertNoThrow(expression, format…)异常测试,当expression没有发生异常时通过测试;

XCTAssertNoThrowSpecific(expression, specificException, format...)异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过;

XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format...)异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过
特别注意下XCTAssertEqualObjectsXCTAssertEqual
XCTAssertEqualObjects(a1, a2, format...)的判断条件是[a1 isEqual:a2]是否返回一个YES。
XCTAssertEqual(a1, a2, format...)的判断条件是a1 == a2是否返回一个YES。

文章内容参考自 Jymn_Chen的博客,在此对他表示感谢。

你可能感兴趣的:(Xcode单元测试)