単体テストのチュートリアル
このチュートリアルでは、ユニットテストのアプローチの概要を説明し、CLion でサポートされているテストフレームワークである Google Test、Boost.Test、Catch2、Doctest について解説します。
CLionのユニットテストパートでは、プロジェクトにフレームワークを組み込む手順を説明し、CLionのテスト機能を紹介します。
単体テストの基本
ユニットテストは、ソースコードの個々のユニットを個別にチェックすることを目的としています。 ここでの 単位は、フリー関数やクラスメソッドなど、単独でテストできるコードの最小部分です。
単体テストが役立ちます。
コードをモジュール化する
コードのテスト容易性はその設計に依存するため、ユニットテストはそれをテストしやすい特別な部分に分割することを容易にします。
退行を避ける
ユニットテストのスイートがあれば、新しい機能を追加したり変更を加えたりするたびに、それを繰り返し実行して、すべてが 正しく動作し続けることを確認できます。
コードを文書化する
テストを実行したり、デバッグしたり、あるいは単に読んだりしても、元のコードがどのように機能するかについて多くの情報を得ることができるため、暗黙のドキュメントとして使うことができます。
単一ユニットテスト は、いくつかの特定の機能をチェックし、明確な合否基準を持つ方法です。 単一テストの一般化された構造は次のようになります。
単体テスト用の 良い習慣 は次のとおりです。
クラスコンストラクターや演算子を含む、一般に公開されているすべての関数のテストを作成します。
すべてのコードパスをカバーし、不正な入力データを含む些細なケースとエッジケースの両方をチェックします (ネガティブテスト(英語)を参照)。
各テストが独立して機能し、他のテストの実行を妨げないようにします。
実行順序が結果に影響しないようにテストを編成します。
テストケースが論理的に接続されている場合や同じデータを使用している場合は、テストケースをグループ化すると便利です。 スイート はテストを共通の機能と組み合わせます(たとえば、同じ機能に対して異なるケースを実行する場合)。 フィクスチャ クラスは、複数のテスト用に共有リソースを整理できます。 これらは、グループ内の各テストの環境を設定およびクリーンアップするために使用され、コードの重複を回避します。
ユニットテストは、多くの場合、 モック(英語)と組み合わされます。 モックオブジェクト は、テストターゲットの軽量実装であり、テスト対象の機能に複雑な依存関係が含まれていて、実際のオブジェクトを使用して実行可能なテストケースを構築することが難しい場合に使用されます。
フレームワーク
手動のユニットテストには、スタブテストコードの作成、 main() の実装、出力メッセージの印刷など、多くのルーチンが含まれます。 単体テストフレームワークは、これらの操作を自動化するのに役立つだけでなく、次のような利点もあります。
管理可能なアサーション動作
フレームワークを使えば、個々のチェックの失敗がテスト全体の実行を中止するかどうかを指定できます。通常の
ASSERTに加え、フレームワークは失敗してもテストプログラムを中断しないEXPECT/CHECKマクロも提供します。各種チェッカー
チェッカーは、期待される結果と実際の結果を比較するためのマクロです。 テストフレームワークによって提供されるチェッカーは、設定可能な重大度(警告、定期的な期待、要件)を持つことがよくあります。 また、浮動小数点の比較や、特定の条件下で例外の発生をチェックする事前に実装された例外ハンドラーに対する許容範囲も含めることができます。
テスト組織
フレームワークを使用すると、共通の機能(スイート)または共有データ(フィクスチャ)でグループ化されたテストのサブセットを簡単に作成して実行できます。 また、最近のフレームワークは自動的に新しいテストを登録するため、手動で行う必要はありません。
カスタマイズ可能なメッセージ
フレームワークはテスト出力の面倒を見ます: それらは冗長な記述的な出力、ユーザー定義のメッセージあるいは簡潔な 合格 / 不合格結果だけを示すことができます(後者は回帰テストのために特に便利です)。
XML レポート
ほとんどのテストフレームワークは結果を XML フォーマットでエクスポートします。 これは、結果を TeamCity や Jenkins(英語) などの継続的インテグレーションシステムにさらに渡す必要がある場合に役立ちます。
CLion の単体テスト
CLion と Google Test、Boost.Test、Catch2、Doctest との統合には以下が含まれます
フレームワークライブラリの完全なコードインサイト
専用の実行 / デバッグ構成
テスト / スイート / フィクスチャを実行またはデバッグし、それらのステータスを確認するためのガターアイコン
専門のテストランナー
テストとフィクスチャクラスのコード生成 (Google Test で利用可能)。
プロジェクト用のテストフレームワークを設定する
この章では、Google Test、Boost.Test、Catch2、Doctest フレームワークを CLion のプロジェクトに追加する方法と、簡単なテストセットを作成する方法について説明します。
例として、 DateConverter プロジェクトを使用します。このプロジェクトは github リポジトリからクローンできます。 このプログラムは、グレゴリオ暦フォーマットで指定された日付の絶対値を計算し、ユリウス暦の日付に変換します。 最初はプロジェクトにテストが含まれていません。順を追って追加していきます。 フレームワーク間の違いを確認するために、すべてを使って同じテストを行います。
プロジェクトの最終バージョンは、 DateConverter_withTests(英語) リポジトリにあります。 プロジェクト構造がどのように変換されるかを次に示します。

