领导给的需求是:
关于单元测试的任务反馈:
http://www.jianshu.com/p/d15a7dea0c5a?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io
这个我们能用不?有什么用
我将就三个方面回答上面的问题。
1.首先我们来关注下单元测试有什么用?
2.我们的项目能用不?如何用
3.单元测试的一些相关知识
1.首先我们来关注下单元测试有什么用?
首先什么是单元测试,维基百科上的解释是:
在计算机编程中,单元测试(又称为模块测试, Unit Testing)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。
通常来说,程序员每修改一次程序就会进行最少一次单元测试,在编写程序的过程中前后很可能要进行多次单元测试,以证实程序达到软件规格书(en:Specification)要求的工作目标,没有程序错误;虽然单元测试不是什么必须的,但也不坏,这牵涉到项目管理的政策决定。
由于我们OC程序员写的通常都是面向对象的程序,所以我们在进行单元测试时,通常都是以一个方法为单位测试,目的当然是保证其不会出错了。按照Objc.io文章的观点,如果我们代码之间的耦合度很小,那么可以将其分解成多个小部件,从而更易于测试。
2.我们的项目能用不?如何用
简单的讲 其实单元测试功能就是测试某一块代码段有没有问题,而具体的测试就是执行某一个类的代码,得出一个结果,使用断言的方式展示给你。你不必每次运行起来看看效果, 所以你仅仅使用Comman+U 代替Command + R 就可以测试你自定义的代码就行了,就是直接跑那些你抽取出来的代码就行了。
我们的项目能不能用,答案是肯定的,按照领导给的链接操作是可以正常添加单元测试的,我们测试的时候可能只是一个方法一个方法的去测试,这就必须接口文件和实现文件有良好的代码风格,最主要的是上面的红色的文字。
3.单元测试的一些相关知识
首先单元测试的框架有几个链接如下:http://www.uml.org.cn/mobiledev/201201093.asp。
也可以看看这篇文章http://www.cocoachina.com/industry/20130724/6667.html
OCUnit
OCUnit是XCode 4.x集成的单元测试框架,OCUnit中的测试分为两类,一类称为Logic Tests,另一类称为Application Tests。Logic Tests更倾向于所谓的白盒测试,用于测试工程中较细节的逻辑;Application Tests更倾向于黑盒测试,或接口测试,用于测试直接与用户交互的接口。
• 创建测试用例
OCUnit的测试用例最常用的方法有三个
1. - (void)setUp:每个test方法执行前调用
2. - (void)tearDown:每个test方法执行后调用
3. - (void)testXXX:命名为XXX的测试方法
GHUnit
GHUnit是一款Objective-C的测试框架,除了支持iOS工程还支持OSX的工程,但OSX不在本文的讨论范围。GHUnit不同于OCUnit,它提供了GUI界面来操作测试用例,而且也不区分Logic Tests和Application Tests。
当你创建项目或者对象(target)时,Xcode会在构建应用程序的scheme中包含一个单元测试对象。对象的实现文件包含setUp、tearDown以及testExample方法的存根。完成这些存根实现,并根据需要为执行应用程序上的单元测试添加其他代码。通过选择Product > Test来运行所有测试。点击测试导航器图标来查看状态和测试结果。点击测试导航栏右下角的按钮(+)为项目添加测试对象(或者为测试添加类)。想要查看特定测试的源码,请在测试列表中选中,源码编辑器将会打开相应的文件。
会简单的操作以后, 我们了解下相关的断言
下面一共18个断言(SDK中也是18个,其含义转自ios UnitTest 学习笔记,真心佩服原文的博主,部分宏小弟已经测试过):
XCTFail(format…) 生成一个失败的测试;
XCTAssertNil(a1, format...)为空判断,a1为空时通过,反之不通过;
XCTAssertNotNil(a1, format…)不为空判断,a1不为空时通过,反之不通过;
XCTAssert(expression, format...)当expression求值为TRUE时通过;
XCTAssertTrue(expression, format...)当expression求值为TRUE时通过;
XCTAssertFalse(expression, format...)当expression求值为False时通过;
XCTAssertEqualObjects(a1, a2, format...)判断相等,[a1 isEqual:a2]值为TRUE时通过,其中一个不为空时,不通过;
XCTAssertNotEqualObjects(a1, a2, format...)判断不等,[a1 isEqual:a2]值为False时通过;
XCTAssertEqual(a1, a2, format...)判断相等(当a1和a2是 C语言标量、结构体或联合体时使用,实际测试发现NSString也可以);
XCTAssertNotEqual(a1, a2, format...)判断不等(当a1和a2是 C语言标量、结构体或联合体时使用);
XCTAssertEqualWithAccuracy(a1, a2, accuracy, format...)判断相等,(double或float类型)提供一个误差范围,当在误差范围(+/-accuracy)以内相等时通过测试;
XCTAssertNotEqualWithAccuracy(a1, a2, accuracy, format...) 判断不等,(double或float类型)提供一个误差范围,当在误差范围以内不等时通过测试;
XCTAssertThrows(expression, format...)异常测试,当expression发生异常时通过;反之不通过;(很变态) XCTAssertThrowsSpecific(expression, specificException, format...) 异常测试,当expression发生specificException异常时通过;反之发生其他异常或不发生异常均不通过;
XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format...)异常测试,当expression发生具体异常、具体异常名称的异常时通过测试,反之不通过;
XCTAssertNoThrow(expression, format…)异常测试,当expression没有发生异常时通过测试;
XCTAssertNoThrowSpecific(expression, specificException, format...)异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过;
XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format...)异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过
特别注意下XCTAssertEqualObjects和XCTAssertEqual。
XCTAssertEqualObjects(a1, a2, format...)的判断条件是[a1 isEqual:a2]是否返回一个YES。
XCTAssertEqual(a1, a2, format...)的判断条件是a1 == a2是否返回一个YES。
最后看一下官方的一个计算器的Demo吧 ,看了基本上明白个大概了
https://developer.apple.com/library/prerelease/mac/samplecode/UnitTests/Introduction/Intro.html
忽略里面的mac程序, 跑iOS程序就行了
感觉这个计算器主要是功能上的测试,单元测试即是模块测试, 我们应用程序接入的可能感觉不大。
因为平时断点就够用的了, 这只是我的片面之理解。可能理解的不到位。
最后有个问题,单元测试局限么? 比如某一个功能是否真的都可以用单元测试去测试?单元测试进阶改如何?
请高手回答帮助, 给个链接啥的也行, 多谢。
网友评论