iOS 测试驱动开发

测试驱动开发是敏捷开发的一部分,它一般有“red-green- refactor”步骤

iOS测试驱动开发的工具

一、 OCUnit 是Xcode自带的测试工具

其使用步骤分为

1 建立测试的Target

对于测试的Target可分为两种:logic test 和application test ,其中逻辑测试可独立执行,应用测试需要启动App。

对于应用测试需要Builder Setting配置好Bundle Loader 和Test Host的值,以便改Target可以用到。

 

Set the value of the Bundle Loader build setting to:

2 编写unit test case

OCUnit的test case都继承自抽象类SenTestCase,所以在编写自己的测试类时,

1 从SenTestCase继承

2 在setUp方法中完成完成测试环境的建立,一般时创建初始化被测试类的实例(在每个test函数执行钱,会被调用)

若要对于同一测试类中不同的测试函数,需要setUp不同的环境,可以考虑使用setUpTestWithSelector:(SEL)testMethod;

3 编写自己的测试函数如:testMyExample(需以test为前缀),使用断言来声明期望的测试结果

常用的断言有

 

STAssertNil 断言对象为空

STAssertNotNil断言对象为为空

STAssertTrue 断言表达式为真

STAssertFalse断言表达式为假

STAssertEquals 断言两个变量值相等

STAssertEqualObjects断言两个对象相等

STAssertThrows 断言抛出异常

STAssertNoThrow 断言味抛出异常

更多断言可参看SenTestingKit/SenTestingUtilities.h文件

4 在tearDown完成测试环境的恢复(每个test函数执行完后,会被调用


3 运行单元测试

       command+U


具体的细节可参考官方文档

二、GHUnit 

测试框架,可视化测试结果显示

 



 

 

三、 测试驱动开发最重要的是,编写高质量的单元测试用例,按照MVC设计模式编写的代码,是有结构的,这个也可以应用到write unit test,对于Model层的test case,其一般结构如下

 

 

@class Topic;
@interface TopicTests : SenTestCase {
    Topic *topic;
}
@end


在TopicTests类中,创建初始化topic,并通过happy result和边界数值,来测试Topic类的行为

 


对于Controller层,一般较Model层复杂,会涉及到多个对象,要做的第一步便是孤立耦合,

对于异步网络类的测试,要借助不发送网络请求的Mock对象,


对于View层,单元测试覆盖较少,

 

四、测试覆盖率

对于Xcode4.0以上的同学,输出coverage 结果的设置如下:

在对应的Target下,进入Build Setting界面

设置Generate Test Coverage Files:YES

Instrument Program Flow :YES

这是进入/Users/<username>/Library/Developer/Xcode/DerivedData/<app_name-<Serial>>/Build/Intermediates/<app_name>.build/Debug-iphonesimulator/<target_name>.build/Objects-normal/i386

会发下该文件夹下有.gcda和.gcno文件,这时候便是Xcode的LLVM输出了测试结果,下载一个CoverStory ,打开相应的文件变可看到

iOS 测试驱动开发_第1张图片






 

你可能感兴趣的:(ios)