iOS-单元测试详解

《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

《iOS-单元测试详解》

XCTestCase类结构

《iOS-单元测试详解》

– (void)setUp:

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

– (void)tearDown

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

– (void)testPerformanceExample

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

– (void)testExample

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

断言

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

无条件报错

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

《iOS-单元测试详解》

等价测试

1.XCTAssertEqualObjects

《iOS-单元测试详解》

2.XCTAssertNotEqualObjects

《iOS-单元测试详解》

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

4.XCTAssertNotEqual

《iOS-单元测试详解》

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

6.XCTAssertNotEqualWithAccuracy

《iOS-单元测试详解》

Nil(空)测试

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

《iOS-单元测试详解》

Boolean测试

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

《iOS-单元测试详解》

异常断言测试

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

《iOS-单元测试详解》

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

《iOS-单元测试详解》

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

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

《iOS-单元测试详解》

如何写单元测试

找到测试场景

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

准备测试数据

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

验证结果

使用断言验证

单元测试的规范

1.合理命名测试用例

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

需要被测试的方法
《iOS-单元测试详解》

相应的测试方法
《iOS-单元测试详解》

《iOS-单元测试详解》

《iOS-单元测试详解》

《iOS-单元测试详解》

《iOS-单元测试详解》

2.保持测试的独立性

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

4.只测公有接口

逻辑测试

《iOS-单元测试详解》

异步测试

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

《iOS-单元测试详解》

性能测试

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

《iOS-单元测试详解》

Performance Result(性能测试结果)

《iOS-单元测试详解》

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

调试

1.运行测试用例

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

《iOS-单元测试详解》

2.新建测试用例

选中test的target,右键

《iOS-单元测试详解》

3.断点调试

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

《iOS-单元测试详解》

4.查看测试结果

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

《iOS-单元测试详解》

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

《iOS-单元测试详解》
点击测试用例后面的箭头,可以跳转到测试用例的代码。

代码覆盖率

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

《iOS-单元测试详解》

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

《iOS-单元测试详解》

结语

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

《iOS-单元测试详解》

    原文作者:Jieyi
    原文地址: https://segmentfault.com/a/1190000019781509
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