デバッグとかテストの話を見かけたので,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 等の記事)で補っている形で,いつも助かっています.何かやったら文書にして取りあえず公開しておく事は大切だなとよく感じます.