代码之家  ›  专栏  ›  技术社区  ›  Elise van Looij

Xcode 3.1.3问题单元测试插件

  •  3
  • Elise van Looij  · 技术社区  · 15 年前

    关注chris hanson和苹果的博客 Automated Unit Testing with Xcode 3 and Objective-C 我已经开始为我的项目实现单元测试。但是,我使用了很多插件(可加载的捆绑包),而且我还不知道如何测试它们。
    我想我会使用chris hanson描述的方法来测试框架。 我从一个cocoa包项目开始,添加了一个主体类,并将类型更改为plugin。
    然后我添加了单元测试包,将插件添加为直接依赖项(apple的说明),并设置了以下构建设置:

    捆绑加载程序:$(build_products_dir)/cocoaplugin.plugin/contents/macos/cocoaplugin
    测试主机:$(bundle_loader)

    问题是,一旦我完成了这项工作并构建了测试目标,我就会收到以下消息:

    错误:测试主机'/users/elisevanlooij/documents/plug ins/cocoalplugin/build/debugcocoalplugin.plugin/contents/macos/cocoalplugin'异常退出,代码127(可能已崩溃)。[另一个插件中的代码126]

    我曾希望添加otest自定义可执行文件会有帮助,但不幸的是没有。我真的希望有人能帮助,因为无法测试我的插件真的在我的测试生活中造成了痉挛。

    2 回复  |  直到 15 年前
        1
  •  2
  •   cdespinosa Martin Cote    15 年前

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

    您需要让您的单元测试包在没有错误(和警告)的情况下生成。,您的测试将自动运行(您至少有一个有效的sentestcase类,至少有一个有效的测试方法,对吧?).

    所以, 你是说你的测试包编译时没有任何警告,而且你已经用你插件中的类和方法编写了一些测试?如果是这样的话,那么你必须考虑如何将插件包加载到单元测试包中并定义某种api,因为插件包没有任何公共头,对吧?

    see Apple docs here

    将插件加载到插件中(本质上就是你要做的)并不容易,而且它们在编译时也不像chris hanson博客中提到的框架那样神奇地“链接”。如果是的话,它们就不是插件了。

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

    但是,如果这不令人满意,你可以得到你正在努力做的事情,只要有一点努力,你一定要添加测试来验证你的插件是加载的,并且你认为可用的符号是可用的。一旦你的测试建立好了,你应该关注chris hanson的另一个优秀的博客 debugging unit test bundles 演示如何在调试器中逐步完成测试-您应该能够跟踪任何错误。

        2
  •  1
  •   mfazekas    15 年前
    1. 你的

      捆绑加载程序:$(build_products_dir)/cocoaplugin.plugin/contents/macos/cocoaplugin

      是正确的。意思是当 链接您的测试包时,不包括测试中的类,它们将 从cocoaplugin中查找。这是一个编译时设置,应该会导致您的测试 捆绑以成功编译/链接。(请参阅-bundle_loader in man ld )

    2. 你的

      测试主机:$(bundle_loader)

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

      • 不要设置测试主机,并从测试包加载插件。例如,您可以使用。

      • 创建将加载插件的虚拟测试主机应用程序,然后调用nsapplicationmain,并将此应用程序用作测试主机。

    这个 +initalize 加载插件的测试包的方法如下所示:

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

    您的DimyMyTestEngestPapp中的主要方法可以是这样的:

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

    测试插件的其他想法:

    • 使用独立的bundle:不要指定bundle_loader或test_host,也不要将插件中的类放入unittest bundle。
    • 把你的测试用例放到插件中,试着得到unittest。只是 weak link 将SentestingKit添加到插件中,并添加一个脚本阶段: TEST_RIG=/Developer/Tools/otest "${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests" .