株式会社クリアコード > ククログ

ククログ

«いいアドバイスをもらうための相談の仕方 最新 DevLOVE 2012: 「リーダブルコードを読んだ後」 #devlove2012»
タグ:

CutterをWindowsでgrowlnotifyと一緒に使う方法

C/C++に対応しているテスティングフレームワークの一つにCutterがあります。今回はテスト結果の通知という観点からCutterの紹介をします。

Cutterそのものについては何度かククログでもとりあげています。 Cutterの特徴について知りたい方はCutterの機能を参照してください。

テスト結果の通知

Cutterに限らず、テスティングフレームワークではテスト結果の通知方法を工夫しています。例えば、コンソールに色分けして結果を表示したり、HTML形式のレポートを生成したりします。

Cutterでもそのようなテスト結果の通知方法の工夫の一つとして、TDDきのたんによるテスト結果の通知をサポートしています。

せっかくテストを書いても、それが頻繁に実行されなかったり、実行した結果を確認して修正する継続的なサイクルが維持されなければ意味がありません。テストが充実するのに伴って、時間のかかるテストの実行中に他の作業をするということも増えてきます*1。他の作業をしている間にテストが失敗したら、まずはそのテストをパスするための作業に取り組む必要があります。しかし、他の作業をしていると失敗を見逃してしまうこともあります。他の作業をしていてもテストの失敗に素早く気づける仕組みが必要です。

そのため、Cutterではテスト結果を「通知」する仕組みを取り入れています。

TDDきのたんによるテスト結果の通知

CutterではTDDきのたんでテスト結果を通知します。GNOMEやMax OS Xでは以下のように通知されます。

GNOME上での通知

Mac OS X上での通知

Ubuntuではnotify-osdもしくはnotification-daemonをインストールすれば、TDDきのたんを利用してテスト結果を通知できます。TDDきのたんによるテスト結果の通知は1.1.6からサポートされています。

Windowsでもテスト結果を通知する

前項ではTDDきのたんでどのようにテスト結果が通知されるかを紹介しました。

CutterはWindowsでも利用することができますが、TDDきのたんによるテスト結果の通知はできませんでした。

Cutter 1.2.1からWindowsでもTDDきのたんによるテスト結果の通知ができるようになりました。なお、この機能を利用するにはGrowl for Windowsgrowlnotifyが必要です。

Growl for Windowsとgrowlnotifyについて

Windowsでも通知系のアプリケーションがあり、Ubuntuでのnotify-osdやnotification-daemonに相当するものがGrowl for Windowsで、notify-sendに相当するのがgrowlnotifyです。

Growl for Windowsとgrowlnotifyをセットアップすれば、テスト結果を通知することができます。

セットアップ

Windowsでテスト結果を通知できるようにするための環境構築手順を紹介します。

CutterのWindows向けのバイナリは提供されていないため、ソースコードからコンパイルしてインストールする必要があります。インストール方法は以下の通りです。

  1. Growl for Windowsをインストールする
  2. growlnotifyをインストールする
  3. MinGWをインストールする
  4. GTK+ Windowsバイナリをインストールする
  5. intltoolをインストールする
  6. Cutter 1.2.2をインストールする
Growl for Windowsをインストールする

Growl for Windowsのインストーラーをダウンロード、インストールします。

インストールしたら、スタートメニューのGrowlアイコンをクリックしGrowlを起動します。

growlnotify.exeをインストールする

growlnotify.exeが含まれているzipをダウンロードします。

ダウンロードしたzipアーカイブにはgrowlnotify.exeとgrowlnotify.comの2つが含まれています。以降の説明ではc:\WinApp\growlnotify以下にzipアーカイブに含まれていたバイナリが配置されているものとします。

実際にコマンドプロンプト*2を起動し、growlnotifyコマンドが正常に動作することを確認します。

c:\Users\ユーザー名>c:\WinApp\growlnotify\growlnotify.exe /t:title body