各フレームワーク用 、私達は次のことをします:
フレームワークを DateConverter プロジェクトに追加します。
2 つのテストファイル、 AbsoluteDateTest.cpp と ConverterTests.cpp を作成します。 これらのファイルは各フレームワークと同様に命名され、特定のフレームワークの構文を使用して書かれたテストコードが含まれます。
それではクローン DateConverter プロジェクトを開き、下のタブにある指示に従ってください。
Google Test フレームワークを含める
DateConverter プロジェクトルートに Google Tests 用のフォルダーを作成します。 その中に、フレームワークのファイル用に別のフォルダーを作成します。 この例では、 Google_tests と Google_tests/lib フォルダーです。
公式 リポジトリ(英語)から GoogleTest をダウンロードします。 googletest-main フォルダーの内容を Google_tests/lib に抽出します。
CMakeLists.txt ファイルを Google_tests フォルダーに追加します(プロジェクトツリーで右クリックして を選択します)。 以下の行を追加してください。
project(Google_tests) add_subdirectory(lib) include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})ルート CMakeLists.txt スクリプトで、最後に
add_subdirectory(Google_tests)行を追加してプロジェクトを再ロードします。
Google Test を追加する
プロジェクトツリーの Google_tests フォルダーをクリックして を選択し、 AbsoluteDateTest.cpp と呼びます。
CLion はこのファイルを既存のターゲットに追加するように促します。 次のステップでこのファイルの新しいターゲットを作成するため、これを行う必要はありません。
ConverterTests.cpp についてもこの手順を繰り返します。
2 つのソースファイルを追加したら、それらのテストターゲットを作成して
DateConverter_libライブラリとリンクさせることができます。Google_tests/CMakeLists.txt に次の行を追加します。
# adding the Google_Tests_run target add_executable(Google_Tests_run ConverterTests.cpp AbsoluteDateTest.cpp) # linking Google_Tests_run with DateConverter_lib which will be tested target_link_libraries(Google_Tests_run DateConverter_lib) target_link_libraries(Google_Tests_run gtest gtest_main)Google Test 版のチェックを AbsoluteDateTest.cpp(英語) と ConverterTests.cpp(英語) から AbsoluteDateTest.cpp ファイルと ConverterTests.cpp ファイルにコピーします。
これでテストを 実行する準備が整いました。 例: ConverterTests.cpp の
DateConverterFixture宣言の横にある左のガターの中のをクリックして、 起動構成の実行 ... を選択しましょう。 以下のような結果が得られます。

