業務効率化の道具箱(5)Google Testを使ってみよう【その1】:山浦恒央の“くみこみ”な話(158)(3/3 ページ)
ソフトウェア開発にとどまらない、PCを使う全ての人が対象となるシリーズ「業務効率化の道具箱」。第5回は、単体テストで役立つフリーのツールである「Google Test」と「gcov/lcov」を紹介する。
6.動作確認
上記の5項で導入したツールが正しく動作するか確認します。今回は、以下の絶対値を求めるプログラムを例題として進めます(リスト1〜3)。
//引数valueが0より小さい場合は、valueの絶対値を返す #include "myabs.h" int myabs(int value){ if (value < 0){ value = value * (-1); } else { return value; } return value; }
int myabs(int value);
//Google Test側のプログラム #include <gtest/gtest.h> #include "myabs.h" int main(int argc, char **argv){ //Google Testの初期化 ::testing::InitGoogleTest(&argc, argv); //テスト実行 return RUN_ALL_TESTS(); } TEST(AbsTest, Value){ //-5を入力し、絶対値が5となることを確認する EXPECT_EQ(5, myabs(-5)); }
リスト1〜3は、絶対値を求めるプログラムのテスト例です。リスト1と2は、入力した引数の絶対値を求めるプログラムで、リスト3は、Google Testのテストコードになります。
Google Testでは、「InitGoogleTest」で初期化処理を記述し、「RUN_ALL_TESTS」でテストを実行します。「EXPECT_EQ」と記述することで、入力と出力が一致するか確認できます。今回は、myabs(-5)を実行します。期待値は5なので、きちんと5が返ってくるか確かめます。
6.1 Google Testの実行確認
下記のコマンドを実行し、Google Testが実行できるか確認します(リスト4)。
g++ myabs.cpp gTestMain.cpp -lgtest -lgtest_main ./a.out
./a.outを実行すると、図2の出力結果が出ることを確認します。
図2は、プログラムの出力結果です。「./a.out」を実行して、実行結果の左側に緑の文字が出ていれば、正しい出力結果であると確認できます。なお、赤の字になると、期待値が一致していないことを表しています。
6.2 gcovの確認
次は、gcovの動作確認をします。
gcovの確認をするには、リスト5に示すコマンドを実行します。
g++ -fprofile-arcs -ftest-coverage myabs.cpp gTestMain.cpp -lgtest -lgtest_main ./a.out gcov -b a-myabs.gcda
g++のオプションに「-fprofile-arcs -ftest-coverage」を追加して実行すると、「.gcda」ファイルを出力します。その後、「gcov a-myabs.gcda」を実行することでカバレッジデータを出力します(図3)。
図3は、gcovの出力結果です。「Line executed:80% of 5」と書いてあり、C0:80%は網羅できていることが分かります。
ちなみに、gcdaファイルなどがある状態で、再度実行しようとすると、エラーが出るので、削除しましょう。削除するコマンドは以下です。
rm *.gcda *.gcno
6.3 lcovの確認
gcovは、カバレッジの計測値は分かっても、どの行が未到達パスか確認するのが少し困難です。以下のコマンドを実行し、未到達パスを確認します。
lcov -d . -c --rc lcov_branch_coverage=1 -o LcovData.info genhtml LcovData.info --branch-coverage -o ./info
コマンドを実行すると、InfoフォルダにHTMLファイルを出力します。フォルダ内の、index.htmlを確認しましょう。一通りの出力結果が入っています。今回は、その中にあるmyabs.cppを開いてみましょう(図4)。
図4は、lcovのカバレッジレポートです。青が到達済みのパスで、赤が未到達パスであると確認できます。結果を見ると、Line(C0カバレッジ)が80%で、Branch(C1カバレッジ)が50%であると分かりますね。
7.終わりに
今回は、「ツールの導入」に着目し、Google Testとgcov/lcovの環境構築と簡単な動作確認を実施しました。単体テストは、地味で面倒な作業を淡々とこなさねばなりません。有償/無償を問わずツールを導入し、効率化をご検討ください。
世の中には、さまざまなツールが存在します。「この業務を効率化したい」と思ったとき、みんな同じように考えていて、効率化できるツールが必ずあります。ツールを使った問題解決を一つの選択肢として考えていただければと思います。
山浦先生の書籍が発売中です!
前々シリーズ「ソフトウェア技術者のためのバグ百科事典」を大幅に加筆、修正した山浦恒央先生の書籍「ソフトウェア技術者のためのバグ検出テキスト」が日科技連出版から好評発売中です。連載でも取り上げた、「要求仕様書のバグ」「実装抜けのバグ」「テスト業務のバグ」など、バグを36種類に分類して解説しています。囲碁や将棋であれば、「相掛かり」「矢倉」「四間飛車」「藤井システム」のような戦法を網羅した内容になっています。
前著「ソフトウェア技術者のためのバグ検出ドリル」(2019年11月刊行)も好評発売中です。実際にバグを含む要求仕様書、設計書、コーディング、デバッグ、保守を具体的に取り上げ、練習問題として31問を出題しました。同書は、囲碁や将棋における「次の一手」的な問題であり、ピンポイントの場面を取り上げ、実践力を鍛えることを目的としています。
両書とも興味のある方は、Amazon.comや書店でチェックしてください!
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- ≫連載「山浦恒央の“くみこみ”な話」バックナンバー
- 業務効率化の道具箱(4)VirtualBoxでUbuntu環境を構築しよう
ソフトウェア開発にとどまらない、PCを使う全ての人が対象となるシリーズ「業務効率化の道具箱」。第4回は、仮想化ソフトウェアの「VirtualBox」を使って、Windows PC上にLinuxのUbuntuの環境を構築する方法を紹介する。 - 業務効率化の道具箱(3)続・ショートカットキー活用、「技術の複利効果」で作業効率が上がりミスも減る
ソフトウェア開発にとどまらない、PCを使う全ての人が対象となるシリーズ「業務効率化の道具箱」。第3回は、第2回に続きショートカットキーを紹介する。塵も積もれば山となる方式で得られる「技術の複利効果」により、急激に作業効率が上がり、同時にミスも減らせるはずだ。 - 業務効率化の道具箱(2)ショートカットキーも積もれば山となる
ソフトウェア開発にとどまらない、PCを使う全ての人が対象となるシリーズ「業務効率化の道具箱」。第2回は“塵も積もれば山になる”の効果を実感できるショートカットキーを紹介する。 - 業務効率化の道具箱(1)ソフト開発だけじゃないPCの業務効率を高める5つの道筋
今回から新シリーズ「業務効率化の道具箱」がスタート。ソフトウェア開発にとどまらない、PCを使う全ての人が対象となる。シリーズ第1回はイントロダクション編として、業務を効率化する方法にどのようなものがあるのかを提示する。 - テストでバグ発見!(1)まずは成人判定プログラムでチュートリアル
今回から、提示された仕様とプログラム(バグを含む)から、自身の手でテストケースを設計し、バグを実際に見つけ、バグレポートまでを作成する実践的なシリーズ「テストでバグ発見!」が始まります。第1回は、チュートリアルとして成人判定プログラムからバグを発見してみましょう。