似此星辰非昨夜
为谁风露立中宵
前言
我们在做组件化的过程中,肯定需要做的一步就是拆组件,把我们项目中的各个模块拆分为基础组件、功能组件、业务组件,但是在拆分的过程中很容易就会出现问题,所以我们在做组件化的过程中把每个组件都加上了单元测试,这样可以大大提高了我们组件的健壮性,随着我们的组件完成告一段落,今天就把当初探索学习单元测试的经验分享给大家,每种断言、每种测试场景都对应的有例子,希望能对你能有帮助
什么是单元测试
(Unit Testing)又称为模块测试, 是针对程序模块的最小单位来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。
单元测试的发展
1.Xcode在XCode4.x时代集成的是OCUnit
2.XCode5.x时代就升级为了XCTest
3.XCode7增加UI测试
单元测试框架
- XCTest(苹果自带,推荐)
- Kiwi
- GHUint
- OCMock
单元测试带来的好处
- 测试做了我们期望它做的事情
- 尽早的发现程序的 bug 和不足
- 保证在加入新功能或修改旧功能时代码的正确性
缺点:
没有足够的时间编写单元测试,或者说大家都没有写单元测试的习惯
XCTest
XCTest是Xcode自带的一个测试框架,苹果官方推荐我们使用
XCTestCase
XCTest中的测试类都是继承自XCTestCase
XCTestCase类结构
- (void)setUp:
在调用类中的每个测试方法之前调用此方法。
- (void)tearDown
这个方法在类中的每个测试方法调用之后调用
- (void)testPerformanceExample
将要度量时间的代码放在这里
- (void)testExample
使用XCTAssert和相关函数验证测试结果是否正确
断言
无条件报错
等价测试
nil测试
布尔测试
异常测试
无条件报错
1.XCTFail.生成一个无条件报错。
等价测试
1.XCTAssertEqualObjects
2.XCTAssertNotEqualObjects
3.XCTAssertEqual. 当expression1不等于expression2时报错,这个测试用于C语言的常量
4.XCTAssertNotEqual
5.XCTAssertEqualWithAccuracy. 当expression1和expression2之间的差别高于accuracy 将报错。这种测试适用于floats和doubles这些常量,两者之间的细微差异导致它们不完全相等,但是对所有的常量都有效。
6.XCTAssertNotEqualWithAccuracy
Nil(空)测试
1.XCTAssertNil. 当expression参数非nil时报错
2.XCTAssertNotNil
Boolean测试
1.XCTAssertTrue. 当expression计算结果为false时报错。
2.XCTAssertFalse. 当expression计算结果为true报错。
3.XCTAssert. 当expression计算结果为false时报错,与XCTAssertTrue同义。
异常断言测试
1.XCTAssertThrows.当expression不抛出异常时报错。
2.XCTAssertNoThrow. 当expression抛出异常时报错。
3.XCTAssertThrowsSpecific.当expression针对指定类不抛出异常时报错。
4.XCTAssertNoThrowSpecific. 当expression针对指定类抛出异常时报错。任意其他异常都可以;也就是说它不会报错。
5.XCTAssertThrowsSpecificNamed. 当expression针对特定类和特定名字不抛出异常时报错。对于AppKit框架或Foundation框架非常有用,抛出带有特定名字的NSException(NSInvalidArgumentException等)。
6.XCTAssertNoThrowSpecificNamed. 当expression针对特定类和特定名字抛出异常时报错。对于AppKit框架或Foundation框架非常有用,抛出带有特定名字的NSException(NSInvalidArgumentException等)
如何写单元测试
找到测试场景
逻辑测试
异步测试
性能测试
准备测试数据
边界测试数据
正确测试数据
错误测试数据
验证结果
使用断言验证
单元测试的规范
1.合理命名测试用例
1.一个测试方法只测试被测类的一个明确功能, 并命名相应测试方法
需要被测试的方法
相应的测试方法
2.保持测试的独立性
3.把测试维持在单元级别
4.只测公有接口
逻辑测试
异步测试
1.定义一个XCTestExpectation,表示异步测试想要的结果。
2.设置timeout,表示异步测试最多可以执行的时间。
3.异步的代码完成后,调用fullfill来通知异步测试满足条件
性能测试
1.评估一段代码的运行时间,XCTest的性能的测试如下格式
Performance Result(性能测试结果)
Metric:时间作为性能的指标
Average:表示平均时间
Baseline:表示你设置一个基线
Result:是指平均时间和你是设置的基线进行比较后得出的结果,百分比表示的
max STDDEV :表示标准偏差 10%。
点击Edit,我们可以设置Baseline,ax STDDEV ,来设置觉得满意的性能测试条件
底部点击1,2…10可以看到每次运行的结果。
调试
1.运行测试用例
选中XCode的测试用例导航
1.运行一组测试用例:command+U
2.运行一个单独的测试用例:
2.新建测试用例
选中test的target,右键
3.断点调试
为测试用例添加失败断点来方便我们调试:
4.查看测试结果
1. 通过测试导航栏可以查看到测试结果:
2.通过Report导航栏可以看到更详细的测试结果:
点击测试用例后面的箭头,可以跳转到测试用例的代码。
代码覆盖率
1.选择 Target,然后选择 Test 模块,然后勾选 Gather coverage data
2.在 report模块中就能看到每一个 .m文件 的代码覆盖情况
结语
俗话说,一屋不扫,何以扫天下。开发中,我们自己的代码都不能保证功能的正确性,那么还有什么效率可言呢?做再多的任务,写再多的代码也只不过是在搭鸡窝,做着机器一样的重复的工作。IT界有一个原则,DRY原则 —— Don't Repeat Yourself !只有通过对自己的工作不断的检查,不断的测试,才能不断的突破,不断的脱颖而出,当然,你才能不断的提高。