Xcode 3.1.3问题单元测试插件

时间:2009-10-23 09:59:01

标签: cocoa unit-testing xcode

继Chris Hanson的博客和Apple的Automated Unit Testing with Xcode 3 and Objective-C之后,我开始为我的项目实施单元测试。但是,我使用了很多插件(可加载的bundle),我无法弄清楚如何测试它们。
我想我会使用Chris Hanson描述的测试框架的方法。 我从一个Cocoa Bundle项目开始,添加了一个主要类并将类型更改为插件 然后我添加了单元测试包,添加插件作为直接依赖(Apple的说明)并设置以下构建设置:

Bundle Loader:$(BUILT_PRODUCTS_DIR)/CocoaPlugin.plugin/Contents/MacOS/CocoaPlugin
测试主持人:$(BUNDLE_LOADER)

问题在于,只要我完成并构建测试目标,我就会收到此消息:

  

错误:测试主机'/Users/elisevanlooij/Documents/Plug-ins/CocoaPlugin/build/DebugCocoaPlugin.plugin/Contents/MacOS/CocoaPlugin'异常退出代码127(它可能已崩溃)。 [另一个插件中的代码126]

我曾希望添加otest自定义可执行文件会有所帮助,但遗憾的是没有。我真的希望有人可以提供帮助,因为无法对我的插件进行单元测试,这确实会让我的测试生活方式陷入困境。

2 个答案:

答案 0 :(得分:2)

退后一步。您的Bundle Loader设置是错误的,添加自定义可执行文件不会影响单元测试包的编译。

你需要让你的单元测试包没有错误(和警告!),你的测试将自动运行(你至少有一个有效的SenTestCase类至少有一个有效的测试方法,对吧?)。

所以, 你是说你的测试包在没有警告的情况下编译而且你已经使用插件中的类和方法编写了一些测试?如果是这样的话,你必须要注意如何将插件包装入unit-test-bundle并定义某种API,因为插件包没有任何公共标题,对吧?

see Apple docs here

将插件加载到插件中(基本上就是你要做的事情)并不容易,并且它们在编译时并没有神奇地“链接”,就像您所引用的Chris Hanson博客中的框架一样。如果他们是插件,他们就不会是插件。

最简单的方法是根本不测试您的插件,而是将要测试的文件直接添加到单元测试包中。至少通过这种方式,您可以继续测试代码,而无需动态加载捆绑包。

但如果这不能令人满意,你可以通过一点努力得到你想要做的事情 - 你应该加上测试来验证你的插件是否已加载以及你认为可用的符号真的可用。一旦您的测试构建正常,您应该关注Chris Hanson在debugging unit test bundles上的其他优秀博客,向您展示如何通过调试器中的测试 - 您应该能够找到任何错误。

答案 1 :(得分:1)

  1. 您的

      

    Bundle Loader:$(BUILT_PRODUCTS_DIR)/CocoaPlugin.plugin/Contents/MacOS/CocoaPlugin

    是对的。这意味着什么时候 链接你的测试包你不包括那里的测试类,他们会 从CocoaPlugin中查找。这是一个编译时设置,应该导致您的测试 捆绑编译/链接sucesfully。 (参见man ld中的-bundle_loader)

  2. 您的

      

    测试主机:$(BUNDLE_LOADER)

    不正确。您的测试主机应该是应用程序(使用从main方法调用的NSApplicationMain)或未设置。此TEST_HOST设置是运行单元测试的运行时设置。你基本上有两个选择:

    • 不要设置TEST_HOST,并从测试包中加载插件。例如,您可以使用initlaize方法执行此操作。

    • 创建一个虚拟的test_host应用程序,它将加载您的插件,然后调用NSApplicationMain,并将此应用程序用作TEST_HOST。

  3. 您的测试包加载插件的+initalize方法如下所示:

    + (void)initialize
    {
        NSBundle* bundle = [NSBundle bundleWithPath:pathToPlugin];
        [bundle load];
        NSLog(@"Loaded:%@\n",bundle);
    }
    

    dummy_test主机应用中的主要方法如下所示:

    int main(int argc,const char** argv)
    {
      NSBundle* bundle = [NSBundle bundleWithPath:pathToPlugin];
      [bundle load];
      NSLog(@"Loaded:%@\n",bundle);
      return NSApplicationMain(argc,argv);
    }
    

    测试插件的其他想法:

    • 使用独立的包:不要指定BUNDLE_LOADER或TEST_HOST,并将插件中的类也放入unittest包中。
    • 将您的测试用例放入插件中,并尝试获得该单元测试。只需weak link SenTestingKit插件即可添加脚本阶段:TEST_RIG=/Developer/Tools/otest "${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests"