SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

実例で学ぶ、コード品質の高め方

どうやってコード品質を上げるのか? 実例で学ぶリファクタリング

第3回 ステップ・バイ・ステップで学ぶC++コードのリファクタリング

ステップ5:単体テストの追加

 切り出したcalculateTotalAndAverage関数に対してテストコードを用意しましょう。プログラミング言語ごとに便利なテスト実行ツールがあると思います。今回はC++ですので、Google Testを利用した例を紹介します。Google Test はGitHubのリポジトリ上に豊富なドキュメントがありますが、日本語の情報は限られているようなので、ここで簡単に導入方法を説明しておきます。

 ソースコードをダウンロードします。2023年11月5日時点での最新バージョンはv.14.0です。

$ cd /tmp
$ wget https://github.com/google/googletest/archive/refs/tags/v1.14.0.tar.gz
$ tar xvfz v1.14.0.tar.gz

 cmake を使ってビルドします。

$ cd googletest-1.14.0
$ mkdir build
$ cd build
$ cmake ..
$ make

 システムにインストールします。管理者権限(sudo)が必要です。

$ sudo make install

 wgetやcmakeがインストールされていない場合は、最新版をインストールしてください。MacOS環境であれば、brewコマンドでインストールできます。

$ brew install wget
$ brew install cmake

 Google Testを利用したテストコードは例えば以下のようになります。

//calculateTotalAndAverageTest.cpp////////////////////////////////////////
#include <gtest/gtest.h>
#include "calculateTotalAndAverage.h"

// 正の価格値のテスト
TEST(CalculateTotalAndAverageTest, HandlesPositiveValues) {
    std::vector<double> prices = {29.99, 34.99, 24.99, 19.99};
    double total, average;
    std::tie(total, average) = calculateTotalAndAverage(prices);
    EXPECT_DOUBLE_EQ(109.96, total);  // 合計が正しいか
    EXPECT_DOUBLE_EQ(27.49, average); // 平均が正しいか
}

// 空のリストのテスト
TEST(CalculateTotalAndAverageTest, HandlesEmptyList) {
    std::vector<double> prices = {};
    double total, average;
    std::tie(total, average) = calculateTotalAndAverage(prices);
    EXPECT_DOUBLE_EQ(0.0, total);  // 合計が正しいか
    EXPECT_DOUBLE_EQ(0.0, average); // 平均が正しいか
}

// 単一価格値のテスト
TEST(CalculateTotalAndAverageTest, HandlesSingleValue) {
    std::vector<double> prices = {49.99};
    double total, average;
    std::tie(total, average) = calculateTotalAndAverage(prices);
    EXPECT_DOUBLE_EQ(49.99, total);  // 合計が正しいか
    EXPECT_DOUBLE_EQ(49.99, average); // 平均が正しいか
}

// 負の価格値を含むリストのテスト
TEST(CalculateTotalAndAverageTest, HandlesNegativeValues) {
    std::vector<double> prices = {-10.0, 20.0, -30.0, 40.0};
    double total, average;
    std::tie(total, average) = calculateTotalAndAverage(prices);
    EXPECT_DOUBLE_EQ(20.0, total);  // 合計が正しいか
    EXPECT_DOUBLE_EQ(5.0, average);  // 平均が正しいか
}

int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

 テストを実装したら、先ほどのコードに対してテストを実行し、テストがパスすることを確認しましょう。単体テストを実行するには、まずテストコードを含むソースファイルをコンパイルして、テスト実行ファイルを作成する必要があります。以下の手順でテストをビルドして実行できます。

1. テストファイルのコンパイル

 テストファイルをコンパイルするには、次のようなコマンドを使用します。

g++ -std=c++14 -o calculateTotalAndAverageTest calculateTotalAndAverageTest.cpp calculateTotalAndAverage.cpp -lgtest -lgtest_main -pthread

 このコマンドは、-std=c++14を使用してC++14標準でコンパイルし[*2]、Google Testライブラリ(-lgtest -lgtest_main)とpthreadライブラリをリンクしています。これにより、calculateTotalAndAverageTest という実行ファイルが生成されます。

2. テストの実行

 ビルドプロセスが成功したら、次のコマンドでテストを実行できます。

./calculateTotalAndAverageTest

 このコマンドはテスト実行ファイルを実行し、Google Testがテストケースを自動的に見つけて実行します。テストの結果はターミナルに表示されます。

[*2] 当初は C++11 でビルドしようと思ったのですが、Google Test の最新版ライブラリはC++14以上のバージョンを要求していたので、やむなくC++14 としました。

次のページ
ステップ6:リファクタリング完了後にやるべきこと

この記事は参考になりましたか?

実例で学ぶ、コード品質の高め方連載記事一覧

もっと読む

この記事の著者

浅原 明広(株式会社Sider)(アサハラ アキヒロ)

 日本IBM、株式会社フィックスターズなどで、半導体製造装置や医療画像機器など、大小様々な組み込み製品向けのソフトウェア開発プロジェクトに従事。 現在、フィックスターズ子会社の株式会社Sider にて、ソースコードのコピペ管理ツール『CloneTracker』を開発・提供。最新のツールや方法論を用いた、ソフトウェア開発者体験の向上に強い関心を持つ。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

千葉 滋(東京大学情報理工学系研究科教授)(チバ シゲル)

東京大学 情報理工学系研究科 創造情報学専攻 教授

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/18854 2024/01/18 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー