2013-10-09 64 views
1

单元测试我的程序时出现问题。 问题很简单,但我不知道为什么这不起作用。Xcode C++使用全局变量进行单元测试

1 - >我建立我所有程序
2 - >我建立我单元测试
3 - >的测试正在运行。

当它不是从数据段获取全局数据时,一切正常。看起来好像该变量未被初始化/或者简单地被找到。所以当然,我所有的测试都是错误的。

我的问题是: 它是完全错误建立一个可执行文件,然后运行它的测试?或者我应该在同一时间编译我所有的代码+单元测试,然后运行它?还是只是缺乏SenTesting框架?

我忘了提及这是一个C++常量字符串。不知道是否改变了一些东西。

*编辑***

我的假设是错误的,但我还是不明白魔术超越!似乎一个C++魔术hoydi hoo?

char cstring[] = "***"; 
std::string cppString = "***"; 
NSString* nstring = @"***"; 

- (void)testSync{ 
    STAssertNotNil(nstring, nil); // fine 
    STAssertNotNil((id)strlen(bbb), nil); // fine 
    STAssertNotNil((id)cppString.size(), nil); // failed 
} 

编辑2 **

实际上这是正常的,在C++不是在这部分代码初始化。如果我在我的可执行文件上执行nm,看起来我的C和Obj-C全局都放入了dataSegment。我认为我的C++字符串是相同的情况下,但它实际上是放入BSS段。这意味着它是未初始化的。事实上,C++编译器做了一些超越,并且C++字符串在main()调用之后被初始化,并且像进入dataSegment一样进行操作。

我不知道testSuit没有main()调用,所以C++对象从不初始化。为了在testSuit之前调用.ctor,有一些技巧。但我也懒得解释,这是一种话题。我刚刚用一个简单的char数组替换了我的C++字符串,并且它的工作原理很完美,因为我的值现在是POD。

顺便说一下,如果它们只是只读的,那么全局变量中就没有恶魔。 ;)

回答

0

好的,我可以在这里看到一些缺点。

首先,这个代码给我的环境(的Xcode 5),并有很好的理由的错误(启用ARC)。我不知道你是如何编译的。原因是你正在将一个整数(或长整数)转换为一个对象,这会导致很多错误,因为它通常是无效的操作。所以,真正的问题不是为什么第三个“断言”失败,但为什么第二个成功。

至于你问题的第二部分而言,我不得不承认,我没有完全理解你的问题,你可能有更彻底地解释。

通常,单元测试正在测试代码的特定部分。因此,您通常不会对实际的最终可执行文件执行测试(我相信这不称作单元测试),也不需要同时编译“所有C++代码+您的单元测试”。

既然你使用Xcode,我会给你一些指示。

  • 编写您的应用程序(或至少它的一部分),并找到您要执行单元测试的方面/功能/对象。
  • 在单独的文件中,编写实例化这些对象并测试它们的方法的单元测试,调用它们并比较输入和输出。
  • 你的应用程序中应该有第二个目标,它只编译单元测试源代码和相关的主程序代码。
  • 建立这个目标,或按命令-U,它会报告成功和失败。

所以,你需要分离你的源代码并隔离你的类/方法来使它们像这样可测试。这需要一个良好的体系结构和应用程序的设计,你可能需要在灵活性方面做出一些妥协(这取决于你自己决定)。哦,我相信在可测试代码中,由于各种原因,您应该避免使用全局变量。全局变量有时候会有帮助,但是它们通常会使单元测试变得非常困难(如果误用会导致意大利面代码,但这是一个完全不同的故事)

我希望我帮助,即使没有完全理解第二部分您的帖子。

+0

嗨csotiriou。我终于找到了一种解决方案,我忘了关闭这个话题。下面我发布了答案,以防有人陷入同一陷阱。 –

相关问题