Catch
Catch2(英語) は、軽量のテストフレームワークです。 名前は C++ Automated Test Cases in Headers (バージョン 2) の略です。 CLion は Catch バージョン 1.7.2 以降をサポートしています。
Boost.Test と同様に、Catch2 はモック機能を提供しません。 ただし、 カバ(英語)、 FakeIt(英語)、 トロペロイル(英語)などのスタンドアロンモッキングフレームワークと組み合わせることができます。
Catch2 の基本
Catch/Catch2 に詳しくない場合は、その主な概念の説明を以下で見つけることができます。
サンプルテスト
次の例は、Catch2 で書かれた簡単なテストを示しています。
上記の例では、 Life, the universe and everything は自由形式のテスト名で、ユニークである必要があります。 TEST_CASE マクロの第2引数は、 [42] と [theAnswer] の2つのタグの組み合わせです。 テスト名とタグはいずれも、C++ の識別子である必要はない通常の文字列です。 ワイルドカード付きのテスト名やタグ式を指定して、テストのコレクションを実行できます。
アサーション行 REQUIRE(theAnswer() == 42) に注目してください。 他のフレームワークとは異なり、Catch2 にはさまざまな条件付きフォームを取り込むための一連のアサートがありません。 代わりに、条件式の実際の C/C++ コードを解析し、それを使用して結果を説明します。
REQUIRE マクロは失敗時にテストを中止しますが、代替の CHECK マクロは失敗を報告するだけでテストを続行します。 これら両方のマクロ内で、すべての C++ 比較演算子を使用して、引数を任意の順序で渡すことができます。
セクション
Catch2 のもう 1 つの重要な機能は、 ケースとセクション(英語)でテストを整理する方法です(クラスベースのフィクスチャメカニズムも サポートされています(英語))。 ドキュメントからこの例を見てください:
上記のスニペットでは、 SECTION ごとに TEST_CASE が最初から実行されます。 TEST_CASE の上部にある 2 つの REQUIRE ステートメントは、各セクションの入り口で サイズ が 5 で、 capacity が少なくとも 5 であることを強制します。 このように、共有オブジェクトはスタック上に割り当てられ、それらのためにフィクスチャクラスを作成する必要はありません。 TEST_CASE を実行するたびに、Catch2 は 1 つのセクションを実行し、他のセクションをスキップします。 次回は、2 番目のセクションを実行します。
セクションをネストして一連のチェック操作を作成できます。 各リーフセクション(内部にネストセクションがないセクション)は 1 回実行されます。 親セクションが失敗すると、子セクションは実行されなくなります。 例:
Catch2 はテストケースとセクションのために代替 BDD スタイルの構文(英語)もサポートします。
テンプレートテスト
Catch2 は、タイプがパラメーター化されたテストケースを次のマクロの形式でサポートします。
TEMPLATE_TEST_CASE( test name , tags, type1, type2, ..., typen )TEMPLATE_PRODUCT_TEST_CASE( test name , tags, (template-type1, template-type2, ..., template-typen), (template-arg1, template-arg2, ..., template-argm) )TEMPLATE_LIST_TEST_CASE( test name, tags, type list )
これらのマクロは通常の TEST_CASE と同じように動作しますが、すべての型または型の組み合わせに対して実行されます。 詳細については、 型パラメーター化されたテストケース(英語)を参照してください。
型パラメータ化テストケースに加え、Catch2 は TEMPLATE_TEST_CASE_SIG と TEMPLATE_PRODUCT_TEST_CASE_SIG も提供しており、追加の シグネチャー 引数を持つ同様の構文でシグネチャーベースのパラメータ化テストケースを作成できます:
詳細は、 署名ベースのパラメーター化されたテストケース(英語)を参照してください。
CLion での Catch2 の操作
Catch2 をプロジェクトに追加する
このガイド(英語)の指示に従って、CMake 統合を使用して Catch を開始します。
自動的に作成された Catch 構成を実行 / デバッグする
CLion はプロジェクト内の Catch テストを検出し、それらの実行 / デバッグ構成を作成します。
この構成をすぐに使用して、プロジェクト内のすべての Catch テストを実行またはデバッグできます:

