Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在单元测试时禁用日志消息的更优雅的方法?_C++_Unit Testing_Testing - Fatal编程技术网

C++ 在单元测试时禁用日志消息的更优雅的方法?

C++ 在单元测试时禁用日志消息的更优雅的方法?,c++,unit-testing,testing,C++,Unit Testing,Testing,现在,在visual studio 2017中,我正在尝试使用google的测试框架gtest对我的代码进行单元测试。我用C++编写代码。我遇到的问题是,当我不确定如何正确进行单元测试时,我希望能够禁用调试构建的日志和断言宏。这是我当前设置宏的方式: #if (DEBUG) #define RUNTIME_ASSERT \ BOOST_ASSERT_MSG #define COMPILETIME_ASSERT(expr, msg) \ static_assert(expr,

现在,在visual studio 2017中,我正在尝试使用google的测试框架gtest对我的代码进行单元测试。我用C++编写代码。我遇到的问题是,当我不确定如何正确进行单元测试时,我希望能够禁用调试构建的日志和断言宏。这是我当前设置宏的方式:

#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来运行测试


我尝试过创建另一个构建配置,如“调试单元测试”,尽管我无法让事情正常进行,而且这似乎是一种草率的方式,因为这样我就必须保持对调试和调试单元测试构建配置的更改。还有其他建议吗?

有条件的
LOG
宏还可以-这是非常标准的(除了您使用的是
fprintf
的非标准Microsoft扩展之外,其他都可以)

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

更可靠的解决方案是将日志流定义在某个地方,而不是硬编码
stderr
,然后在单元测试设置中将其重写为空流(或者重定向
stderr
——我不确定
/dev/null
的Windows等价物是什么)。通过这种方式,
LOG
的参数仍然被计算,格式化仍然完成,但是您仍然看不到日志记录


您不需要为
静态断言
做任何事情(因为如果他们在通过非测试代码时在您的测试代码中失败,那么您可能无论如何都没有测试正确的东西)


您也不需要为
BOOST\u ASSERT\u MSG
做任何特殊的操作,因为这已经被
NDEBUG

禁用了,我觉得很好。您也可以尝试像CMake这样的方法,并在那里定义您的配置。为什么您需要在单元测试中禁用静态断言?如果你不知何故需要构建一些本来不应该编译的测试,它们还会测试你的实际代码吗?@好的一点,我会改变这一点。其次,
BOOST\u ASSERT\u MSG
在定义
NDEBUG
时已经被禁用,所以你不需要为此做任何特殊的事情。只要正确定义
DEBUG
/
NDEBUG
。@Ha,我想是无用的。只是谨慎而已。我也会改变的!