Hatena::ブログ(Diary)

Life like a clown このページをアンテナに追加 RSSフィード Twitter

2009-04-02

CLX C++ Libraries の動作確認

デバッグとかテストの話を見かけたので,CLX C++ Libraries の普段の動作確認の方法をメモ.動作確認と言ってますが,修正(または新規作成)したライブラリ以外はコンパイルが通るかどうかしか見ていませんzzZ

新しいライブラリを作成した場合,そのライブラリを使用したサンプルコードを書いて公開するようにしているのですが,動作確認を行う際にもそのサンプルコードを利用しています.具体的には,以下のシェルスクリプトを用いて サンプルコード を一つづつコンパイルしていき,コンパイルエラーが発生しないかどうかを確かめています.

#!/bin/sh
SCRIPT="test.sh"

if [ $# -lt 1 ]; then
	echo "USAGE $SCRIPT compiler [-c cflags][-l ldflags]"
	exit 1
fi
CC=$1

# --------------------------------------------------------------------------- #
#  Parses parameters given by the command line. Usage of the "test.sh"
#  script is as follow: test.sh compiler [-c cflags][-l ldflags].
# --------------------------------------------------------------------------- #
CFLAGS=
LDFLAGS=

i=2
while [ $i -lt $# ]
do
	eval key='$'$i
	eval param='$'`expr $i + 1`
	if [ $key == "-c" ]; then
		CFLAGS=$param
	elif [ $key == "-l" ]; then
		LDFLAGS=$param
	fi
	
	i=`expr $i + 2`
done

# --------------------------------------------------------------------------- #
#  Prepares for recording error log.
# --------------------------------------------------------------------------- #
ERRLOG="error.log"
TMPLOG="tmp_`date +%Y%m%d.log`"

if [ -e $ERRLOG -a -s $ERRLOG ]; then
	mv -f $ERRLOG ${ERRLOG}.bak
fi
touch $ERRLOG

# --------------------------------------------------------------------------- #
#  TEST
# --------------------------------------------------------------------------- #
for file in `ls *.cpp`
do
	command="$CC $CFLAGS $file $LDFLAGS"
	$command 2>$TMPLOG >/dev/null
	if [ $? -eq 0 ]; then
		STATUS="ok"
	else
		STATUS="failed"
	fi
	echo "$command ... $STATUS"
	
	if [ -e $TMPLOG -a -s $TMPLOG ]; then
		echo "$command ... $STATUS" >>$ERRLOG
		echo "----------" >>$ERRLOG
		cat $TMPLOG >>$ERRLOG
		echo >>$ERRLOG
	fi
done

rm -f $TMPLOG

例えば,gcc (cygwin, Linux, etc) で動作確認を行う場合は以下のようなコマンドで実行します.

# sh test.sh g++ -c "-I.. -Wall" -l "-lm -lpthread -lcrypto -lssl -lz"

Visual Studio (cl.exe) の場合は以下の通り.ただし,Visual Studio の場合はコマンドライン上で cl.exe が実行できるようにあらかじめ設定しておく必要があります.

# sh test.sh cl.exe -c "/EHsc /I.. /W3"

テストに関しては以前に,あなたのテスト、単なる動作確認になっていませんか? と言う記事を読んだときに痛いところを突かれた気分になったのですが,異常な入力値(引数)が与えられたときなど処理が正常に終了しない場合にどういう振る舞いをするかの確認は甘くなりがちなのが良くないところです.テスト方法も一度まじめに勉強しないとなぁとは思っているのですが,なかなか.

テストが不十分な分は,実際に使ってみた人からのバグ報告(メール,BBS?,blog 等の記事)で補っている形で,いつも助かっています.何かやったら文書にして取りあえず公開しておく事は大切だなとよく感じます.