Boost.Test フレームワークを含める
これらの 手順に従って Boost テストフレームワークをインストールおよびビルドします(今後のテストでは、フレームワークをリンクするために 共有ライブラリ使用バリアントを使用します)。
DateConverter プロジェクトルートに Boost テスト用のフォルダーを作成します。 この例では、 Boost_tests と呼ばれています。
CMakeLists.txt ファイルを Boost_tests フォルダーに追加します(プロジェクトツリーで右クリックして を選択します)。 以下の行を追加してください。
set (Boost_USE_STATIC_LIBS OFF) find_package (Boost REQUIRED COMPONENTS unit_test_framework) include_directories (${Boost_INCLUDE_DIRS})ルート CMakeLists.txt スクリプトで、最後に
add_subdirectory(Boost_tests)行を追加してプロジェクトを再ロードします。
Boost テストを追加する
プロジェクトツリーで Boost_tests をクリックし、 を選択して、 AbsoluteDateTest.cpp と呼びます。
CLion はこのファイルを既存のターゲットに追加するように促します。 次のステップでこのファイルの新しいターゲットを作成するため、これを行う必要はありません。
ConverterTests.cpp についてもこの手順を繰り返します。
2 つのソースファイルを追加したら、それらのテストターゲットを作成して
DateConverter_libライブラリとリンクさせることができます。 Boost_tests/CMakeLists.txt に次の行を追加します。add_executable (Boost_Tests_run ConverterTests.cpp AbsoluteDateTest.cpp) target_link_libraries (Boost_Tests_run ${Boost_LIBRARIES}) target_link_libraries (Boost_Tests_run DateConverter_lib)プロジェクトを再読み込みしてください。
AbsoluteDateTest.cpp(英語) と ConverterTests.cpp(英語) から私たちのチェックの Boost.Test バージョンをあなたのプロジェクトの対応するソースファイルにコピーしてください。
これでテストを 実行する準備が整いました。 例: AbsoluteDateTest.cpp の
BOOST_AUTO_TEST_SUITE(AbsoluteDateCheckSuite)の隣にある左のガターのをクリックして 起動構成の実行 ... を選択しましょう。 以下のような結果が得られます。

Catch2 フレームワークを含める
公式の指示に従って(英語)システムに Catch2 をインストールします。
DateConverter プロジェクトルートに Catch2 テスト用のフォルダーを作成します。 この例では、 Catch_tests と呼ばれています。
Catch_tests フォルダーに CMakeLists.txt ファイルを作成します (プロジェクトツリーでフォルダーを右クリックし、 を選択します)。
このファイルを段階的に埋めていきます。 ここでは、先頭にコマンドを 1 つ追加します。
find_package(Catch2 3 REQUIRED)ルート CMakeLists.txt で、最後に次のコマンドを追加し、プロジェクトを再ロードします。
add_subdirectory(Catch_tests)
Catch2 テストターゲットを追加する
プロジェクトツリーで Catch_tests をクリックし、 を選択して、 AbsoluteDateTest.cpp と呼びます。
新しいターゲットの追加 をクリックします:

ターゲット名を キャッチテスト実行 に設定し、その場所 Catch_tests/CMakeLists.txt を指定します。

追加 をクリックします。
キャッチテスト実行 タグレットがリストに表示されます。 他のチェックボックスはすべてオフにしてください。

OK をクリックします。
新しいファイルがプロジェクトに追加され、次のコマンドが Catch_tests/CMakeLists.txt に追加されます。
add_executable(Catch_tests_run AbsoluteDateTest.cpp)同じ場所に別のファイルを作成し、 ConverterTests.cpp という名前を付けます。 それを
キャッチテスト実行ターゲットに追加します:
これでテストターゲットにリンクされたソースファイルができました:

Catch_tests/CMakeLists.txt スクリプトを開き、
add_executableコマンドの後に次の行を追加します。target_link_libraries(Catch_tests_run PRIVATE DateConverter_lib) target_link_libraries(Catch_tests_run PRIVATE Catch2::Catch2WithMain) include(Catch) catch_discover_tests(Catch_tests_run)プロジェクトを再読み込みしてください。
テストコードを追加してテストを実行する
コードを AbsoluteDateTest.cpp(英語) および ConverterTests.cpp(英語) から対応するソースファイルにコピーします。
テストの前に
#include <catch2/catch_test_macros.hpp>これでテストを実行する準備が整いました。
テストを実行する最も簡単な方法は、
TEST_CASEの隣のガターにあるをクリックすることです。

CLion は、 テストランナーツールウィンドウで結果を表示します:

