0Pricing
C++ Academy · レッスン

アサーションとマッチャー

表現力の高い検証を記述します

「アサーションとマッチャー」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

アサーションで期待値を表現する

GTestのアサーションは、テスト内の条件を検証します。重大度には2種類あります。

  • EXPECT_*:失敗を記録しますが、テストは続行します
  • ASSERT_*:失敗すると現在のテストを直ちに停止します

EXPECTとASSERTの違い

続行するとクラッシュする可能性がある場合(nullチェックの後など)はASSERT_*を使い、それ以外ではEXPECT_*を使います。そうすると、すべての失敗を一度に確認できます。

#include <gtest/gtest.h>

TEST(Demo, MixedChecks) {
    int* p = new int(5);
    ASSERT_NE(p, nullptr);
    EXPECT_EQ(*p, 5);
    delete p;
}

比較アサーション

主な比較マクロは次のとおりです。

  • EXPECT_EQ、EXPECT_NE
  • EXPECT_LT、EXPECT_LE
  • EXPECT_GT、EXPECT_GE
#include <gtest/gtest.h>

TEST(Compare, Numbers) {
    EXPECT_LT(2, 3);
    EXPECT_GE(5, 5);
}

ブール値アサーション

EXPECT_TRUEとEXPECT_FALSEは、ブール条件を直接検証します。

#include <gtest/gtest.h>

bool is_even(int n) { return n % 2 == 0; }

TEST(Bool, Even) {
    EXPECT_TRUE(is_even(4));
    EXPECT_FALSE(is_even(3));
}

浮動小数点数の比較

浮動小数点数にEXPECT_EQを使用してはいけません。許容誤差を指定したEXPECT_FLOAT_EQ、EXPECT_DOUBLE_EQ、またはEXPECT_NEARを使用します。

#include <gtest/gtest.h>

TEST(Floats, Approx) {
    EXPECT_DOUBLE_EQ(0.1 + 0.2, 0.3);
    EXPECT_NEAR(3.14159, 3.14, 0.01);
}

文字列アサーション

C文字列にはEXPECT_STREQ/EXPECT_STRNEを使用します。std::stringでは値による比較が行われるため、EXPECT_EQが使えます。

#include <gtest/gtest.h>
#include <string>

TEST(Strings, Compare) {
    EXPECT_STREQ("hi", "hi");
    EXPECT_EQ(std::string("ok"), "ok");
}

例外アサーション

コードが期待した例外を送出することを検証します。

#include <gtest/gtest.h>
#include <stdexcept>

void check(int n) {
    if (n < 0) throw std::runtime_error("neg");
}

TEST(Throws, Negative) {
    EXPECT_THROW(check(-1), std::runtime_error);
    EXPECT_NO_THROW(check(1));
}

カスタム失敗メッセージ

<<でアサーションに追加のコンテキストをストリーム出力すると、失敗の原因を特定しやすくなります。

#include <gtest/gtest.h>

TEST(Message, WithContext) {
    int x = 7;
    EXPECT_EQ(x, 7) << "x had unexpected value " << x;
}

EXPECT_THATでGMockのマッチャーを使う

EXPECT_THATは値とマッチャーを組み合わせて、表現力の高い検証を行います。たとえばEXPECT_THAT(v, ElementsAre(1, 2, 3))のように記述します。

#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include <vector>
using ::testing::ElementsAre;

TEST(Matchers, Vector) {
    std::vector<int> v{1, 2, 3};
    EXPECT_THAT(v, ElementsAre(1, 2, 3));
}

便利なマッチャー

よく使うマッチャーには次のようなものがあります。

  • Eq、Ne、Gt、Lt
  • Contains、ElementsAre、UnorderedElementsAre
  • HasSubstr、StartsWith、EndsWith

適切なアサーションの選択

できるだけ具体的なアサーションを使ってください。一般的なEXPECT_TRUEよりも、失敗メッセージが明確になります。EXPECT_EQ(a, b)は両方の値を表示しますが、EXPECT_TRUE(a == b)は表示しません。

確認問題

EXPECTとASSERTの違いを思い出してください。

まとめ

GTestのアサーションを学びました。

  • EXPECT_*は続行し、ASSERT_*はテストを中止します
  • 比較、ブール値、浮動小数点数、文字列、例外の各マクロ
  • <<で追加のコンテキストをストリーム出力します
  • EXPECT_THATとマッチャーで表現力の高い検証を行います

よくある質問

「アサーションとマッチャー」レッスンは無料ですか?

はい。「アサーションとマッチャー」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「アサーションとマッチャー」で何を学びますか?

表現力の高い検証を記述します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「アサーションとマッチャー」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

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