`
janedoneway
  • 浏览: 581909 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

XCode下的iOS单元测试

 
阅读更多

From: http://mobile.51cto.com/iphone-337270.htm

XCode 内置了 OCUnit 单元测试框架,但目前最好用的测试框架应该是 GHUnit。通过 GHUnit + OCMock 组合,我们可以在 iOS 下进行较强大的单元测试功能。本文将演示如何在 XCode 4.2 下使用 OCUnit, GHUnit 和 OCMock 进行单元测试。

 

OCUnit

在 XCode 下新建一个 OCUnitProject 工程,选中 Include Unit Tests 选择框,

OCUnit 框架则会为我们自动添加 Unit Test 框架代码:

XCode 在 OCUnitProjectTests.m 中为我们自动生成了一个 Fail 的测试:

- (void)testExample
{
    STFail(@"Unit tests are not implemented yet in OCUnitProjectTests");
}

让我们来运行 Test,看看效果:

从图中的红色下划线部分可以看出,测试没有通过,符合预期。我们只要像类 OCUnitProjectTests 一样编写继承自 SenTestCase 类的子类,在其中添加形式如:- (void) testXXX(); 的测试函数既可,注意必须是一个无参无返回类型且名称是以 test 为前缀的函数。

OCUnit 的有点是官方支持,于 XCode 集成的比较好。

GHUnit

GHUnit 是一个开源的单元测试框架,具有可视化界面,功能亦相当强大。Mark 写了一篇 OCUnit vs GHUnit 的文章,有兴趣的童鞋可以看一看。OCMock 是由 Mulle Kybernetik 为 OS X 和 iOS 平台编写的遵循 mock object 理念的单元测试框架。

下面来介绍如何配置 GHUnit 和 OCMock

1,首先,创建一个名为 GHUnitProject 的单视图应用程序,注意:不要选中 Include Unit Tests 选择框。然后运行,应该出现白屏。

2,添加新的 test target,选中左边的工程名,点击右侧的 Add Target,新增一个名为 Tests 的 Empty Application 应用程序,让其附属于 GHUnitProject注意:不要选中 Include Unit Tests 选择框。

3,向 Tests 工程中(注意是 Tests 工程)添加 GHUnitIOS Framework。首先下载与 XCode 版本对应的 GHUnitIOS Framework。英文好的可以直接查看官方 iOS 版的安装文档:点此查看,跳过此第 3 节;否则请接着看。

3.1,解压 GHUnitIOS 框架到 GHUnitProject 下,让 GHUnitIOS.framework 与 Tests 在同一目录下。

3.2,回到 XCode,右击工程中的 Frameworks group,选中 Add Files to...菜单,选取 GHUnitIOS.framework ,注意 targets 要选择 Tests。

3.3,设置 Tests 的 Build Settings:在 Other Linker Flags 中增加两个 flag: -ObjC 和 -all_load。


3.4,删除 Tests 工程中的 UTSAppDelegate.h 和  UTSAppDelegate.m 两个文件;

3.5,修改 Tests 工程中的 main.m 为:

#import <UIKit/UIKit.h>
#import <GHUnitIOS/GHUnitIOSAppDelegate.h>

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([GHUnitIOSAppDelegate class]));
    }
}

3.6,选择编译目标 Tests>iPhone 5.0 Simulator,编译运行,应该能得到如下效果。目前我们还没有编写任何实际测试,所以列表为空。

4,编写 GHUnit 测试。向 Tests 工程中添加名为 GHUnitSampleTest 的 Objective C class。其内容如下:
GHUnitSampleTest.h

#import <GHUnitIOS/GHUnit.h> 

@interface GHUnitSampleTest: GHTestCase
{
}

@end


GHUnitSampleTest.m

#import "GHUnitSampleTest.h"

@implementation GHUnitSampleTest

- (void)testStrings
{       
    NSString *string1 = @"a string";
    GHTestLog(@"I can log to the GHUnit test console: %@", string1);
    
    // Assert string1 is not NULL, with no custom error description
    GHAssertNotNULL(string1, nil);
    
    // Assert equal objects, add custom error description
    NSString *string2 = @"a string";
    GHAssertEqualObjects(string1, string2, @"A custom error message. string1 should be equal to: %@.", string2);
}

@end

然后编译运行,点击 Run,效果如下:

图中的 All 栏显示所以的测试,Failed 栏显示没有通过的测试。强大吧,GHUnit。你可以向 GHUnitSampleTest 添加新的测试,比如:

- (void)testSimpleFail
{
    GHAssertTrue(NO, nil);
}

我们可以向 Tests 添加更多测试类,只要该类是继承自 GHTestCase,且其中的测试方法都是无参无返回值且方法名字是以 test 为前缀即可。

OCMock

下面我们来添加 OCMock。

1,我们只能以静态库的方式来添加 OCMock。在 GHUnitTest 目录下新建 Libraries 目录,该目录是与 Tests 目录平级的。下载静态库文件,解压头文件至该目录下。
文件下载:头文件 libOCMock.a ,framework 文件:OCMock framework ,打开下载好的 ocmock-1.77.dmg,拷贝其中的‘Release/Library/Headers/OCMock’ 目录至 Libraries 下。最终目录结构如下:

2,在 GHUnitTest 工程中新建名为 Libraries 的 group,导入libOCMock.a 和目录 OCMock,注意 target 是 Tests。

3,设置 Tests 的 Build Setting。让 Libray Search Paths 包含 $(SRCROOT)/Libraries:

在 Header Search Paths 中增加 $(SRCROOT)/Libraries,并选中 Recursive 选择框。

4,编写 OCMock 测试。向 Tests 工程中添加名为 OCMockSampleTest 的 Objective C class。其内容如下:
OCMockSampleTest.h

#import <GHUnitIOS/GHUnit.h>

@interface OCMockSampleTest : GHTestCase

@end

OCMockSampleTest.m

#import "OCMockSampleTest.h"
#import <OCMock/OCMock.h>

@implementation OCMockSampleTest

// simple test to ensure building, linking, 
// and running test case works in the project
- (void)testOCMockPass
{
    id mock = [OCMockObject mockForClass:NSString.class];
    [[[mock stub] andReturn:@"mocktest"] lowercaseString];
    
    NSString *returnValue = [mock lowercaseString];
    GHAssertEqualObjects(@"mocktest", returnValue, 
                         @"Should have returned the expected string.");
}

- (void)testOCMockFail
{
    id mock = [OCMockObject mockForClass:NSString.class];
    [[[mock stub] andReturn:@"mocktest"] lowercaseString];
    
    NSString *returnValue = [mock lowercaseString];
    GHAssertEqualObjects(@"thisIsTheWrongValueToCheck", 
                         returnValue, @"Should have returned the expected string.");
}

@end

编译运行,点击 Run,效果如下图。

至此,iOS 下的OCUnit,GHUnit,OCMock 单元测试介绍就到此结束了。当然还有其他一些测试框架,比如 google 出品的 GTM

原文地址:http://www.cnblogs.com/kesalin/archive/2011/12/23/cocoa_ocunit_ocmock.html

分享到:
评论

相关推荐

    iOS单元测试大礼包

    1. iOS单元测试基础:介绍XCTest框架,讲解如何创建测试目标和测试用例,以及如何在Xcode中运行和调试测试。 2. 进阶测试技巧:讲解如何进行模拟对象(mock objects)、依赖注入和隔离测试,以及如何使用XCTestCase...

    iOS单元测试实例

    "iOS单元测试实例"提供了关于如何在iOS应用中实现和利用单元测试的实践案例。在这个实例中,我们将探讨`iOS_Calc`和`Calculator-iOS`两个项目,它们可能是模拟一个简单计算器的应用,用于演示单元测试的基本概念和...

    xCode 单元测试指南

    ### xCode 单元测试指南知识点详解 #### 一、简介 单元测试是软件开发过程中不可或缺的一部分,尤其是在iOS开发中。Xcode自2.1版本起就开始支持多种开源的单元测试框架,这些框架被整合进Xcode Tools中,并随Xcode...

    iOS 13.6 xcode 真机包iOS 13.6 xcode 真机包

    11. **Unit Testing 和 UI Testing**:Xcode内置了测试工具,用于编写单元测试验证代码逻辑和UI测试验证用户交互。 12. **App Store Connect**:发布应用到App Store的平台,包括提交审核、查看销售报告、管理应用...

    iOS单元测试最佳实践

    ### iOS单元测试最佳实践 #### 一、iOS单元测试的重要性及意义 在软件开发过程中,单元测试是确保代码质量、提高开发效率的关键环节之一。对于iOS应用开发而言,良好的单元测试不仅能帮助开发者发现并修复潜在的...

    xcode单元测试中文版

    本资源提供了Xcode单元测试的中文版教程,对于想要提升Xcode使用技能和工作效率的开发者来说,这是一个宝贵的参考资料。 单元测试是对软件中最小可测试单元进行检查和验证的过程,通常这些单元是函数、方法或类。在...

    xcode device support iOS 13.1(DeviceSupport)

    进行充分的单元测试和适配性测试是确保应用稳定性和兼容性的关键步骤。 总的来说,"Xcode Device Support iOS 13.1(DeviceSupport)"是开发者为了在低版本Xcode中运行和测试高版本iOS应用而采取的一种技术手段。...

    Xcode单元测试(Xcode Unit Testing)

    在iOS和macOS应用开发中,Apple提供了Xcode工具,内置了强大的单元测试框架,如OCUnit,使得开发者可以方便地对应用程序进行测试。以下是对Xcode单元测试的详细讲解。 **1. 单元测试基础** 单元测试是一种软件验证...

    Xcode测试用例

    本文档针对Xcode 4.2版本、iOS SDK 5.0以及Mac OS X SDK 10.7环境下的单元测试设置进行了说明。为了确保测试能够在这些环境中顺利进行,需要对开发环境进行相应的配置。 ##### 3.2 单元测试工程设置 - **创建单元...

    iOS单元测试

    "iOS单元测试"主要关注的是对应用程序中的各个独立组件,如函数、方法或类进行测试,以验证它们按照预期工作。单元测试可以帮助开发者在早期发现并修复问题,避免在集成阶段出现难以追踪的错误。 GHUnit是专门为iOS...

    iOS测试指南完整版

    在iOS开发中,可以使用XCTest框架来编写和运行单元测试用例,确保每个模块在不同的输入和条件下都能正确运行。 接口测试:iOS应用经常需要与网络服务进行通信,接口测试用于验证应用与服务器之间数据交换的正确性。...

    iOS测试指南PDF

    这份PDF文档详细涵盖了iOS应用开发中的各种测试环节,包括单元测试、功能测试、性能测试、兼容性测试以及自动化测试等关键领域。 一、单元测试 单元测试是iOS应用开发中的基础测试,主要针对应用程序中的最小可测试...

    软件测试-iOS自动化单元测试示例.zip

    在iOS开发中,我们可以使用Xcode自带的 XCTest 框架来进行单元测试。 1. **XCTest框架**:苹果为iOS和macOS提供了内置的XCTest框架,用于编写和执行单元测试。每个测试用例都继承自`XCTestCase`类,你可以在这个类...

    Xcode Server 实现 iOS 移动应用的自动化测试与持续集成

    XCTest是Xcode内置的测试框架,基于OCUnit开发,支持单元测试、界面测试等。开发者可以在Xcode中创建测试用例,通过UIAutomation或者Xcode Server来执行异步测试,如对blocks的操作进行异步测试,同时也可以通过...

Global site tag (gtag.js) - Google Analytics