현재 CppUnit을 사용하여 C++로 단위 테스트를 작성하고 있습니다. 시험의 컴파일하는 동안 경고가 VS2010에서 (나를 놀라게CppUnit은 Assert로 예외를 예상합니다. C4127로 컴파일합니다.
CPPUNIT_ASSERT_THROW(
boost::get<FooClassInBoostVariant>(m_boostVariantFooOrBar),
boost::bad_get);
하지만,뿐만 아니라 다른 컴파일러에 경고가 될 것입니다 : 최근에 나는 예외가 CppUnits 매크로를 사용하여 특정 경우에 발생되어 있는지 확인해야했습니다. ..) :
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)
글쎄, 내가 완전히 이해 루프 동안 할 일을 내가 s가 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()); \
} \
}
사전에 감사!
-Hannes
대부분 무능력이지만 코딩 스타일 일 수도 있습니다. btw 그것은 cppunit의 유일한 문제가 아닙니다. 캐스팅하지 않고 부호없는 short 정수를 비교해보십시오. –
수십개의 다른 제약이 수년 전에 대규모 프로젝트에서 CppUnit을 사용하기로 결정했을 수도 있기 때문에 유용한 힌트가 아닌 더 나은 단위 테스트 프레임 워크 (gtest와 같은) –
으로 변경하는 것이 좋습니다. 이 프레임 워크 내에서 ...하지만 처음부터 나는 더 이상 CppUnit을 선택하지 않을 것이라고 생각합니다. –