新しい Catch 実行 / デバッグ構成を追加する
実行 | 実行構成の編集 に進みます。
をクリックし、テンプレートのリストから Catch を選択します。


命名方法名 フィールドに構成名を設定してください。 この名前は、利用可能な実行 / デバッグ構成のリストに表示されます。
特定のタグまたはすべてのタグに対してテストを実行するには、 タグ / テスト オプションを選択します。 特定のパターンに対してすべてのテストを実行するには、 パターン オプションを選択します。
タグ フィールドにタグを指定します。 このフィールドは、 タグ / テスト オプションが選択されている場合にのみ使用できます。
テスト リストから目的のテストを選択します。 このオプションは、1 つ以上のタグが指定されている場合にのみ使用できます。
パターン フィールドにパターン名を指定します。 このフィールドは、 パターン オプションが選択されている場合にのみ使用できます。
ターゲット フィールドで、使用可能なターゲットのリストから目的のターゲットを選択します。
構成を保存するには、 変更を適用 をクリックします。
スイッチャーで新しく作成した構成を選択し、
を実行または
でデバッグします。

テストを実行
単一のテストまたはスイート / フィクスチャ全体を実行またはデバッグする最も簡単な方法は、ガターアイコンを使用することです。

ガターアイコンは、テスト結果(すでに利用可能な場合)も表示します: 成功
または失敗
。
ガターアイコンを使用してテスト / スイート / フィクスチャを実行すると、CLion は 一時的なCatch 構成を作成しますが、構成リストではグレー表示されます。 一時構成を保存するには、 ダイアログでそれを選択し、
をクリックします。

テスト結果を調べる
テストを実行すると、CLion は組み込みの テストランナーウィンドウに結果とプロセスを表示します。 テストツリーには、実行中のすべてのテストが 1 つずつ表示されます。 テストランナーウィンドウには次のものが含まれます。
これまでに実行されたテストの割合を示す プログレスバー、
実行中のすべてのテストとそのステータスおよび期間の ツリービュー、
テストの出力ストリーム
失敗した
テストを再実行するオプションを備えた ツールバー 、自動的に保存された以前の結果をインポート / エクスポートまたは開く
、特定のテストを簡単に見つけるためにテストをアルファベット順に並べ替える、または期間ごとに並べ替える
他のテストよりも長く実行されたテストを理解するためのオプション。

ランダムシードを指定する
Catch テストでランダム化を使用している場合は、 --rng-seed='time'|'random-device'|'number' パラメーターを指定して初期シードを設定できます。 詳細については、Catch ドキュメントの このセクション(英語)を参照してください。
メインメニューで、 に移動し、Catch 構成を選択します。 シードパラメーターはテスト実行全体に使用されます。
プログラム引数 フィールドで、
--rng-seedフラグを設定します:
構成を実行すると、テストツリーに固定シードが表示されます:

コンテキストメニューを使用して、同じ固定シードでテストを再実行します:

トラブルシューティング: 長いテスト名は間違ったリストを生成し、テストの実行を終了する
プロジェクト内に長いテスト名がある場合、リストが壊れてテスト実行全体が終了する可能性があります(この Catch の問題を参照)。 次の解決策のいずれかを試してください。
catch_user_config.hpp ファイルを開き、
#define CATCH_CONFIG_CONSOLE_WIDTHパラメーターを80から800に変更します。CatchConfigOptions.cmake ファイルを開き、config ジェネレーターを次のように変更します
set(CATCH_CONFIG_CONSOLE_WIDTH "80" ...)変更後
set(CATCH_CONFIG_CONSOLE_WIDTH "800" ...)(推奨されません)CLion でテストリストの抽出を無効化するには、
cidr.test.prepare.test.listレジストリキーをクリアしてください。 Ctrl+Shift+A を使用してレジストリ ダイアログを開きます。