iOS-单元测试详解

图片描述

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

前言

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

什么是单元测试

(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

clipboard.png

XCTestCase类结构

clipboard.png

- (void)setUp:

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

- (void)tearDown

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

- (void)testPerformanceExample

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

- (void)testExample

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

断言

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

无条件报错

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

clipboard.png

等价测试

1.XCTAssertEqualObjects

clipboard.png

2.XCTAssertNotEqualObjects

clipboard.png

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

4.XCTAssertNotEqual

clipboard.png

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

6.XCTAssertNotEqualWithAccuracy

clipboard.png

Nil(空)测试

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

clipboard.png

Boolean测试

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

clipboard.png

异常断言测试

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

clipboard.png

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

clipboard.png

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

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

clipboard.png

如何写单元测试

找到测试场景

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

准备测试数据

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

验证结果

使用断言验证

单元测试的规范

1.合理命名测试用例

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

需要被测试的方法
clipboard.png

相应的测试方法
clipboard.png

clipboard.png

clipboard.png

clipboard.png

clipboard.png

2.保持测试的独立性

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

4.只测公有接口

逻辑测试

clipboard.png

异步测试

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

clipboard.png

性能测试

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

clipboard.png

Performance Result(性能测试结果)

clipboard.png

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

调试

1.运行测试用例

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

clipboard.png

2.新建测试用例

选中test的target,右键

clipboard.png

3.断点调试

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

clipboard.png

4.查看测试结果

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

clipboard.png

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

clipboard.png
点击测试用例后面的箭头,可以跳转到测试用例的代码。

代码覆盖率

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

clipboard.png

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

clipboard.png

结语

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

clipboard.png

你可能感兴趣的:(iOS-单元测试详解)