GHUnit单元测试

GHUnit

最近有朋友问我单元测试的问题,网上的资料可能许久没更新了,导致一直没能成功,这里就再记录一下。

GHUnit是一个开源的objective-c的unit test框架,有GUI的界面,直观、方便。 这里就用这个库进行测试。

Features

新建工程以及 Target

新建一个 Single View Application,注意不要勾选 Include Unit Tests 和 Include UI Tests,这里我命名为 GHUnitTest。

新增一个 target,可如下图点击 + 号,同样的选择 Single View Application,不要勾选 Include Unit Tests 和 Include UI Tests,这里我命名为 Test。

添加target

添加Framework

在 Test 中添加 GHUnitIOS.framework,下载地址,同时在 Link Binary With Libraries 中添加 CoreGraphics.framework、Foundation.framework 和 UIKit.framework。

删除多余文件

删除 Test 中的 AppDelegate 和 ViewController,同时把 Main.storyboard 和 LaunchScreen.storyboard也删除。

删除 Test 下 Info.plist 中的 Main storyboard file base name 和 Launch screen interface file base name 字段。

这时可以添加一张 Default@2x.png 的图片,避免上下黑边的问题。

设置主函数

在 Test 中的 main 函数里,将 delegete 的名字改为 @”GHUnitIOSAppDelegate”

配置工程文件

  1. 将 Build Active Architecture Only 设置为 NO
  2. 删除 Valid Architectures 中的 arm64。
  3. 在 Test 下的 Build Settings 下的 Linking 下,设置 Other LinkerFlags:

    -all_load-ObjC

  4. Framework Search Paths设置为GHUnitIOS.framework目录:

    $(SRCROOT)/Test/GHUnitIOS.framework

注:

-ObjC标志,这个flag告诉链接器把库中定义的Objective-C类和Category都加载进来。这样编译之后的app会变大(因为加载了其他的objc代码进来)。但是如果静态库中有类和category的话只有加入这个flag才行。

-all_load,这个flag是专门处理-ObjC的一个bug的。用了-ObjC以后,如果类库中只有category没有类的时候这些category还是加载不进来。变通方法就是加入-all_load或者-force-load。-all_load会强制链接器把目标文件都加载进来,即使没有objc代码。

-force_load在xcode3.2后可用。但是-force_load后面必须跟一个只想静态库的路径。

运行测试单元

运行该 Test ,这时模拟器会展示运行界面,如下图。说明配置成功。

GHUnit成功界面