ソフトウェア開発にとどまらない、PCを使う全ての人が対象となるシリーズ「業務効率化の道具箱」。第6回は、前回導入した「Google Test」の使い方と、「アサーション」「パス・カバレッジ」によるテストの方法を紹介する。
本シリーズでは、日々の業務を効率化し、定時できちんと帰宅する方法を紹介しています。主な業務効率化の例は、以下のようになります(詳しくは第154回参照)。
業務効率化の方法はさまざまです。今回も「ツールを導入する」に着目し、前回の『Google Testを使ってみよう』の続編となります。このツールを使い、「アサーション」と「パス・カバレッジの計測」を実施する具体的な方法を記述します。どちらも、テストや品質制御で強力なツールとなります。
単体テスト以降の工程でバグが発生すると、「なぜ作成しているときに気付かなかったのだろう……」と後悔することがあります。これを防ぐためにも、単体テストをしっかりやることは重要です。
単体テストは、プログラムの最小単位(1関数/メソッド単位)でテストするため、単純なバグを容易に検出、修正できます。ただし、作業量が多いため、実施は簡単ではありません。
単体テストをやらずに結合テストで一気にバグを摘出する開発戦略もありますが、修正箇所の識別、影響範囲の調査などが大変になります(単体テストでは、100ステップ前後のソースコードの中からバグを探しますが、結合テストでは、100万行からバグを摘出しなければなりません)。さらに、顧客を含めて実施するシステムテストまで工程が進むと、たとえ単純なバグでも、スケジュールの関係で、「緊急の修正対応」「運用でカバー」「次バージョンで修正」となり、気軽に修正できなくなります。まずは単体テストをきちんと実施することが非常に重要です。
前回は、単体テストのツールに着目し「Google Test」と「gcov/lcov」の導入方法を紹介しました。Google Testは、テストコードを記述し、効率よくテストするツールです。また、gcov/lcovを使うことで、実行時のパス計測が可能です。なお、環境構築の手順は、第157回と第158回をご覧ください。
今回は、例題のプログラムを題材として、Google Testの使い方を紹介します。
まず、Google Testの記述方法を解説します。
下記に例題で使用するプログラムを示します(リスト1)。
//例題プログラム #include <gtest/gtest.h> //テスト対象 int sum(int a, int b){ return a + b; } int main(int argc, char **argv) { //Google Testの初期化 ::testing::InitGoogleTest(&argc, argv); //全テスト実行 return RUN_ALL_TESTS(); } //Sum関数のテスト, 結果の確認 TEST(SumTest, CheckResult){ EXPECT_EQ(30, sum(14,16); EXPECT_EQ(20, sum(5,15); EXPECT_EQ(90, sum(30,60); }
これは、2つの引数を加算するsum関数をテストするプログラムです。
Google Testでは、初期化とテスト実行を以下のように記述します(リスト2)。
//例題プログラム #include <gtest/gtest.h> int main(int argc, char **argv) { //Google Testの初期化 ::testing::InitGoogleTest(&argc, argv); //全テスト実行 return RUN_ALL_TESTS(); }
Google Testは、ヘッダファイルを読み込んで使います。例題の「#include
Google Testを使用する場合は、「InitGoogleTest」と記述します。これで、Google Testを使用する準備が整いました。
テスト実行する際は、「RUN_ALL_TESTS()」と記述します。これにより、記述したテストコードを全て実行できます。
Copyright © ITmedia, Inc. All Rights Reserved.