XCTest 之单元测试 (一)
2017-12-10 本文已影响0人
lazy_boy_coder
前言
前段时间在负责iOS移动端的埋点项目,项目上线好几个月了,开始针对,SDK中出现的问题,以及整个代码的结构执行重构。为了增加重构之后可以快速发现哪里不足,以及针对这几个月来领悟到SDK的痛。至此,给埋点SDK增加单元测试。
单元解决了什么问题
- 单元测试保证了,即使在项目重构之后,也可以快速帮我验证逻辑
- 节省测试时间,减少了低级错误
- 由于疏忽改动了代码,可以帮助快速检测出
XCTest 使用
首先新建一个工程,在如下页面选择
如果,在创建项目的时候没有选择的话,还可以通过新建target的形式
File -> new -> Target -> iOS Unit Testing Bundle 的形式创建测试 target
这样我们就为工程创建了单测,工程目录结构如图:
这里有几个方法:
// 在每一个测试方法调用前,都会被调用
// 用来初始化 test 用例的一些初始值
- (void)setUp {
[super setUp];
// 代码写在这
}
// 在每一个测试方法调用后,都会被调用
// 用来重置 test 方法的数值
- (void)tearDown {
// 代码写在这
[super tearDown];
}
// 性能测试
- (void)testPerformanceExample {
// This is an example of a performance test case.
[self measureBlock:^{
for(int i = 0; i < 1000; i++) {
}
}];
}
把需要性能测试的代码写在block里面
关于性能:
当我们点击测试之后,会在左边出现result具体结果。
参数:
- Metirc : Time 表示度量标准为时间
- Result : 是以百分比的形式和上次测量结果做比较。好 better ,坏 worse
- Average : 为测量时间的平均值
- Baseline : 时间基准,以这个时间基础为基础,算出来的时间跟这个比较得到Result结果的百分比
- MAX STDDEV : 标准差最大为多少
代码覆盖度:
要看到代码覆盖度需要打开:
Edit Scheme -> Test -> 勾选上 Gather coverage data
我们在新建项目的时候,这个选项是默认不帮我们勾选的
当我们写好单元测试代码的时候,可以直接 Command + U 快捷键,全局跑下所有的单元测试。
可以在左侧的report navigator
这样可以看到代码覆盖度。如果,编辑了选项,还是在 Coverage Tab下没有看到展示代码覆盖度。那么请清理一下缓存重新试一下。
断言API,苹果在
#import <XCTest/XCTestAssertionsImpl.h>
文件里提供了断言的 API
XCTFail 无条件报错断言
XCTAssertEqualObjects(expression1, expression2, ...) 两个数值不相等的时候报错
XCTAssertNotEqualObjects(expression1, expression2, ...) 两个数值相等的时候报错
XCTAssertNil(expression, ...) 表达式不为nil的时候则报错
XCTAssertNotNil(expression, ...) 当一个表达式的值为空的时候则报错
XCTAssertTrue(expression, ...) 当表达式的值不为 true 的时候则报错
XCTAssertFalse(expression, ...) 当表达式的值不为false的时候则报错
XCTAssertEqualObjects(expression1, expression2, ...) 两个表达式不相等则报错
XCTAssertNotEqualObjects(expression1, expression2, ...) 两个表达式相等则报错
XCTAssertEqual(expression1, expression2, ...) 两个表达式不相等则报错 更多的用于数值比较
XCTAssertNotEqual(expression1, expression2, ...) 两个表达式相等则报错 更多的用于数值比较
XCTAssertEqualWithAccuracy(expression1, expression2, accuracy, ...) 两个表达式之间的差异
如果大于accuracy则报错
XCTAssertNotEqualWithAccuracy(expression1, expression2, accuracy, ...)两个表达式之间的差异
如果小于等于accuracy则报错
XCTAssertGreaterThan(expression1, expression2, ...) 表达式1小于等于表达式2则报错
XCTAssertGreaterThanOrEqual(expression1, expression2, ...) 表达式1如果小于表达式2则报错
XCTAssertLessThan(expression1, expression2, ...) 表达式1 大于等于表达式2则报错
XCTAssertLessThanOrEqual(expression1, expression2, ...) 表达式1 大于表达式2则报错
XCTAssertThrows(expression, ...) 表达式不抛异常时报错
如:
NSArray *array = @[@1, @2, @3];
XCTAssertThrows([array objectAtIndex:1]);
XCTAssertThrowsSpecific(expression, exception_class, ...) 对指定的类,没抛异常时则报错
如:
XCTAssertThrowsSpecific([array objectAtIndex:10], NSArray);
XCTAssertThrowsSpecificNamed(expression, exception_class, exception_name, ...) 没抛指定类
指定名字的异常则测试失败
XCTAssertNoThrow(expression, ...) 抛异常时则测试失败
XCTAssertNoThrowSpecific(expression, exception_class, ...) 跑抛出指定类的异常则测试失败