2012年11月30日金曜日

iutest_c v1.0.0 をリリースしました

iutest_c は C言語で書かれたテスティングフレームワークです。

iutest と同様にヘッダオンリーで使用することができます。
C++ のテスティングフレームと比較して機能的には大分劣ります。
そもそも C言語のテスティングフレームが必要とされているのか疑問ではあります。
別にテストは C++ で書いてもいいわけですから。
(組み込みだとそうでもないのかなぁ)

ともあれ、 iutest_c の特徴的な機能を紹介したいと思います。

書き方
iutest_c は iutest から派生したプログラムです。
テストの書き方はほとんど同じです。
また、iutest は Google Test を踏襲してますので、 Google Test を使っている人には分かりやすいと思います。

もっとも簡単なテストを紹介します。

IUTEST(CaseName, TestName)
{
    int x = 0;
    IUTEST_ASSERT_EQ(0, x);
}

テストを自動検出して実行
iutest_c でもテストを自動で検出して実行します。
テストの登録用変数を定義したり、登録関数を呼んだり、面倒な手続きが不要です。
(※非対応コンパイラあり。その場合は、IUTEST_REIGSTER_TEST マクロで明示的な登録が必要です。)

テストフィクスチャ
iutest_c でもテストフィクスチャが使えます。

void TestF_SetUp(void)
{
  /* ここに SetUp コード */
}
static const iuTestFixture TestF = { NULL /* SetUpTestCase */
                                  , NULL /* TearDownTestCase */
                                  , TestF_SetUp /* SetUp */
                                  , NULL /* TearDwon */
                                  };
IUTEST_F(TestF, Hoge)
{
   IUTEST_ASSERT_TRUE(TRUE);
}

iuTestFixture 構造体に TestCaseSetUp/TearDown,SetUp/TearDown 関数を設定します。
テストケース名にこの変数名を指定して下さい。

簡易的なパラメタライズテスト
関数の引数に値を渡すテストを簡単に記述できます。
void TestFunction(int x, int y)
{
    IUTEST_ASSERT_EQ(x, y);
}
IUTEST_PMZ(ParamMethodTest, EQ, TestFunction, 0, 0);
IUTEST_PMZ(ParamMethodTest, EQ, TestFunction, 1, 1);
IUTEST_PMZ(ParamMethodTest, EQ, TestFunction, 2, 2);


今後の予定
値のパラメータ化テストに対応できるような気がしないでもないので、
v1.1 はそれを目標に開発を続けたいと思います。

2012年11月26日月曜日

autest 1.0.0 α をリリースしました

AutoIt 用テスティングフレームワーク autest をアルファリリースしました。
ダウンロードはこちらから

AutoIt は Windows 用のプログラム言語です。主に Windows の GUI 操作自動化に使用します。
詳しいことは、ここでは省きます。


今回、このテスティングフレームワークを作成したのは、
「AutoIt で GUI の自動テストを組んだとき、テストが失敗したときのログ出力を
しっかり書いておかないと、原因がわかりにくい」と感じたからです。

まずはアサーションの提供から
今回リリースした autest では、他のテスティングフレームワークに似たアサーションに対応しています。

サンプルを紹介します。
#include "../../include/autest.au3"

$NotepadClassName = "[CLASS:Notepad]"
$strSendTest = "hello world."

AUTEST_ASSERT_TRUE( Run("notepad.exe") )
AUTEST_EXPECT_TRUE( WinWaitActive($NotepadClassName, "", 5) )

AUTEST_EXPECT_TRUE( ControlSend($NotepadClassName, "", "Edit1", $strSendTest) )
AUTEST_EXPECT_STREQ( $strSendTest, ControlGetText($NotepadClassName, "", "Edit1") )

AUTEST_ASSERT_TRUE( WinClose($NotepadClassName) )

; 保存しますかダイアログが出るので、ここでタイムアウト失敗する
AUTEST_ASSERT_TRUE( WinWaitClose($NotepadClassName, "", 5) )

こちらのサンプルは
  • メモ帳を起動
  • 「Hello World.」と入力し
  • 入力内容を検証したのち
  • メモ帳を終了します(保存ダイアログが出るので、この処理はタイムアウトし失敗します)

実行した画面がこちらになります。



コンソールにはこのようなメッセージが出力されます。
sample.au3:30
error: Value of WinWaitClose($NotepadClassName, "", 5)
  Actual: 0
Expected: True

このメッセージから、
sample.au3 ファイルの 30行目 で WinWaitClose($NotepadClassName, "", 5) が 0 を返して失敗したということがひと目でわかります。

ビルド方法
autest のアサーション関数は通常の AutoIt のコンパイル方法でもエラーにならないよう設計されていますが、ファイルや行、コードの詳細を出力するには専用のビルド手順が必要になります。

こちらが先ほどのサンプルの Makefile になります。
SOURCES = sample.au3

build: DEFAULT_TARGETS

include $(AUTEST_ROOT)/toolchain/commondefs

Make 用の定義などはすべて commondefs ファイルに記述されています。
ユーザーが記述するのは以上になります。

あとは普通に Make するだけです。

