目前我正在用CppUnit編寫C++單元測試。最近,我需要檢查一個例外是在特定的情況下,使用CppUnits宏拋出:CppUnit預計異常與斷言拋出警告編譯C4127
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)
好吧,我完全理解它是如何工作的,而循環的做我只執行一次,因爲該錯誤,並且該中斷用於不執行Asserter :: fail()部分。但爲什麼他們這樣做?它 - 當然 - 觸發編譯器警告,因爲while循環的中斷條件顯然總是「false」。但是沒有更好的方法來做到這一點?我通常堅持無警告彙編原則,所以這真的讓我感到困擾。
所以我的真正的問題是,爲什麼他們不執行這樣的:
{ \
bool cpputExceptionThrown_ = false; \
try { \
expression; \
} catch (const ExceptionType &) { \
cpputExceptionThrown_ = true; \
} \
\
if (!cpputExceptionThrown_) { \
CPPUNIT_NS::Asserter::fail( \
"Expected exception: " #ExceptionType \
" not thrown.", \
CPPUNIT_SOURCELINE()); \
} \
}
提前感謝!
-Hannes
最有可能無能,但也可以是一種編碼風格。順便說一句,這不是與cppunit唯一的問題。嘗試比較未簽名的短整型而不投射。 – 2013-03-11 07:51:31
我建議改爲更好的單元測試框架(如gtest) – 2013-03-11 07:58:23
,這不是一個有用的提示,因爲許多其他約束可能導致多年前決定在一個大型項目中使用CppUnit,並且編寫了數千個單元測試在這個框架內...但從頭開始,我想我不會選擇CppUnit了,對。 – 2013-03-11 08:03:32