ChatGPTにきいた 後で触ってまとめ直す予定
A
Google Test(gtest)は、C++で書かれたコードをテストするためのフレームワークです。TEST_P()マクロは、パラメータ化されたテストを定義する際に使用します。パラメータ化されたテストは、複数の入力値を持つテストケースを効率的に作成できるため、コードの再利用性が向上します。
それでは、新人エンジニアの皆さんにTEST_P()の使い方を説明しましょう。例として、文字列を逆にする関数reverse_string
のテストを考えます。
#include <gtest/gtest.h>using testing::TestWithParam; using testing::Values;
- 次に、テストしたい関数
reverse_string
を定義します。
std::string reverse_string(const std::string &input) { std::string reversed(input.rbegin(), input.rend()); return reversed; }
- テストケースを定義するために、
TestWithParam
を継承したReverseStringTest
クラスを作成します。このクラスは、テスト対象の関数に渡すパラメータと期待される結果を持つペア(std::pair
)を使用します。
class ReverseStringTest : public TestWithParam<std::pair<std::string, std::string>> { };
- TEST_Pマクロを使用して、パラメータ化されたテストを定義します。この例では、
ReverseStringTest
クラスのCheck
テストを定義しています。
TEST_P(ReverseStringTest, Check) { std::pair<std::string, std::string> test_data = GetParam(); std::string input = test_data.first; std::string expected_output = test_data.second; EXPECT_EQ(reverse_string(input), expected_output); }
- 最後に、INSTANTIATE_TEST_SUITE_Pマクロを使って、テストに使用するパラメータのセットを定義します。
INSTANTIATE_TEST_SUITE_P( ReverseStringTestCases, ReverseStringTest, Values(std::make_pair("abc", "cba"), std::make_pair("123", "321"), std::make_pair("あいう", "ういあ")));
- テストを実行するために、main関数を追加します。
int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
これで、TEST_P()を使ってパラメータ化されたテストを作成し、実行する準備が整いました。今回の例では、reverse_string
関数が正しく文字列を逆にするかどうかを3つの異なる入力値を使って確認できます。
Q
引数が5つある関数をテストする例を教えてくれませんか?
A
もちろんです。引数が5つある関数のテスト例を示します。この例では、5つの整数を引数にとり、それらの整数の合計を計算するsum_of_integers
関数をテストします。
#include <gtest/gtest.h>using testing::TestWithParam; using testing::Values;
- 次に、テストしたい関数
sum_of_integers
を定義します。
int sum_of_integers(int a, int b, int c, int d, int e) { return a + b + c + d + e; }
- テストケースを定義するために、
TestWithParam
を継承したSumOfIntegersTest
クラスを作成します。このクラスは、テスト対象の関数に渡すパラメータと期待される結果を持つタプルを使用します。
class SumOfIntegersTest : public TestWithParam<std::tuple<int, int, int, int, int, int>> { };
- TEST_Pマクロを使用して、パラメータ化されたテストを定義します。この例では、
SumOfIntegersTest
クラスのCheck
テストを定義しています。
TEST_P(SumOfIntegersTest, Check) { auto [a, b, c, d, e, expected] = GetParam(); EXPECT_EQ(sum_of_integers(a, b, c, d, e), expected); }
- 最後に、INSTANTIATE_TEST_SUITE_Pマクロを使って、テストに使用するパラメータのセットを定義します。
INSTANTIATE_TEST_SUITE_P( SumOfIntegersTestCases, SumOfIntegersTest, Values(std::make_tuple(1, 2, 3, 4, 5, 15), std::make_tuple(-1, 2, -3, 4, -5, -3), std::make_tuple(0, 0, 0, 0, 0, 0)));
- テストを実行するために、main関数を追加します。
int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
これで、引数が5つある関数のパラメータ化されたテストを作成し、実行する準備が整いました。今回の例では、sum_of_integers
関数が正しく5つの整数の合計を計算するかどうかを3つの異なる入力値を使って確認できます。
Q
テスト対象のコードはシステムの実装として別で存在しており、 テスト実行コードはそれとは別でファイルを拵えるようにしたいです。 そのような構成にする場合どのようなコードになりますか?
A
テスト対象のコードとテスト実行コードを別々のファイルに分ける場合、以下のような構成になります。
ファイル構成:
project/ ├── src/ │ ├── sum_of_integers.cpp │ └── sum_of_integers.h └── tests/ ├── sum_of_integers_test.cpp └── CMakeLists.txt (オプション: CMakeを使用する場合)
src/sum_of_integers.h:
#pragma once // テスト対象の関数 int sum_of_integers(int a, int b, int c, int d, int e);
src/sum_of_integers.cpp:
#include "sum_of_integers.h"int sum_of_integers(int a, int b, int c, int d, int e) { return a + b + c + d + e; }
tests/sum_of_integers_test.cpp:
#include <gtest/gtest.h>#include <tuple>#include "sum_of_integers.h"// 必要な名前空間を使用 using testing::TestWithParam; using testing::Values; // パラメータ化されたテストケースを定義するクラス class SumOfIntegersTest : public TestWithParam<std::tuple<int, int, int, int, int, int>> { }; // パラメータ化されたテストを定義 TEST_P(SumOfIntegersTest, Check) { auto [a, b, c, d, e, expected] = GetParam(); EXPECT_EQ(sum_of_integers(a, b, c, d, e), expected); } // テストに使用するパラメータのセットを定義 INSTANTIATE_TEST_SUITE_P( SumOfIntegersTestCases, SumOfIntegersTest, Values(std::make_tuple(1, 2, 3, 4, 5, 15), std::make_tuple(-1, 2, -3, 4, -5, -3), std::make_tuple(0, 0, 0, 0, 0, 0))); // テストを実行するためのmain関数 int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
この構成では、sum_of_integers.h
とsum_of_integers.cpp
がテスト対象のコードで、sum_of_integers_test.cpp
がテスト実行コードです。テスト対象の関数sum_of_integers
を別ファイルに定義し、テスト実行コードではそのヘッダーファイルをインクルードしています。
プロジェクトのビルドと実行には、ビルドシステムを選択して設定する必要があります。例えば、CMakeを使用してビルドとテストを実行するためのCMakeLists.txt
ファイルを作成できます。