私はQT C++の世界にいます。私はQTestクラスを使ってTDDをやっています。特定の条件でテスト中のクラスによって例外がスローされることを確認したい。 Googleのテストを使用して、私のようなものを使用します。例外がスローされたことをQTestで確認する方法は?
EXPECT_THROW(A(NULL), nullPointerException);
それはQTestでこの機能のようなものを存在していますか?少なくともそれをする方法は?
ありがとうございます!
私はQT C++の世界にいます。私はQTestクラスを使ってTDDをやっています。特定の条件でテスト中のクラスによって例外がスローされることを確認したい。 Googleのテストを使用して、私のようなものを使用します。例外がスローされたことをQTestで確認する方法は?
EXPECT_THROW(A(NULL), nullPointerException);
それはQTestでこの機能のようなものを存在していますか?少なくともそれをする方法は?
ありがとうございます!
Qt5.3以来、QTestは欠落している機能を提供するマクロQVERIFY_EXCEPTION_THROWNを提供します。
これの唯一の問題は、 '置換できない型の例外がスローされたり、式が例外を全くスローしなかった場合、テストに失敗が記録されますログとテストはそれ以上実行されません。つまり、何も**何らかの例外タイプ(または派生クラス)がスローされないかどうかをチェックすることができる、すぐに使えるソリューションはありません。 – rbaleksandar
このマクロは、原理を示しています。
typeid
比較は特別な使用例であるため、使用しても使用しない場合もあります。テストしている例外からスローされた例外がマクロにも渡された場合でも、マクロはそのマクロを「失敗」させます。しばしばあなたはこれを望まないでしょうが、とにかくそれを投げました!
#define EXPECT_THROW(func, exceptionClass) \
{ \
bool caught = false; \
try { \
(func); \
} catch (exceptionClass& e) { \
if (typeid(e) == typeid(exceptionClass)) { \
cout << "Caught" << endl; \
} else { \
cout << "Derived exception caught" << endl; \
} \
caught = true; \
} catch (...) {} \
if (!caught) { cout << "Nothing thrown" << endl; } \
};
void throwBad()
{
throw std::bad_exception();
}
void throwNothing()
{
}
int main() {
EXPECT_THROW(throwBad(), std::bad_exception)
EXPECT_THROW(throwBad(), std::exception)
EXPECT_THROW(throwNothing(), std::exception)
return EXIT_SUCCESS;
}
戻り値:
Caught Derived exception caught Nothing thrown
あなたはQFAIL
で失敗を強制する必要がありますQTest
のためにそれを適合させます。
(catch(const exceptionClass&e){\ if(typeid(e)== typeid(exceptionClass){{'はstd :: exceptionから独立していますか? – ixSci
例外が 'exceptionClass'から派生していない、または派生していない場合、' catch'ブロックはスキップされるでしょう。 – cmannett85
私は、catch(...)を追加して未処理のものとして数えれば十分です – ixSci
例外はQtの世界ではあまり一般的ではありません。 afaikにはQTestに特定のマクロはありませんが、try catchを使ってQVERIFYでテストをブロックすることができます。代わりに、qtとgoogle testを使用することもできます(いくつかの理由で、qtest imhoよりもはるかに優れています)。 – TWE
はい、今度はgtestがQTestよりはるかに優れていることを認識しています。ありがとう! – Killrazor
また、gtestはgmockをサポートしていますが、QTestではこのようなものはありません。 QTestは、実際の使用のためだけであり、良いUTのためではありません。 gtestを使用する場合、QTestから必要なのはQSignalSpyだけです。他のすべてのものはgtestのほうがはるかに優れています。 – ixSci