Doctest フレームワークを含める
DateConverter プロジェクトルートに Doctest テスト用のフォルダーを作成します。 この例では、 Doctest_tests と呼ばれています。
doctest.h(英語) ヘッダーをダウンロードして、 Doctest_tests フォルダーに配置します。
Doctest テストを追加する
プロジェクトツリーで Doctest_tests をクリックし、 を選択して、 AbsoluteDateTest.cpp と呼びます。
CLion はこのファイルを既存のターゲットに追加するように促します。 次のステップでこのファイルの新しいターゲットを作成するため、これを行う必要はありません。
ConverterTests.cpp についてもこの手順を繰り返します。
CMakeLists.txt ファイルを Doctest_tests フォルダーに追加します(プロジェクトツリーでフォルダーを右クリックして を選択します)。 以下の行を追加してください。
add_executable(Doctest_tests_run ConverterTests.cpp AbsoluteDateTest.cpp) target_link_libraries(Doctest_tests_run DateConverter_lib)ルート CMakeLists.txt で、最後に
add_subdirectory(Doctest_tests)を追加してプロジェクトを再ロードします。チェックの Doctest バージョンを AbsoluteDateTest.cpp(英語) および ConverterTests.cpp(英語) からプロジェクトの対応するソースファイルにコピーします。
これでテストを 実行する準備が整いました。 例: ConverterTests.cpp の
TEST_CASE("Check various dates")の隣にある左のガターの中のをクリックして 起動構成の実行 ... を選択します。 以下のような結果が得られます。

テスト用の実行 / デバッグ構成
テストフレームワークは、テストプログラム用の main() エントリを提供するため、CLion で通常のアプリケーションとして実行できます。 ただし、 Google Test、 Boost.Test、 Catch2、 Doctest の専用の実行 / デバッグ構成を使用することをお勧めします。 これらの構成にはテスト関連の設定が含まれており、組み込みのテストランナー(通常のアプリケーションとしてテストを実行する場合は使用できません)を利用できます。
テスト用の実行 / デバッグ構成を作成する
実行 | 実行構成の編集 に移動し、
をクリックして、フレームワーク固有のテンプレートの 1 つを選択します。

設定をセットアップする
フレームワークに応じて、テスト パターン、 スイート 、または タグ を指定します(Catch2 の場合)。 フィールドに自動補完機能が用意されているため、すぐに記入できます。

テストパターンを指定するときにはワイルドカードを使用できます。 例: サンプルプロジェクトから
PlusOneDiffおよびPlusFour_Leapテストのみを実行するには、次のパターンを設定します。
構成設定の他のフィールドでは、環境変数またはコマンドラインオプションを設定できます。 例: プログラム引数 フィールドで、Catch2 テスト用に
-sを設定してテストに合格して全出力を表示するか、--gtest_repeatを使用して Google Test を複数回実行できます。
出力は次のようになります。
Repeating all tests (iteration 1) ... Repeating all tests (iteration 2) ... Repeating all tests (iteration 3) ...
テスト用のガターのアイコン
CLion では、テストの実行/デバッグセッションを開始する方法が いくつかあります。その一つが特別なガターアイコンの利用です。 これらのアイコンは、単一テストまたはスイート/フィクスチャ全体をすばやく実行またはデバッグするのに役立ちます:

ガターアイコンは、テスト結果(すでに利用可能な場合)も表示します: 成功 または失敗
。
ガターアイコンを使用して test/suite/ フィクスチャを実行すると、CLion は対応するタイプの 一時的な実行 / デバッグ構成を作成します。 これらの設定はリスト内でグレー表示されているのがわかります。 一時的な設定を保存するには、 ダイアログでそれを選択して を押します。

テストランナー
テスト設定を実行すると、結果(およびプロセス)がテストランナーウィンドウに表示されます。
これまでに実行されたテストの割合を示す 進捗バー
実行中のすべてのテストのステータスと期間を含む ツリービュー
テストの output ストリーム
ツールバー では、失敗した
テストの再実行、
のエクスポート、自動保存された以前の結果のオープン
、特定のテストを簡単に見つけるためのアルファベット順
や、どのテストが他より長く実行されたかを把握するための期間順
への並べ替えなどのオプションがあります。

その他の機能
テストマクロのクイックドキュメント
テストフレームワークによって提供されるマクロを探索できるように、 クイックドキュメントのポップアップ (Ctrl+Q) は最終的なマクロ置換を表示し、それを適切にフォーマットします。 また、結果の置換で使用される文字列とキーワードもハイライトされます。

テストリストの表示
初期インデックス作成の時間を短縮するために、CLion は遅延テスト検出を使用します。 テストファイルを開くか、テスト設定を実行またはデバッグするまで、テストはインデックスから除外されます。 プロジェクトで現在どのテストが検出されているかを確認するには、 から テストリストの表示 を呼び出します。 このアクションを呼び出しても索引付けはトリガーされません。