更优雅的方式在单元测试时禁用我的LOG消息?

时间:2017-06-08 09:46:36

标签: c++ unit-testing testing

目前,在Visual Studio 2017中,我正在尝试使用谷歌的测试框架gtest对我的代码进行单元测试。我用C ++编写代码。我遇到的问题是我希望能够在单元测试时禁用我的LOG并为我的调试构建断言宏我不知道如何正确地执行此操作。这是我目前的宏设置方式:

#if (DEBUG)

#define RUNTIME_ASSERT \
    BOOST_ASSERT_MSG 

#define COMPILETIME_ASSERT(expr, msg) \
    static_assert(expr, msg) 

#define LOG(...) \
    do { fprintf_s(stderr, __VA_ARGS__); } while (0)

#else
#define NDEBUG
#define RUNTIME_ASSERT 
#define COMPILETIME_ASSERT(expr, msg)
#define LOG(...) ((void)0)
#endif

我的解决方案包括两个项目,我的实际应用程序(视频游戏项目)和单元测试项目,它将我的游戏项目作为lib来运行测试。

我已经尝试创建另一个构建配置,如“调试单元测试”,虽然我不能完全开始工作,这似乎是一种草率的做事方式,因为我将不得不继续保持对调试和调试单元测试构建配置。还有其他建议吗?

1 个答案:

答案 0 :(得分:0)

条件LOG宏没问题 - 这是非常标准的(除了您使用非标准Microsoft扩展程序fprintf之外的事实,除此之外)。

有一个潜在的问题,即您的单元测试永远不会执行您的日志语句。因此,您可能在LOG参数中存在运行时错误,预处理器将隐藏该错误以进行测试。

更可靠的解决方案是将记录流定义在某处而不是硬编码stderr,然后在单元测试设置中将其覆盖为空流(或重定向stderr - I'我不确定Windows等价的/dev/null是什么)。这样,仍会评估LOG的参数,格式化仍然完成,但您仍然看不到日志记录。

你不需要为static_assert做任何事情(因为如果他们在测试代码中输入非测试代码时失败了......你可能不会测试无论如何都是对的。)

您不需要对BOOST_ASSERT_MSG执行任何特殊操作,因为NDEBUG已禁用此功能。