目前,在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来运行测试。
我已经尝试创建另一个构建配置,如“调试单元测试”,虽然我不能完全开始工作,这似乎是一种草率的做事方式,因为我将不得不继续保持对调试和调试单元测试构建配置。还有其他建议吗?
答案 0 :(得分:0)
条件LOG
宏没问题 - 这是非常标准的(除了您使用非标准Microsoft扩展程序fprintf
之外的事实,除此之外)。
有一个潜在的问题,即您的单元测试永远不会执行您的日志语句。因此,您可能在LOG
参数中存在运行时错误,预处理器将隐藏该错误以进行测试。
更可靠的解决方案是将记录流定义在某处而不是硬编码stderr
,然后在单元测试设置中将其覆盖为空流(或重定向stderr
- I'我不确定Windows等价的/dev/null
是什么)。这样,仍会评估LOG
的参数,格式化仍然完成,但您仍然看不到日志记录。
你不需要为static_assert
做任何事情(因为如果他们在测试代码中输入非测试代码时失败了......你可能不会测试无论如何都是对的。)
您不需要对BOOST_ASSERT_MSG
执行任何特殊操作,因为NDEBUG
已禁用此功能。