【发布时间】:2013-03-11 07:46:00
【问题描述】:
目前我正在使用 CppUnit 用 C++ 编写单元测试。最近我需要使用 CppUnits 宏检查在特定情况下是否引发了异常:
CPPUNIT_ASSERT_THROW(
boost::get<FooClassInBoostVariant>(m_boostVariantFooOrBar),
boost::bad_get);
测试编译期间的警告让我感到惊讶(在 VS2010 上,但在其他编译器上也会出现警告......):
warning C4127: conditional expression is constant
我查看了CppUnit的宏定义,发现如下:
do { \
bool cpputExceptionThrown_ = false; \
try { \
expression; \
} catch ( const ExceptionType & ) { \
cpputExceptionThrown_ = true; \
} \
\
if ( cpputExceptionThrown_ ) \
break; \
\
CPPUNIT_NS::Asserter::fail( \
"Expected exception: " #ExceptionType \
" not thrown.", \
CPPUNIT_SOURCELINE() ); \
} while ( false )
好吧,我完全理解它是如何工作的,do while 循环只执行一次,因为 false,并且 break 用于不执行 Asserter::fail() 部分。但是他们为什么要这样做呢?它 - 当然 - 触发编译器警告,因为 while 循环的中断条件显然总是“假”。但是没有更优雅的方法来做到这一点吗?我通常坚持无警告编译原则,所以这真的让我很烦恼。
所以我的问题真的是,他们为什么不这样实现它:
{ \
bool cpputExceptionThrown_ = false; \
try { \
expression; \
} catch ( const ExceptionType & ) { \
cpputExceptionThrown_ = true; \
} \
\
if ( !cpputExceptionThrown_ ) { \
CPPUNIT_NS::Asserter::fail( \
"Expected exception: " #ExceptionType \
" not thrown.", \
CPPUNIT_SOURCELINE() ); \
} \
}
提前致谢!
-汉尼斯
【问题讨论】:
-
很可能是无能,但也可能是一种编码风格。顺便说一句,这不是 cppunit 的唯一问题。尝试比较无符号短整数而不进行强制转换。
-
我建议改用更好的单元测试框架(比如 gtest)
-
这不是一个有用的提示,因为许多其他限制可能导致几年前在一个大型项目中采用 CppUnit 的决定,并且在这个框架内编写了数千个单元测试......但从从头开始,我想我不会再选择 CppUnit 了,对吧。
-
我想没有人能告诉你为什么这段代码是这样写的。为什么不改一下呢?
-
我做了,但我想知道是否有正当理由接受这个我不知道的编译器警告。
标签: c++ unit-testing compiler-warnings cppunit c4127