iOS-单元测试详解

iOS-单元测试详解_第1张图片

似此星辰非昨夜
为谁风露立中宵

前言

我们在做组件化的过程中,肯定需要做的一步就是拆组件,把我们项目中的各个模块拆分为基础组件、功能组件、业务组件,但是在拆分的过程中很容易就会出现问题,所以我们在做组件化的过程中把每个组件都加上了单元测试,这样可以大大提高了我们组件的健壮性,随着我们的组件完成告一段落,今天就把当初探索学习单元测试的经验分享给大家,每种断言、每种测试场景都对应的有例子,希望能对你能有帮助

什么是单元测试

(Unit Testing)又称为模块测试, 是针对程序模块的最小单位来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。

单元测试的发展

 1.Xcode在XCode4.x时代集成的是OCUnit
 2.XCode5.x时代就升级为了XCTest
 3.XCode7增加UI测试

单元测试框架

  1. XCTest(苹果自带,推荐)
  2. Kiwi
  3. GHUint
  4. OCMock

单元测试带来的好处

  1. 测试做了我们期望它做的事情
  2. 尽早的发现程序的 bug 和不足
  3. 保证在加入新功能或修改旧功能时代码的正确性

缺点:

没有足够的时间编写单元测试,或者说大家都没有写单元测试的习惯

XCTest

XCTest是Xcode自带的一个测试框架,苹果官方推荐我们使用

XCTestCase

XCTest中的测试类都是继承自XCTestCase

iOS-单元测试详解_第2张图片

XCTestCase类结构

iOS-单元测试详解_第3张图片

- (void)setUp:

在调用类中的每个测试方法之前调用此方法。 

- (void)tearDown

这个方法在类中的每个测试方法调用之后调用

- (void)testPerformanceExample

将要度量时间的代码放在这里

- (void)testExample

使用XCTAssert和相关函数验证测试结果是否正确

断言

无条件报错
等价测试
nil测试
布尔测试
异常测试

无条件报错

1.XCTFail.生成一个无条件报错。

iOS-单元测试详解_第4张图片

等价测试

1.XCTAssertEqualObjects

iOS-单元测试详解_第5张图片

2.XCTAssertNotEqualObjects

iOS-单元测试详解_第6张图片

3.XCTAssertEqual. 当expression1不等于expression2时报错,这个测试用于C语言的常量

4.XCTAssertNotEqual

iOS-单元测试详解_第7张图片

5.XCTAssertEqualWithAccuracy. 当expression1和expression2之间的差别高于accuracy 将报错。这种测试适用于floats和doubles这些常量,两者之间的细微差异导致它们不完全相等,但是对所有的常量都有效。

6.XCTAssertNotEqualWithAccuracy

iOS-单元测试详解_第8张图片

Nil(空)测试

1.XCTAssertNil. 当expression参数非nil时报错
2.XCTAssertNotNil

iOS-单元测试详解_第9张图片

Boolean测试

1.XCTAssertTrue. 当expression计算结果为false时报错。
2.XCTAssertFalse. 当expression计算结果为true报错。
3.XCTAssert. 当expression计算结果为false时报错,与XCTAssertTrue同义。

iOS-单元测试详解_第10张图片

异常断言测试

1.XCTAssertThrows.当expression不抛出异常时报错。
2.XCTAssertNoThrow. 当expression抛出异常时报错。

iOS-单元测试详解_第11张图片

3.XCTAssertThrowsSpecific.当expression针对指定类不抛出异常时报错。
4.XCTAssertNoThrowSpecific. 当expression针对指定类抛出异常时报错。任意其他异常都可以;也就是说它不会报错。

iOS-单元测试详解_第12张图片

5.XCTAssertThrowsSpecificNamed. 当expression针对特定类和特定名字不抛出异常时报错。对于AppKit框架或Foundation框架非常有用,抛出带有特定名字的NSException(NSInvalidArgumentException等)。

6.XCTAssertNoThrowSpecificNamed. 当expression针对特定类和特定名字抛出异常时报错。对于AppKit框架或Foundation框架非常有用,抛出带有特定名字的NSException(NSInvalidArgumentException等)

iOS-单元测试详解_第13张图片

如何写单元测试

找到测试场景

逻辑测试
异步测试
性能测试

准备测试数据

边界测试数据
正确测试数据
错误测试数据

验证结果

使用断言验证

单元测试的规范

1.合理命名测试用例

1.一个测试方法只测试被测类的一个明确功能, 并命名相应测试方法

需要被测试的方法
iOS-单元测试详解_第14张图片

相应的测试方法
clipboard.png

clipboard.png

clipboard.png

clipboard.png

clipboard.png

2.保持测试的独立性

3.把测试维持在单元级别

4.只测公有接口

逻辑测试

iOS-单元测试详解_第15张图片

异步测试

1.定义一个XCTestExpectation,表示异步测试想要的结果。
2.设置timeout,表示异步测试最多可以执行的时间。
3.异步的代码完成后,调用fullfill来通知异步测试满足条件

iOS-单元测试详解_第16张图片

性能测试

1.评估一段代码的运行时间,XCTest的性能的测试如下格式

iOS-单元测试详解_第17张图片

Performance Result(性能测试结果)

iOS-单元测试详解_第18张图片

Metric:时间作为性能的指标
Average:表示平均时间
Baseline:表示你设置一个基线
Result:是指平均时间和你是设置的基线进行比较后得出的结果,百分比表示的
max STDDEV :表示标准偏差 10%。
点击Edit,我们可以设置Baseline,ax STDDEV ,来设置觉得满意的性能测试条件
底部点击1,2…10可以看到每次运行的结果。

调试

1.运行测试用例

选中XCode的测试用例导航
1.运行一组测试用例:command+U
2.运行一个单独的测试用例:

iOS-单元测试详解_第19张图片

2.新建测试用例

选中test的target,右键

iOS-单元测试详解_第20张图片

3.断点调试

为测试用例添加失败断点来方便我们调试:

iOS-单元测试详解_第21张图片

4.查看测试结果

1. 通过测试导航栏可以查看到测试结果:

iOS-单元测试详解_第22张图片

2.通过Report导航栏可以看到更详细的测试结果:

iOS-单元测试详解_第23张图片
点击测试用例后面的箭头,可以跳转到测试用例的代码。

代码覆盖率

1.选择 Target,然后选择 Test 模块,然后勾选 Gather coverage data

iOS-单元测试详解_第24张图片

2.在 report模块中就能看到每一个 .m文件 的代码覆盖情况

iOS-单元测试详解_第25张图片

结语

俗话说,一屋不扫,何以扫天下。开发中,我们自己的代码都不能保证功能的正确性,那么还有什么效率可言呢?做再多的任务,写再多的代码也只不过是在搭鸡窝,做着机器一样的重复的工作。IT界有一个原则,DRY原则 —— Don't Repeat Yourself !只有通过对自己的工作不断的检查,不断的测试,才能不断的突破,不断的脱颖而出,当然,你才能不断的提高。

clipboard.png

你可能感兴趣的:(单元测试,objective-c,ios)