Google Test を使ってみる(その2:サンプル実行編)
前回は「Google Test」が実行できる環境を整えました。
今回は Google Test を使った簡単なサンプルプログラムを動かしてみます。
なぜ単体テストフレームワークを使うのか
#ソフトウェアのテストは、テスト対象を可能な限り小さい単位で、しっかり実施しておくことが重要です。
テスト対象が複雑に結合された巨大なモノリス(一枚岩)になってしまってからテストを実施すると、障害の原因を突き止めるのに非常に時間と労力を要します。
またテストには「独立性」と「再現性」も求められます。
誰が何回実施しても同じ結果が得られる必要があります。
このようなテストを設計し、実行するのに「単体テストフレームワーク」が役立ちます。
フレームワークがテストの構造化を助け、テスト間の独立性を高めます。
また、適切に保守されたテストはテストの再現性を担保します。
簡単なサンプル
#Google Test を使った簡単なサンプルプログラムを以下に示します。
例題として
「1+2=3」
を選びました。
上記の演算を実現する関数を「add」(ファイル:add.h, add.cc)として定義します。
add.h
#ifndef ADD_H_
#define ADD_H_
int add(int a, int b);
#endif /* ADD_H_*/
add.cc
#include "add.h"
int add(int a, int b){
return 0; // わざと失敗させます
}
次に、この関数addをテストするテストケース「add_test」(ファイル:add_test.cc)を書いていきます。
add_test.cc
#include <gtest/gtest.h>
#include "add.h"
TEST(add_test, answer_1_plus_2){
EXPECT_EQ(3, add(1,2));
}
ソースコードの解説
#関数 add
#add.h と add.cc は解説するまでもありませんが、変数a と 変数b を加算した値を戻す関数を「add」として定義しています。
一つ注意する点としては 関数add は”今のところ”どんな 変数a, b を設定しても、戻り値として「0」を戻すように設計されています。
今回は簡単なサンプルプログラムを通して Google Test の動きを説明する回なので詳しくは説明しませんが、「テスト駆動開発」という手法では最初の実装時にはテストを必ず失敗させるようにテスト対象を実装します。
(ただし、変数a, b を加算した結果が0となる場合には正しい結果を戻すことになってしまいますが、今回は大目に見ます)
テストケース add_test
#関数addの動作を確認するテストの実装です。
#include <gtest/gtest.h>
は Google Test を利用するためのインクルード文です。
テストケースのソースコードの冒頭に設定します。
TEST(…) {}
はテストケースを作成するマクロ関数です。
このマクロ関数内にはC++のソースコードを書くことができます。
また、テストケースに名前を付けることが出来ます。
今回の
TEST(add_test, answer_1_plus_2)
は「add_test」がテストケース名で、「answer_1_plus_2」がテスト名になります。(マクロ内に書かれたソースコードが1+2を演算させるソースコードなので、テスト内容が分かるような名前を付けるのが良いでしょう)
EXPECT_EQ(3, add(1,2));
の「EXPECT_EQ」はアサーションです。
”EQ”アサーションは2つの引数が同じ値であることをチェックします。
比較結果が異なる場合、テストが失敗したことを通知します。
EXPECT_EQは現在実行中の関数を中断しません。
もし、現在実行中の関数を中断してそのまま抜ける場合は「ASSERT_EQ」を用います。
ただし後処理もスキップされてしまうのでC++の場合にはメモリリークに注意する必要があります。
ビルド
#コマンドラインから以下のコマンドを使ってビルドします。
g++ add.cc add_test.cc -o test -g -pthread -lgtest_main -lgtest
gtest, gtest_main は前回作成した Google Test のライブラリです。
pthread でPOSIXスレッドモデルを指定しています。
ビルドが成功すると「test.exe」というバイナリファイルが生成されているはずです。
実行
#コマンドラインから「test.exe」を実行します。
正しくビルドできている場合は、以下のような結果が出力されるはずです。
このように、テストが正常に”失敗”したことが確認できました。
まとめ
#今回は Google Test を使った簡単なテストを書いてみました。
最初は”わざとテストを失敗させる”など、通常とは異なった開発スタイル(テスト駆動開発)の入り口も経験しました。
次回以降はもう少し複雑なテストを組み立てていこうと思います。
ソフトウェアテストに関する技法やテクニックをまとめています。
テストに活用していただければ幸いです。