22 Sep 2012, 01:02

JenkinsでGoogleTestのテスト結果を表示する方法を調べてみた。

GoogleTest(gtest)のテスト結果をJenkinsで表示する方法を調べてみた。

GoogleTestで出力されるXML出力結果はJUnitのフォーマット(junitreport Ant タスク)

にもとづいているため、Jenkinsに取り込んで解析することができるらしい。

GoogleTestのテスト結果をXML形式で出力する

テスト実行時に、以下のオプションとともに実行するとxML形式でテスト結果が出力される。 –gtest_output=xml:(ファイル名)がオプションだ。

[text](プログラム).exe 窶堵test_output=xml:(出力ファイル名).xml[/text]

こんな感じでXML出力される。


<testsuites tests="3" failures="0" disabled="0" errors="0" time="0.012" name="AllTests">
  <testsuite name="MockNumTest" tests="3" failures="0" disabled="0" errors="0" time="0.006">
    <testcase name="return1" status="run" time="0" classname="MockNumTest" />
    <testcase name="return2" status="run" time="0" classname="MockNumTest" />
    <testcase name="return3" status="run" time="0" classname="MockNumTest" />
  </testsuite>
</testsuites>

XML形式のテスト結果をJenkinsで表示する

次はjenkinsの設定。ジョブの設定画面を開く。

[プロジェクトの高度なオプション] > [カスタムワークスペースの使用]

にチェックを入れて、テスト出力ファイルのディレクトリの指定。

[ビルド]を選択して、ビルドを実行するための方法を選択。

ここでは、Windowsバッチコマンドで実行する。

[text]

cd “C:\Users\hogehoge\Dropbox\src\mock_study”

make clean

make

target.exe –gtest_output=”xml:test_result.xml”

[/text]

Windowsバッチコマンドがでmakeができないときは、

WindowsサービスでJenkinsを立ち上げるのをやめるとよい。

参考:WindowsバッチファイルをJenkinsで起動したらネットにアクセスできないツꀀ

[ビルド後の処理] > [JUnitテスト結果の集計]を選択。テスト結果ファイル名を入力。

image

テスト出力結果

こんな感じで出力された。

image

参考リンク

GoogleTest – 上級ガイド – XMLレポート

10 Sep 2012, 11:53

GoogleMockのモックメゾッドにC言語の構造体ポインタを渡してみた

今日は体調不良のため、定時退社というなの早退をして、

家に帰ってきた瞬間に治ったので、ブログを更新してみる。

今の開発だと、制御用のメモリを構造体ポインタの形でやり取りすることが多い。

構造体ポインタをGoogleMockの モックメゾッド(MOCK_METHODx)にわたすと、

コンパイルが通らない。悩んだ上げく、以下の方法でできた。

Mockオブジェクトの中で、構造体をメンバごとに分解して、渡してやる

MOCK_METHODに渡すときには、構造体のメンバごとに引数に渡してやればいいだけ。

[C]

typedef struct hogehoge {

int x;

int y;

}HOGE;

[/C]

なので、構造体の場合は、

MOCK_METHOD0(hoge);

だとエラーするので、

MOCK_METHOD2(hoge->x, hoge->y);

と分解すればよい。

前回エントリのサンブルソースを少し改造

sample.c

[C]

#include “sample.h”

int get_ret(void)

{

int num = 0;

int ret;

NUM dummy;

dummy.num = 2;

dummy.count = 3;

/**N 数をライブラリより取得 */

num = get_num(&dummy);

/**N 結果によって分岐 */

if( num == 1 ) {

ret = 10;

}

else if( num == 2 ){

ret = 20;

}

else {

ret = 30;

}

return ret;

}

[/C]

numlib.h

[C]

typedef struct NUM

{

int num;

int count;

}NUM;

#ifdef __cplusplus

extern “C” {

#endif

extern int(*get_num)(NUM *num);

[/C]

gmock_test.cpp

[C]

extern “C”

{

#include “sample.h”

}

#include “gtest/gtest.h” /**N GoogleTest インクルード */

#include “gmock/gmock.h” /**N GoogleMock インクルード */

using ::testing::Return;

using ::testing::_;

using ::testing::Eq;

/**N モッククラス */

class MockNum

{

public:

MOCK_METHOD2(get_num2, int(int num, int count) );

} mock;

int Mockget_num(NUM *num)

{

return mock.get_num2(num->num, num->count);

}

/**N get_num 実体 */

int (*get_num)(NUM *num);

/**N テスト */

class MockNumTest : public ::testing::Test

{

int (*savedget_num)(NUM *num);

virtual void SetUp()

{

savedget_num = get_num;

get_num = Mockget_num;

}

virtual void TearDown()

{

get_num = savedget_num;

}

};

TEST_F(MockNumTest, return1)

{

EXPECT_CALL(mock, get_num2(_,_) )

.WillOnce(Return(1));

EXPECT_EQ(10, get_ret() );

}

TEST_F(MockNumTest, return2)

{

EXPECT_CALL(mock, get_num2(2,3) ).WillOnce(Return(2));

EXPECT_EQ(20, get_ret() );

}

TEST_F(MockNumTest, return3)

{

EXPECT_CALL(mock, get_num2(Eq(2),Eq(3)) ).WillOnce(Return(3));

EXPECT_EQ(30, get_ret() );

}

[/C]