#19 C++で学ぶテスト(単体テスト)の基本

C++で関数を書いた後、それが正しく動くかをprintf文で確認するだけで済ませていませんか?この記事では、C++で書いたコードを自動でチェックする「テスト」の基本を解説します。

なぜテストを書くのか

コードを修正するたびに、関連する関数が壊れていないかを手作業で確認するのは大変です。テストを用意しておけば、コマンド一つで動作確認ができ、安心してコードを直せるようになります。C++は特に、ポインタやメモリ管理が絡む処理でバグが起きやすいため、テストの価値が高い言語です。

Catch2を使ったテストの書き方

C++ではCatch2というテスト用ライブラリがよく使われます。ヘッダーファイル1つを追加するだけで使い始められる手軽さが特徴です。

int add(int a, int b) {
    return a + b;
}
#define CATCH_CONFIG_MAIN
#include "catch.hpp"

TEST_CASE("2と3を足すと5になる") {
    REQUIRE(add(2, 3) == 5);
}

TEST_CASEというマクロでテストの名前を書き、REQUIREマクロで「この条件が真であるはず」を宣言します。コンパイルして実行すると、テストの結果が一覧表示されます。

複数パターンをまとめてテストする

SECTIONを使うと、1つのテストケースの中で複数のパターンを整理して書けます。

TEST_CASE("加算のテスト") {
    SECTION("正の数同士") {
        REQUIRE(add(2, 3) == 5);
    }
    SECTION("0を含む場合") {
        REQUIRE(add(0, 0) == 0);
    }
}

例外の発生もテストする

特定の条件で例外が発生することを確認したい場合はREQUIRE_THROWS_ASが使えます。

TEST_CASE("0で割ると例外が発生する") {
    REQUIRE_THROWS_AS(divide(10, 0), std::runtime_error);
}

C++ならではの注意点

C++はメモリを自分で管理する場面が多い言語です。特にポインタを使う関数では、テストの中でメモリの解放漏れ(メモリリーク)が起きていないかも意識する必要があります。Valgrindのようなメモリ検査ツールをテストと組み合わせて使うと、通常のテストでは見つけにくいメモリ関連のバグも発見しやすくなります。

まとめ

テストは「正しく動くことを保証する仕組み」であり、安心してコードを修正するための土台になります。TEST_CASE・REQUIRE・REQUIRE_THROWS_ASから始めて、メモリ管理の検証にも意識を向けてみてください。

関連記事


本ページはプロモーションを含みます。

参考書籍(PR)

C++をもっと学びたい方には「新・明解C++入門編」がおすすめです。


PR

コードを書かずに自動化したい方へ

「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動く Windows専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。

コメント

このブログの人気の投稿

#25 Rustで学ぶAI API(ChatGPT等)の呼び出し方の基本

#8 C++で学ぶ文字列操作の基本

#16 TypeScriptで学ぶ辞書型(マップ)の基本