【问题标题】:Xcode C++ Unit testing with global variable使用全局变量进行 Xcode C++ 单元测试
【发布时间】:2013-10-09 13:31:42
【问题描述】:

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

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

当不是从数据段获取全局数据时,一切正常。似乎该变量未初始化/或未找到。所以当然我所有的测试都错了。

我的问题是: 构建可执行文件然后在其上运行测试是完全错误的吗?还是我必须同时编译所有代码+单元测试,然后运行它?还是只是缺少 SenTesting 框架?

我忘了说这是一个 C++ const 字符串。不知道这是否会改变什么。

*编辑***

我的假设是错误的,但我仍然不明白超越的魔力!看起来像一个 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。

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

【问题讨论】:

    标签: c++ objective-c xcode unit-testing


    【解决方案1】:

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

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

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

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

    既然你用的是Xcode,那我给你一些提示。

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

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

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

    【讨论】:

    • 嗨 csotiriou。我终于找到了一种解决方案,我只是忘记关闭这个话题。下面我已经发布了答案,以防有人落入同样的陷阱。
    猜你喜欢
    • 2011-07-29
    • 2016-10-24
    • 2018-11-29
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 2021-02-24
    • 2016-11-08
    • 1970-01-01
    相关资源
    最近更新 更多