ios测试框架的理解

来源:互联网 发布:pl sql developer查询 编辑:程序博客网 时间:2024/06/05 13:24

关于ios的测试

Cedar 、Specta 、Kiwi  、  XCTest
Specta和Kiwi的区别就是Kiwi包含了Specta和OCmock以及Expeata所有的功能

测试框架的作用:
由于行业中的干进度,所以我们一般都是不用TDD来测试,而是用BDD来测试。
BDD是用来测试的“数据存取”的重要环节。

“术语” 理解:
BDD(Behavior Driven Development),也就是行为驱动开发,它旨在解决具体问题,帮助开发人员确定应该测试些什么。
TDD(Test-Driven Development),就是测试驱动开发,通过测试来推动整个开发的进行。

gihub上面的框架:
oc 语言上面的测试框架:
wiki   https://github.com/kiwi-bdd/Kiwi/wiki
specta https://github.com/specta/specta
Cedar  https://github.com/pivotal/cedar
XCTest 与xcode高度集成

swift语言的测试框架
https://github.com/railsware/Sleipnir
https://github.com/Quick/Quick


RAC  :IOS响应式编程框架ReactiveCocoa(RAC)使用示例

XCTest的解释:  ——> 简单  ,只需要创建一个类,使用 “test” 作为测试方法名的前缀即可。
XCTest与Xcode深度集成,而且可以享受Apple后续对XCTest升级的福利。
上面可以看出XCTest只是一个非常简单使用,所以功能也是比较简单的,所以只是能够用于中、小的项目当中。

“大”的工程,——> Kiwi 或者 Specta
区别:
Kiwi包含了Specta和OCmock以及Expeata所有的功能。
Specta就是没有mock和验证功能Kiwi。
他们是不可以同时是使用的,但是它们可以各自和XCTest混合使用。——> 原因:他们是对XCTest进行封装的。

上面的oc中的三大用来测试的框架各有利弊:
选择Kiwi是因为只需要在podfile导入一个Kiwi就行了,
Specta则需要依赖别的第三方库,灵活,但是因为灵活而复杂。
使用Specta,还要引入OCmock/OCMockito以及Expeata/OCHamcrest一起配合使用。

OCMock Or OCMockito
这两个都是用来mock对象,Stub方法的,区别在于使用OCMock的库比OCMockito的库多,而且文档和教程更加丰富。
/*
mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。
mock对象,这个虚拟的对象就是mock对象。mock对象就是真实对象在调试期间的代替品。
*/

Expecta Or OCHamcrest
都是断言的扩展框架,Expecta不成熟,框架还有一些的问题。
OCHamcrest更加成熟,而且可扩展性高,可以自定义自己的断言,更灵活。

specta框架的总结:在用specta的时候,一般都会再引入OCMock 和OCHamcrest 这两个一起使用。

BDD的理念: 不是写代码,而是讲故事。
整个故事是由Given…When…Then组成。
eg:BDD框架Kiwi的一段测试代码:
describe(@"Team", ^{
    context(@"when newly created", ^{
        it(@"has a name", ^{
            id team = [Team team]; [[team.name should] equal:@"Black Hawks"];
         });
        it(@"has 11 players", ^{
            id team = [Team team]; [[[team should] have:11] players];
         });
    });
});

这个测试用例就是在说Given a Team,When newly created,it should have a name, and should have 11 players,基本上不需要注释就能知道在干嘛。

3、我们应该测试什么?
BDD:我们应该关注的是“行为” Behaviour而不是测试。
eg:例如你设计的一个对象,它有一个接口定义了其方法和依赖关系。这些方法和依赖,声明了你对象的约定,它们定义了如何与应用的其他部分交互,以及它的功能是什么。它们定义了对象的行为。同时这也应该是你的目标:测试你对象的行为方式。

不应该测试什么呢?
不要测试私有方法:
(私有方法意味着私有,如果你感到有必要测试一个私有方法,那么那个私有方法一定含有概念性错误,通常是作为私有方法,它做的太多了, 从而违背了单一职责原则)。
不要 Stub 私有方法:Stub 私有方法和测试私有方法具有相同的危害,更重要的是,Stub 私有方法将会使程序难以调试。通常来说,用于Stub的库会依赖于一些不寻常的技巧来完成工作,这使得发现一个测试为什么会失败变的困难。
不要测试构造函数:构造函数定义的是实现细节,你不应该测试构造函数,这是因为我们认同测试应该与实现细节解耦这一观点。
不要 Stub 外部库:第三方代码不应该在你的测试中直接出现。

4.测试的目的
使重构更简单 —— 你可以自信的修改实现细节,而不用去触及公有 API。
避免代码恶化—— 恶化在什么时候发生?在你修改代码的时候。
提供了可执行的说明和文档 —— 你在什么时候更想知道软件实际上是如何工作的?在你想修改它们的时候。
减少了创建软件的时间 —— 怎么减少时间的?是通过更快速地修改你的代码,出错时测试会自信地告诉你哪里出错了。
降低了创建软件的代价 —— 时间就是金钱,朋友。

测试应该:
很快速(Fast) —— 测试应该能够被经常执行。
能隔离(Isolated) —— 测试本身不能依赖于外部因素或者其他测试的结果。
可重复(Repeatable) —— 每次运行测试都应该产生相同的结果。
带自检(Self-verifying) —— 测试应该包括断言,不需要人为干预。
够及时(Timely) —— 测试应该和生产代码一同书写。

5.UI测试

关于UI测试,需要测试的是用户的交互,而不是应用的外观,Xcode7中新增了UI Testing,具体可以看wwdc 2015 session :406_hd_ui_testing_in_xcode。


参考链接:
http://www.cocoachina.com/ios/20150731/12859.html


0 0