0Pricing
C++ Academy · レッスン

フィクスチャとセットアップ

テストのセットアップを共有します

「フィクスチャとセットアップ」は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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. GTestのセットアップ
  2. アサーションとマッチャー
  3. フィクスチャとセットアップ
  4. GMockによるモック
← C++ Academyに戻る