どういう仕組みか
Make で何をしているかというと、
  1. SOURCES で定義されたファイルを '#' を "__sharp__" に置換して .obj/*.c ファイルに出力
  2. .c ファイルをプリプロセッサで処理し "__sharp__" を '#' に戻して *.pau3 ファイルに出力
    (その他 AutoIt の構文に合わせて置換しています)
  3. .pau3 ファイルを AutoIt で実行ファイルにコンパイル
というようなことをしています。
C プリプロセッサを使用して、関数引数にファイル名や行、引数の文字列を付加することで、
先に示した出力を得られるようになります。

まとめ
プリプロセッサ便利!

2012年11月21日水曜日

Visual Studio 2012 でプロジェクト依存関係を設定してもリンクされない

Visual Studio 2012 に移行していてハマったので備忘録として。

Visual Studio 2008 では
VS2008 では、プロジェクト依存関係を設定し、
[プロジェクト]->[構成プロパティ]->[リンカ]->[全般] の
[リンク ライブラリの依存関係] を [はい] (デフォルト)
にしておけば、依存先プロジェクトの出力ライブラリに自動でリンクしてくれていました。


ビルドコンフィグごとにビルドしたライブラリをリンクしてくれるので、
Debug なら hoged.lib
Release なら hoge.lib
のような、面倒な設定をしなくて済むので便利でした。

また、プロジェクト依存関係はソリューションファイル(.sln)に記録されていたので、
ソリューションごとに別のライブラリにリンクする、なんてこともできました。

Visual Studio 2012 では
VS2012 でもプロジェクト依存関係があるのですが、
それを設定して自動でリンクしてくれません。
(VS2010 でもそうみたい)

[リンク ライブラリの依存関係]を設定するには、
[プロジェクト]->[共通プロパティ]->>[Framework と参照] ページの
[新しい参照の追加] ボタンからプロジェクトを追加します。
参照のプロパティで、[リンク ライブラリの依存関係] など細かな設定ができるようです。


ちなみに、こちらの設定はプロジェクトファイル(.vcxproj)に保存されます。
したがって、ソリューションごとにリンク先を変える手法は使えません。

うーん。困ったもんだ・・・




2012年11月17日土曜日

Cppcheck 1.57 がリリースされました

Cppcheck 1.57 がリリースされました。
ダウンロードはこちらからできます。
SourceForge.Jp - cppcheck

1.56 から 1.57 になって検査してくれる部分が増えた分、誤検知も増えたかなぁという印象です。
(※あくまでも印象です)

特に大きな問題があるわけではないので、更新してしまって問題ないと思います。

1点だけ注意が・・・
何もなければ、こんなブログは書かないわけでw

Cppcheck 1.57 になって、Visual C++ 2010 のランタイムが必要になりました。
(MSVCR100.DLL,MSVCP100.DLL)


というわけで、VC2010 がインストールされていないマシンには、ランタイム コンポーネントをインストールしましょう。
ダウンロードはこちらから > Microsoft Visual C++ 2010 再頒布可能パッケージ (x86)


Jenkins などで Cppcheck を使っている人は気をつけてください。(←自分)

2012年11月12日月曜日

Visual Studio 2012 で Google Test を使う

Visual Studio 2012 が正式リリースされ、
さらには新しいコンパイラ(Microsoft Visual C++ Compiler Nov 2012 CTP)も公開されたので、
追記したいと思います。(Google Test のバージョンは 1.6.0 です)

Visual Studio 2012 の場合
Beta 版の時と一緒です。こちらを参照してください。
Visual Studio 11 Beta で Google Test を使う

Microsoft Visual C++ Compiler Nov 2012 CTP の場合
まずは、コンパイラを使えるようにします。
やり方はこちらを参照してください。
C++でゲームプログラミング - [C++]Visual Studio 2012 に C++11 の機能が追加されるらしい

インストールしたら、早速 Google Test のライブラリをビルドします。

Variadic Templates が使えるようになったので、
_VARIADIC_MAX=10
を使わなくて済むかと思っていたのですが、
どうやら、まだ STL は対応されていないようです。残念。。。

というわけで、11 Beta の時と変わりません。こちらを参照してください。
Visual Studio 11 Beta で Google Test を使う

次に期待
またツールセットが更新されたときには、このブログを更新したいと思います。

2012年11月6日火曜日

iutest にパッケージ(名前空間)機能を追加しました

iutest は私が自作している(Google Test みたいな)C++ テスティングフレームワークです。

今回、Google Test にはない機能として名前空間のサポートを追加したので、紹介します。

IUTEST_PACKAGE
今回追加されたのは IUTEST_PACKAGE マクロです。
このマクロを使うことで、テスティングフレームワークに名前空間を伝えることができます。

具体的な例を示します。
IUTEST_PACKAGE(pkg)
{
    IUTEST(Sample, Test)
    {
        IUTEST_ASSERT_TRUE(true);
    }
}
IUTEST_PACKAGE は namespace のように使います。引数には名前空間名を指定します。
namespace ではなく、IUTEST_PACKAGE を使うとどうなるか・・・
実行してみた結果がこちらです。


このように名前空間名がテストケース名に追加されています。
そして、Jenkins のテスト結果にもパッケージとして表示されます。


ネストにも対応しています。
IUTEST_PACKAGE(pkg)
{
    IUTEST_PACKAGE(pkg2)
    {
        IUTEST_PACKAGE(pkg3)
        {
            IUTEST(Sample, Test)
            {
                IUTEST_ASSERT_TRUE(true);
            }
        }
    }
}



iutest のコードは SourceForge もしくは github から取得できます。
次回パッケージリリースは年内を予定しています。