确保c+中有条件编译代码的单元测试+; 这是我的代码中定义的标准C++断言宏-< /p> #ifndef DEBUG #define ASSERT(n) #else #define ASSERT(n) \ if (!(n)){ \ printf("%s - Failed ", #n); \ printf("On %s ", __DATE__); \ printf("At %s ", __TIME__); \ printf("In File %s ", __FILE__); \ printf("At Line %d\n", __LINE__); \ exit(1);} #endif
我希望通过绑定一个单元测试来确保我的构建始终包含这段代码。测试应检查,如果未提供#调试预处理器(即,它是发布模式),单元测试中应用的条件检查应失败,断言宏失败,并包含上述消息 是否有一个既定的方法来实现这一点?我使用谷歌测试框架来实现这一点,但无法实现的结果。测试使用标准断言消息失败,而不是我尝试使用的自定义断言失败。 我的代码如下-确保c+中有条件编译代码的单元测试+; 这是我的代码中定义的标准C++断言宏-< /p> #ifndef DEBUG #define ASSERT(n) #else #define ASSERT(n) \ if (!(n)){ \ printf("%s - Failed ", #n); \ printf("On %s ", __DATE__); \ printf("At %s ", __TIME__); \ printf("In File %s ", __FILE__); \ printf("At Line %d\n", __LINE__); \ exit(1);} #endif,c++,c,googletest,C++,C,Googletest,我希望通过绑定一个单元测试来确保我的构建始终包含这段代码。测试应检查,如果未提供#调试预处理器(即,它是发布模式),单元测试中应用的条件检查应失败,断言宏失败,并包含上述消息 是否有一个既定的方法来实现这一点?我使用谷歌测试框架来实现这一点,但无法实现的结果。测试使用标准断言消息失败,而不是我尝试使用的自定义断言失败。 我的代码如下- TEST(VerifyNormalInitialization, VerifyAssert) { static int index = 0; st
TEST(VerifyNormalInitialization, VerifyAssert)
{
static int index = 0;
static int num = 4;
ASSERT(index == num);
EXPECT_FATAL_FAILURE(ASSERT(index == num),"Failed");
}
首先,当定义了调试时,下面的明显错误只会引发一个错误
ASSERT(index == num);
ASSERT(index != num);
对于生产和开发这两种情况的单元测试,您需要以两种方式编译
您可以通过自己的#define/#undef DEBUG
来实现这一点
良好做法?我不知道;我不知道这是值得测试的东西。可能只是验证断言在开发过程中是否处于活动状态。这是安装检查的一部分。考虑一下
EXPECT_FATAL_FAILURE(if (!(index == num)){ ... },"Failed");
<>这看起来像是有效的C++吗?事实并非如此
考虑编写一个宏,将#n
、uu文件uu
等传递给适当的函数。如果坚持单独使用宏,则它需要是一个表达式而不是一个语句,大致如下:
#define STR2(x) #x
#define STR(x) STR2(x)
#define ASSERT(n) \
( \
fprintf(stderr, \
#n " - Failed on " __DATE__ " at " __TIME__ \
" in file " __FILE__ " at line " STR(__LINE__) \
), \
exit(EXIT_FAILURE) \
)
这是使用编译时字符串连接来准备整个字符串。此表达式中的所有内容都是字符串文字,两个字符串文字(如“hello”
和“world”
由预处理器连接为“helloworld”
)
“stringification”宏只是用来将整数\uuuuu行\uuuu
转换为字符串文字
请注意,
),
是逗号运算符,用于在同一表达式中允许两个函数调用。什么是“标准”和“自定义”断言消息?请在问题中包括输出和预期输出您自己的断言调用退出(1)
,这将不容易测试。首先为什么要重新发明轮子?已有assert
EXPECT\u FATAL\u失败
仅检测GoogleTest断言失败<代码>退出(1)
只会被捕获在a中,使用EXPECT\u exit
或EXPECT\u DEATH
@idclev463035818:关于“退出(1)”的要点。听起来像是我在试图分裂头发。@Yksisarvinen:谢谢你指出死亡测试,现在就开始探索它。谢谢Joop!单元测试背后的想法是确保其他开发人员意识到他们在编译单元中省略了#定义的assert宏,编译和构建需要几分钟的时间,并且在运行时他们不会找到指向文件和行号的失败信息。失败的单元测试会很快突出这一点。然而,阅读上面的评论和你的答案,我感觉我用了一种错误的方式来处理这个问题,需要探索其他的选择。@Amoghsarpottar我喜欢这种针对所有可能性的保护措施,但也有一些“效率”实践,比如跳过单元测试。祝你好运