iOS单元测试详解

37次阅读

共计 2732 个字符,预计需要花费 7 分钟才能阅读完成。

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

前言

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

什么是单元测试

(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

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!只有通过对自己的工作不断的检查,不断的测试,才能不断的突破,不断的脱颖而出,当然,你才能不断的提高。

正文完
 0