growlnotify動作確認結果

正しくセットアップできていれば、スクリーンショットのように「title」と「body」を含んだ通知が表示されます。

MinGWをインストールする

CutterをビルドするためのツールはMinGWのものを利用します。ここではネットワーク経由でのインストールを行うことのできるインストーラーmingw-get-inst-20120426.exeを使ってインストールします。

インストールの途中にインストールするコンポーネントを選択する箇所があります。そこでは以下を選択します。

  • C Compiler
  • C++ Compiler
  • MSYS Basic System
  • MinGW Developer Toolkit

以降の説明ではc:\MinGWへインストールしたものとして説明します。

正しくインストールできていれば、c:\MinGW\msys\1.0\msys.batがインストールされています。msys.batを実行すると以下のようなウィンドウが表示されます。このウィンドウが表示されれば正しくインストールできています。

msys.bat動作確認結果

GTK+ Windowsバイナリをインストールする

Cutterの動作にはGLib 2.16以降が必要です。そのため、GLibのWindowsバイナリをインストールします。

The GTK+ Projectが配布しているGTK+のWindowsバイナリにGLibも含まれているので、これを使います。all-in-one bundleをダウンロードして、c:\WinApp\GTKへ展開します。

c:\MinGW\msys\1.0\msys.batを実行し、シェルを起動します。以降シェルでの操作はプロンプトに$をつけて説明します。

シェル上で以下のコマンドを実行します。GTK+のデモアプリケーションが起動したら正常にインストールできています。

$ /c/WinApp/GTK/bin/gtk-demo.exe
intltoolをインストールする

Cutterをビルドする際にはconfigureのチェックでintltoolが古いとエラーになる*3ため、あらかじめ最新のintltoolをインストールします。依存するPerlのモジュールについてはMinGWをインストールした時点で一緒にインストールされています。

intltoolのサイトからintltool-0.50.2.tar.gzをダウンロードします。

あとは通常の手順でコンパイルおよびインストールします。

$ tar xvf intltool-0.50.2.tar.gz
$ cd intltool-0.50.2
$ ./configure --prefix=/c/WinApp/GTK
$ make
$ make install

正しくイントールできていれば、以下のコマンドを実行するとバージョンが表示されます。

$ /c/WinApp/GTK/bin/intltoolize --version
intltoolize (GNU intltool) 0.50.2
Cutter 1.2.2をインストールする

Cutterの最新リリース版のソースコードのダウンロードと展開には以下のコマンドを実行します。

$ mingw-get install msys-wget
$ wget http://downloads.sourceforge.net/cutter/cutter-1.2.2.tar.gz
$ tar xvf cutter-1.2.2.tar.gz

GTK+関連で必要な環境変数の設定を行います。

$ export PATH=$PATH:/c/WinApp/GTK/bin
$ export PKG_CONFIG_PATH=/c/WinApp/GTK/lib/pkgconfig

pkg-configコマンドが実行できることを確認します。*4

$ pkg-config --version
0.26

展開したソースコードのディレクトリへと移動し、インストールします。

$ cd cutter-1.2.2
$ ./configure --prefix=/c/WinApp/GTK
$ make
$ make install

正しくインストールできていれば、Cutterのバージョンが表示されます。

$ cutter --version
1.2.2

Cutterをインストールできたので、実際に小さなサンプルプログラムを用意します。

1
2
3
4
5
6
7
#include <cutter.h>

CUT_EXPORT void
test_sample(void)
{
  cut_assert_true(FALSE);
}

これは必ず失敗するテストです。

このサンプルを以下のようにしてコンパイルします。

$ gcc -shared -o sample.dll sample.c `pkg-config --cflags --libs cutter`

以下のコマンドで実際にテストを実行します。

$ cutter .

F
===============================================================================
Failure: test_sample
expected: <FALSE> is TRUE value
test.c:5: test_sample(): cut_assert_true(0, )
===============================================================================

