C++プロジェクトにCTestでユニットテストを統合する方法
生徒
「先生、C++で作ったプログラムにテストを追加したいです。どうすればいいですか?」
先生
「CMakeにはCTestというユニットテストを統合する仕組みがあります。これを使うと、テストの作成と実行を簡単に行えます。」
生徒
「ユニットテストって何ですか?」
先生
「ユニットテストとは、プログラムの小さな部品(関数やクラス)が正しく動くかどうかを確認するテストです。例えば、計算関数が正しい結果を返すかを確認できます。」
1. CTestとは?
CMakeに付属しているCTestは、ユニットテストを自動で実行し、結果を報告してくれるツールです。テストの実行や失敗の確認、複数のテストをまとめて管理することができます。
CTestを使うことで、テストの追加や実行が簡単になり、プログラムの品質を高めることができます。
2. CTestの設定方法
まずCMakeLists.txtにテストを有効化する行を追加します。
enable_testing() # CTestを有効化
次に、テスト用の実行ファイルターゲットを作成します。
add_executable(test_math test_math.cpp)
target_link_libraries(test_math PRIVATE my_utils)
最後に、CTestにテストとして登録します。
add_test(NAME MathTest COMMAND test_math)
これでtest_mathがCTestで管理されるテストになります。
3. ユニットテストの作成例
簡単な計算関数をテストする例を見てみましょう。
#include "math_utils.h"
#include <cassert>
#include <iostream>
int main() {
assert(add(2, 3) == 5); // 正しいか確認
assert(subtract(5, 3) == 2);
std::cout << "All tests passed!" << std::endl;
return 0;
}
テストが成功すると「All tests passed!」と表示され、失敗した場合はassertによりプログラムが停止します。
4. CTestでテストを実行する
CMakeでビルドした後、次のコマンドでテストを実行します。
ctest -V
-Vオプションを付けると、テストごとの詳細な出力を見ることができます。CTestはすべてのadd_testで登録されたテストを順番に実行します。
5. CTest統合のメリット
- ビルドとテストをCMakeで一元管理できる
- テストの自動実行でバグの早期発見が可能
- 複数の開発者が同じプロジェクトで一貫したテストができる
- CI/CD環境に簡単に統合できる
ユニットテストを統合することで、プログラムの品質向上と開発効率の向上が期待できます。
6. 実際のプロジェクトでの活用例
例えば、数学ライブラリmy_utilsを開発している場合、テストコードをtestsディレクトリにまとめます。
add_executable(test_math tests/test_math.cpp)
target_link_libraries(test_math PRIVATE my_utils)
add_test(NAME MathTest COMMAND test_math)
ビルド後にctestを実行するだけで、すべてのユニットテストが自動で実行されます。