Xcode C++全局变量的单元测试

Xcode C++ Unit testing with global variable

本文关键字:单元测试 全局变量 C++ Xcode      更新时间:2023-10-16

我在对程序进行单元测试时遇到了问题。问题很简单,但我不确定为什么这不起作用。

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

当它不是从数据细分受众群获取全局数据时,一切都很好。似乎没有初始化/或简单地找到变量。所以当然,我所有的测试都错了。

我的问题是:构建可执行文件,然后对其运行测试是完全错误的吗?还是我应该同时编译我的所有代码 + 单元测试,然后运行它?还是只是缺乏SenTest框架?

我忘了提到这是一个C++常量字符串。不知道这是否改变了什么。

*编辑***

我的假设是错误的,但我仍然不明白外面的魔力!似乎是一个C++魔法霍伊迪胡?

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。

顺便说一下,如果全局变量只是只读的,则全局变量中没有魔鬼。 ;)

好的,我在这里可以看到一些错误。

首先,这段代码在我的环境(Xcode 5(上给出了错误,并且有充分的理由(启用了 ARC(。我不知道你是怎么得到编译的东西的。原因是您将整数(或长整型(强制转换为对象,这将导致许多错误,因为它通常是无效操作。所以,真正的问题不是为什么第三个"断言"失败了,而是为什么第二个"断言"成功了。

至于你问题的第二部分,我不得不承认,我并不完全理解你的问题,你可能要解释得更彻底。

通常,单元测试是测试代码的特定部分。因此,您通常不会在实际的最终可执行文件上执行测试(我相信这不称为单元测试(,也不必同时编译"所有 c++ 代码 + 单元测试"。

由于您使用的是Xcode,因此我将为您提供一些指示。

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

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

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