アサーションとマッチャー
表現力の高い検証を記述します
「アサーションとマッチャー」は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_NEEXPECT_LT、EXPECT_LEEXPECT_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、LtContains、ElementsAre、UnorderedElementsAreHasSubstr、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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- GTestのセットアップ
- アサーションとマッチャー
- フィクスチャとセットアップ
- GMockによるモック