フィクスチャとセットアップ
テストのセットアップを共有します
「フィクスチャとセットアップ」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
テスト間でセットアップを共有する
複数のテストで同じオブジェクトが必要な場合、フィクスチャを使うとセットアップを一度だけ定義できます。フィクスチャとは、::testing::Testを継承するクラスです。
フィクスチャを定義する
フィクスチャのメンバーは、それを使用する各テストからアクセスできます。SetUp()は各テストの前に実行され、TearDown()は後に実行されます。
#include <gtest/gtest.h>
#include <vector>
class VectorTest : public ::testing::Test {
protected:
std::vector<int> v;
void SetUp() override { v = {1, 2, 3}; }
};TEST_Fを使う
フィクスチャを使うテストはTEST_Fで記述し、最初の引数にフィクスチャクラス名を渡します。
#include <gtest/gtest.h>
#include <vector>
class VectorTest : public ::testing::Test {
protected:
std::vector<int> v{1, 2, 3};
};
TEST_F(VectorTest, HasThree) {
EXPECT_EQ(v.size(), 3u);
}
TEST_F(VectorTest, FirstIsOne) {
EXPECT_EQ(v.front(), 1);
}テストごとに新しいインスタンスを作成する
GTestはテストごとに新しいフィクスチャオブジェクトを作成します。テスト間で可変状態を共有することはないため、テストは独立し、実行順序にも左右されません。
SetUpとコンストラクターの違い
メンバーはコンストラクターまたはSetUp()で初期化できます。初期化で例外が発生する可能性がある場合や、安全に仮想メソッドを呼び出したい場合はSetUp()を使います。
#include <gtest/gtest.h>
class Resource : public ::testing::Test {
protected:
int* data = nullptr;
void SetUp() override { data = new int(10); }
void TearDown() override { delete data; }
};
TEST_F(Resource, HasTen) {
EXPECT_EQ(*data, 10);
}クリーンアップにTearDownを使う
TearDown()は、SetUp()で取得したリソースを解放します。RAIIメンバーを使っている場合は、デストラクターがこれを自動的に処理することが多いため、TearDown()はまったく必要ない場合もあります。
スイートレベルのセットアップ
コストの高い共有リソースには、静的なSetUpTestSuite()とTearDownTestSuite()を使います。これらはテストごとではなく、スイートごとに一度実行されます。
#include <gtest/gtest.h>
class DbTest : public ::testing::Test {
protected:
static void SetUpTestSuite() { /* open shared connection */ }
static void TearDownTestSuite() { /* close it */ }
};テスト単位とスイート単位
慎重に選択してください。
SetUp/TearDown:テストごと、分離され、安全SetUpTestSuite/TearDownTestSuite:スイートごと、共有され、高速ですが、テストが干渉する可能性があります
ヘルパーメソッド
フィクスチャには、複数のテストで使うヘルパーメソッドを定義できます。これにより、各テストをアサーションに集中させられます。
#include <gtest/gtest.h>
#include <string>
class ParserTest : public ::testing::Test {
protected:
int parse(const std::string& s) { return std::stoi(s); }
};
TEST_F(ParserTest, ParsesNumber) {
EXPECT_EQ(parse("42"), 42);
}グローバル環境
プロセス全体のセットアップ(すべてのテストの前に一度だけ実行する処理)には、AddGlobalTestEnvironmentを使って::testing::Environmentを登録します。ロギングやフレームワークの初期化に便利です。
テストを独立させる
各TEST_Fは新しいフィクスチャを取得するため、別のテストによる副作用に依存してはいけません。独立性があれば、失敗の原因を特定しやすく、テストを安全に並列実行できます。
確認問題
フィクスチャのライフサイクルを思い出してください。
まとめ
フィクスチャを学びました。
::testing::Testを継承し、TEST_Fを使いますSetUp/TearDownはテストごとに実行され、毎回新しいオブジェクトが作成されます- 共有するスイート単位のリソースには
SetUpTestSuiteを使います - ヘルパーとグローバル環境は、大規模なテストスイートに役立ちます
よくある質問
「フィクスチャとセットアップ」レッスンは無料ですか?
はい。「フィクスチャとセットアップ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「フィクスチャとセットアップ」で何を学びますか?
テストのセットアップを共有します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「フィクスチャとセットアップ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- GTestのセットアップ
- アサーションとマッチャー
- フィクスチャとセットアップ
- GMockによるモック