Finished in 0.109200 seconds (total: 0.000000 seconds)

1 test(s), 0 assertion(s), 1 failure(s), 0 error(s), 0 pending(s), 0 omission(s), 0 notification(s)
0% passed

上記のようにテストが失敗します。

growlnotifyでテスト結果を通知する

テスト結果をgrowlnotifyで通知するにはgrowlnotifyコマンドへのパスを通してから、cutterコマンドを実行します。

$ export PATH=$PATH:/c/WinApp/growlnotify
$ cutter .

テスト失敗時の通知結果

失敗したことが通知されます。

先程のサンプルプログラムで、FALSEとなっていたところをTRUEへと修正し、必ずパスするようにします。

1
2
3
4
5
6
7
#include <cutter.h>

CUT_EXPORT void
test_sample(void)
{
  cut_assert_true(TRUE);
}

再度コンパイルし、cutterコマンドを実行します。

$ gcc -shared -o sample.dll sample.c `pkg-config --cflags --libs cutter`
$ cutter .

テスト成功時の通知結果

成功したことが通知されます。

これで、growlnotifyを使ってCutterのテスト結果を通知することができるようになりました。

最初にテストを書いておくと、実装が終わった時点で通知がグリーンに変わるので、テストがうまくいったことがわかりやすいです。

growlnotifyでの通知を抑制する場合には、以下のように--notify=noオプションを指定します。

$ cutter . --notify=no

なお、Cutter自身のテストはCutterで書かれているため、CutterをCutterでテストできます。

その場合、cutter-1.2.2ディレクトリにて以下のコマンドを実行します*5

$ make check
...(途中略)...
Finished in 22.851902 seconds (total: 21.826769 seconds)

555 test(s), 2352 assertion(s), 45 failure(s), 2 error(s), 0 pending(s), 9 omission(s), 0 notification(s)
91.5315% passed
FAIL: run-test.sh

Cutterをテストしたときの通知結果

まとめ

CutterをWindowsでgrowlnotifyと一緒に使う方法を紹介しました。

開発・テストを実行するサイクルに時間がかかる場合は、「通知」によりテストの結果にすぐ気づける仕組みがあると便利です。MinGW環境のビルドは遅いことが多いので、このような「通知」の仕組みをCutterと一緒に導入してみるのをオススメします。

Cutterについて興味がわいてきたら、まずはチュートリアルから始めるとよいでしょう。

*1 その前に、既存のテストについて「本当にそのテストは必要なのか」を確認するべきです。必要のないテストがあった場合はその削除してテスト時間を短くします。

*2 cmd.exe

*3 0.35.0以降が必要。

*4 pkg-configはGTK+に含まれています。

*5 たくさん失敗していますね。。。

タグ: Cutter
2012-12-12

«いいアドバイスをもらうための相談の仕方 最新 DevLOVE 2012: 「リーダブルコードを読んだ後」 #devlove2012»
2008|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|
タグ:
RubyKaigi 2015 sponsor RubyKaigi 2015 speaker RubyKaigi 2015 committer RubyKaigi 2014 official-sponsor RubyKaigi 2014 speaker RubyKaigi 2014 committer RubyKaigi 2013 OfficialSponsor RubyKaigi 2013 Speaker RubyKaigi 2013 Committer SapporoRubyKaigi 2012 OfficialSponsor SapporoRubyKaigi 2012 Speaker RubyKaigi2010 Sponsor RubyKaigi2010 Speaker RubyKaigi2010 Committer badge_speaker.gif RubyKaigi2010 Sponsor RubyKaigi2010 Speaker RubyKaigi2010 Committer
SapporoRubyKaigi02Sponsor
SapporoRubyKaigi02Speaker
RubyKaigi2009Sponsor
RubyKaigi2009Speaker
RubyKaigi2008Speaker