单元测试
上面的单元测试的百度词条解释,下面咱们就来说一下Xcode
上单元测试的使用。
第一步、新建工程,勾选Include Unit Tests
,如下图
第二步、点击下一步,创建工程之后,你会发现多出一个ProjectNameTests
的文件夹,如下图
如果在创建项目时没有勾选这一项,也可以通过下面的方式来创建,如下图
第三步、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
进行测试。
当然,上面的例子没有测试通过,如下
控制台输出
把XCTAssertEqual(result, NO,@"测试没通过");
中NO
修改为YES
,测试通过,如下
控制台输出
3、testPerformanceExample
性能测试示例的使用和解释
如下,写一个for循环
并输出值,然后Command+U
进行测试,
图中的
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没有发生具体异常、具体异常名称的异常时通过测试,反之不通过
特别注意下XCTAssertEqualObjects
和XCTAssertEqual
。
XCTAssertEqualObjects(a1, a2, format...)的判断条件是[a1 isEqual:a2]是否返回一个YES。
XCTAssertEqual(a1, a2, format...)的判断条件是a1 == a2是否返回一个YES。
文章内容参考自 Jymn_Chen的博客,在此对他表示感谢。