在一个文件中进行多个OS单元测试 - 是否可能?

时间:2016-12-15 20:35:21

标签: c++ unit-testing

我需要做这样的事情:

void Test::testUnitTest() {
#define OS_MACOSX 1
    performUnitTest();
#undef OS_MACOSX
    performUnitTest();
}

void Test::performUnitTest() {
    CefKeyEvent event;
    event.modifiers = CTRL;
    event.windows_key_code = KeyboardHander::KeyCodeC;
#ifdef OS_MACOSX
    fructose_assert(1==2);
    event.modifiers = COMMAND;
#endif
    fructose_assert(handler.get()->IsCopyRequest(event));
}

...

bool RealClass::IsCopyRequest(const CefKeyEvent& event) {
#ifdef OS_MACOSX
    return IsCOMMANDDown(event.modifiers) && event.character == 'c';
#else
    return isCTRLDown(event.modifiers) && event.character == 'c';
#endif
}

调用testUnitTest()时,performUnitTest()中的fructose_assert(1 == 2)永远不会被调用。在实际测试中,它总是调用isCTRLDown()方法。这对于预处理器指令是有意义的。问题是,如何使这实际工作?

1 个答案:

答案 0 :(得分:0)

预处理器宏#define是...预处理器宏。这意味着在调用编译器之前处理它们。预处理器处理文件,然后将它们发送给编译器。

我写了

#define OS_MACOSX 1
     #ifdef OS_MACOSX
          performUnitTest();
     #endif
#undef OS_MACOSX

编译器什么都没有收到。

但是当你做的时候

#define OS_MACOSX 1
    performUnitTest();
#undef OS_MACOSX 

这不会调用OS_MACOSX设置的方法,但只是粗略地没有什么特别的,编译器接收performUnitTest();

如果performUnitTest本身就是一个宏,它会起作用,虽然这可能是一个坏主意。

如果您使用gcc,则可以使用-save-temps选项并查看.i文件,该文件是预处理器的输出。

您可以将参数传递给测试函数,如下所示:

void Test::testUnitTest() {
    performUnitTest(true);
    performUnitTest(false);
}

void Test::performUnitTest(bool is_mac_os) {
    CefKeyEvent event;
    event.modifiers = CTRL;
    event.windows_key_code = KeyboardHander::KeyCodeC;
    if (is_mac_os) {
        fructose_assert(1==2);
        event.modifiers = COMMAND;
    }
    fructose_assert(handler.get()->IsCopyRequest(is_mac_os, event));
}

...

bool RealClass::IsCopyRequest(bool is_mac_os, const CefKeyEvent& event) {
    if (is_mac_os) {
        return IsCOMMANDDown(event.modifiers) && event.character == 'c';
    } else {
        return isCTRLDown(event.modifiers) && event.character == 'c';
    }
}

但我觉得这不是你想要的。 如果您的代码依赖于平台(IsCopyRequest听起来像),则意味着您希望在MacO上运行单元测试,而在另一个OS上运行另一个单元测试。 所以你可以写

void Test::testUnitTest() {
    performUnitTest();
}

void Test::performUnitTest() {
    CefKeyEvent event;
    event.modifiers = CTRL;
    event.windows_key_code = KeyboardHander::KeyCodeC;
#ifdef OS_MACOSX
    fructose_assert(1==2);
    event.modifiers = COMMAND;
#endif
    fructose_assert(handler.get()->IsCopyRequest(is_mac_os, event));
}

然后在MacOS上编译它(定义了OS_MACOSX)并运行它。 然后你在另一个操作系统上编译它(没有定义OS_MACOSX)并运行它。