.logbook

学んだことを書き綴る、言わば航海日誌です。

cygwin+eclipse cdtでGoogle TestとGoogle Mockを使用したTDD環境を構築する

Windows上でC/C++を使って開発する際、cygwin+eclipse cdtを使用している。今回、Google TestとGoogle Mockを用いてTDD(テスト駆動開発)の環境を構築する。

Google Test, Google Mockのダウンロード

下記からそれぞれダウンロードする。

gtest-1.7.0.zip - googletest - Source release 1.7.0 - Google C++ Testing Framework - Google Project Hosting gmock-1.7.0.zip - googlemock - Source release 1.7.0 - Google C++ Mocking Framework - Google Project Hosting

zipを解凍して、下記ディレクトリへ格納する。

C:\cygwin\googletest\gtest-1.7.0
C:\cygwin\googletest\gmock-1.7.0

Google Test, Google Mockのビルド

cygwinのターミナルを開き、下記順にてコマンドを入力する。 ただし、事前にcygwin上でg++、makeをインストールし、makeがWindowsのドライブレターを正しく認識できない問題を解決しておくこと。

cygwin+eclipse cdtでC言語をビルドするとエラー発生 - .logbook

$ cd /cygdrive/c/cygwin/googletest/gtest-1.7.0/make/
$ make
$ cd /cygdrive/c/cygwin/googletest/gmock-1.7.0/make/
$ make

ビルドに成功すると、下記のようにファイルが生成される。

C:\cygwin\googletest\gtest-1.7.0\make\gtest_main.a
C:\cygwin\googletest\gmock-1.7.0\make\gmock_main.a

Google Test, Google Mockを使ってみる

正しくビルドできたことを確認するため、試しに使ってみる。 例題として下記を参考にした。

Cygwin上のg++でGoogle Mockを動かす - uhiaha888の日記

eclipse上でプロジェクトを作成する。(ツールチェーンはCygwin GCCとする)

f:id:ylgbk:20140215125709p:plain

「gtest_main.a」と「gmock_main.a」をプロジェクト直下にコピーし、「libgteest_main.a」と「libgmock_main.a」にリネームする。

f:id:ylgbk:20140215150756p:plain

下記のようにソースコードを作成する。

Painter.h

#ifndef _PAINTER_H
#define _PAINTER_H
#include "Turtle.h"

class Painter {
 public:
  Painter(Turtle* turtle)
    : turtle_(turtle){}
  ~Painter(){}

  bool DrawCircle(int x, int y, int r);
 private:
  Turtle* turtle_;
};
#endif // _PAINTER_H

Painter.cpp

#include "Painter.h"

bool Painter::DrawCircle(int x, int y, int r)
{
  turtle_->PenDown();
  return true;
}

Turtle.h

#ifndef _TURTLE_H
#define _TURTLE_H

class Turtle {
 public:
  Turtle(){}
  virtual ~Turtle() {}

  virtual void PenUp() = 0;
  virtual void PenDown() = 0;
};
#endif // _TURTLE_H

MockTurtle.h

#ifndef _MOCK_TURTLE_H
#define _MOCK_TURTLE_H
#include "gmock/gmock.h"
#include "Turtle.h"

class MockTurtle : public Turtle {
 public:
  MOCK_METHOD0(PenUp, void());  
  MOCK_METHOD0(PenDown, void());
};
#endif // _MOCK_TURTLE_H

PainterTest.cpp

#include "MockTurtle.h"
#include "Painter.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
using ::testing::AtLeast;

TEST(PainterTest, CanDrawSomething)
{
  MockTurtle turtle;
  EXPECT_CALL(turtle, PenDown())
    .Times(AtLeast(1));

  Painter painter(&turtle);

  EXPECT_TRUE(painter.DrawCircle(0, 0, 10));
}

eclipse上からプロジェクトを右クリック→プロパティ→C/C++ ビルド→設定の順で開く。

Cygwin C++ Compilerのインクルードパスに下記を追加する。

"C:\cygwin\googletest\gtest-1.7.0\include"
"C:\cygwin\googletest\gmock-1.7.0\include"

f:id:ylgbk:20140215150310p:plain

Cygwin C++ Linkerのライブラリを設定する。

ライブラリーに「gmock_main」と「gmock_mock」を追加。
ライブラリー検索パスを「プロジェクト直下」に設定。

f:id:ylgbk:20140215150930p:plain

テストを実行する

メニューバーの実行→実行をクリックするとテストを実行できる。