From: j8takagi Date: Wed, 10 Nov 2010 09:58:33 +0000 (+0900) Subject: リファクタリング X-Git-Tag: 0.2p3~63 X-Git-Url: https://j8takagi.net/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=71d27322b147ac49c9a0bc584ddfa2103db88b76;p=autotest_mk.git リファクタリング --- diff --git a/Makefile.TESTGROUPS.mk b/Makefile.TESTGROUPS.mk deleted file mode 100644 index 6e32f36..0000000 --- a/Makefile.TESTGROUPS.mk +++ /dev/null @@ -1,46 +0,0 @@ -# テストグループ -# make : すべてのテストを実施し、ログを作成 -# make all : ↓ -# make clean : すべてのテストで、「make」で生成されたファイルをクリア -# make check : すべてのテストを実施 -# make cleanall: すべてのテストで、「make」と「make prepare」で生成されたファイルをクリア -# make prepare : すべてのテストの、想定結果を出力 -# make create : UNITNAMEで指定されたテストを新規に作成 -GROUPNAME = `pwd | xargs basename` -TESTS = `ls | grep "^[^A-Z].*"` -LOGFILE = Test.log - -.PHONY: all check checkeach report clean cleanall prepare create -check: checkeach report -checkeach: - @rm -f $(LOGFILE) - @for target in $(TESTS); do \ - $(MAKE) check -C $$target; \ - done -$(LOGFILE): - @for target in $(TESTS); do \ - cat <$$target/report.txt >>$(LOGFILE) || echo $$target ": no report" >>$(LOGFILE); \ - done -report: $(LOGFILE) - @success=`grep "Success" $(LOGFILE) | wc -l`; \ - all=`cat $(LOGFILE) | wc -l`; \ - echo "$(GROUPNAME): $$success / $$all tests passed. Details in `pwd`/$(LOGFILE)"; \ - if test $$success -eq $$all; then \ - echo "$(GROUPNAME): All tests are succeded."; \ - fi -clean: - @for target in $(TESTS); do $(MAKE) clean -C $$target; done - @rm -f $(LOGFILE) -cleanall: - @for target in $(TESTS); do $(MAKE) cleanall -C $$target; done - @rm -f $(LOGFILE) -prepare: - @for target in $(TESTS) ; do $(MAKE) prepare -C $$target ; done -create: -ifndef UNITNAME - @echo "no test created. set UNITNAME" -else - @mkdir $(UNITNAME) - @echo 'CMD = ' >>$(UNITNAME)/Makefile; \ - echo 'include ../TEST.mk' >>$(UNITNAME)/Makefile -endif diff --git a/TEST.mk b/TEST.mk deleted file mode 100644 index 11cbb16..0000000 --- a/TEST.mk +++ /dev/null @@ -1,27 +0,0 @@ -# テストのテンプレート -# make : CMDで設定されたコマンドを実行した出力結果を1.txtに出力し、0.txtと比較し、レポート -# make check : ↓ -# make prepare : CMDで設定されたコマンドを実行した出力結果を0.txt(テストの想定結果)に出力 -# make clean : 「make」で生成されたファイルをクリア -# make cleanall: 「make」と「make prepare」で生成されたファイルをクリア -ERRFILE = err.txt -UNITNAME = `pwd | xargs basename` -# 要定義: CMD, CMDFILE, OBJFILE - -.PHPNY: check prepare clean cleanall -check: clean report.txt -prepare: cleanall 0.txt -clean: - @rm -f 1.txt diff.txt report.txt err.txt -cleanall: clean - @rm -f 0.txt -0.txt 1.txt: $(CMDFILE) $(OBJFILE) - @echo $(CMD) >$@; \ - $(CMD) >>$@ 2>$(ERRFILE); \ - if test -s $(ERRFILE); then cat err.txt >>$@; else rm -f $(ERRFILE); fi -diff.txt: 1.txt - @-diff -c 0.txt 1.txt >$@ 2>&1 -report.txt: diff.txt - @echo -n "$(UNITNAME): Test " >$@; \ - if test ! -s $^; then echo -n "Success " >>$@; rm -f $^; else echo -n "Failure " >>$@; fi; \ - echo `date +"%F %T"` >>$@ diff --git a/template/Define.mk b/template/Define.mk new file mode 100644 index 0000000..e114af6 --- /dev/null +++ b/template/Define.mk @@ -0,0 +1,75 @@ +###################################################################### +# テストテンプレートのディレクトリー +###################################################################### +# テストグループのMakefileとしてコピーされるファイル +GROUP_MAKEFILE = Group.mk + +###################################################################### +# テストグループのディレクトリー +###################################################################### +# グループディレクトリー +GROUP_DIR = $(shell pwd) + +# グループ名。ディレクトリ名から取得 +GROUP = $(notdir $(GROUP_DIR)) + +# テスト名。カレントディレクトリー内の、名前が大文字または.以外で始まるディレクトリー +TESTS = $(notdir $(shell find -maxdepth 1 -name "[^A-Z.]*" -type d)) + +# テストグループとテストの両方で使う変数を定義したファイル +DEF_FILE = Define.mk + +# テストのMakefileにインクルードするファイル +TEST_MAKEFILE = Test.mk + +# テストグループログファイル +GROUP_LOG_FILE = $(shell echo $(GROUP) | tr '[a-z]' '[A-Z]').log + +# 成功したテストの数。テストグループログファイルから取得 +SUCCESS_TEST = $(shell grep "^[^A-Z.].*: Test Success" $(GROUP_LOG_FILE) | wc -l) + +# 失敗したテストの数。テストグループログファイルから取得 +FAIL_TEST = $(shell grep "^[^A-Z.].*: Test Failure" $(GROUP_LOG_FILE) | wc -l) + +# すべてのテストの数。 +ALL_TEST = $(shell expr $(SUCCESS_TEST) + $(FAIL_TEST)) + +###################################################################### +# テストのディレクトリー +###################################################################### +# テスト名。カレントディレクトリー名から取得 +TEST = $(notdir $(shell pwd)) + +# テストコマンドファイル +CMD_FILE = cmd + +# テスト説明ファイル +DESC_FILE = desc.txt + +# テスト想定結果ファイル +TEST0_FILE = 0.txt + +# テスト結果ファイル +TEST1_FILE = 1.txt + +# テストの、想定結果と結果の差分ファイル +DIFF_FILE = diff.txt + +# テストエラーファイル +ERR_FILE = err.txt + +# テストログファイル +LOG_FILE = test.log + +# 現在の日時 +DATE = `date +"%F %T"` + +# テスト実行コマンド。CMD_FILEを実行する。 +# ファイルの内容と、テスト結果を表す標準出力を、ターゲットファイルに保存。 +# エラー発生時は、エラー出力をターゲットファイルとERR_FILEに保存。 +# ターゲットファイルは、TEST0_FILEまたはTEST1_FILE +CMD = \ + chmod u+x $(CMD_FILE); \ + cat $(CMD_FILE) >$@; \ + ./$(CMD_FILE) >>$@ 2>$(ERR_FILE); \ + if test -s $(ERR_FILE); then cat $(ERR_FILE) >>$@; else rm -f $(ERR_FILE); fi diff --git a/template/Group.mk b/template/Group.mk new file mode 100644 index 0000000..934b867 --- /dev/null +++ b/template/Group.mk @@ -0,0 +1,48 @@ +# autotest.mk > template > Group.mk +# テストグループのMakefile +# +# オペレーター +# make : すべてのテストを実施し、ログファイルを作成 +# make check : ↓ +# make create : TESTNAMEで指定されたテストを新規に作成 +# make set : すべてのテストの、想定結果を出力 +# make checkeach: すべてのテストを実施 +# make report : ログファイルから、テストの結果をレポート +# make clean : すべてのテストで、"make" で生成されたファイルをクリア +# make cleanall: すべてのテストで、"make" と "make set" で生成されたファイルをクリア + +include Define.mk + +.PHONY: check create set checkeach report clean cleanall + +check: checkeach report + +create: +ifndef TEST + @echo "no test created. set TEST." +else + @mkdir $(TEST) + @for ifile in $(DEF_FILE) $(TEST_MAKEFILE); do echo "include ../$$ifile" >>$(TEST)/Makefile; done +endif + +set: + @for target in $(TESTS); do $(MAKE) set -C $$target; done + +checkeach: + @rm -f $(GROUP_LOG_FILE) + @for target in $(TESTS); do $(MAKE) check -C $$target; done + +$(GROUP_LOG_FILE): + @for target in $(TESTS); do cat <$$target/$(LOG_FILE) >>$@ || echo $$target ": no log." >>$@; done + +report: $(GROUP_LOG_FILE) + @echo "$(GROUP): $(SUCCESS_TEST) / $(ALL_TEST) tests passed. Details in `pwd`/$(GROUP_LOG_FILE)"; \ + if test $(FAIL_TEST) -eq 0; then echo "$(GROUP): All tests are succeded."; fi + +clean: + @for target in $(TESTS); do $(MAKE) clean -C $$target; done + @rm -f $(GROUP_LOG_FILE) + +cleanall: + @for target in $(TESTS); do $(MAKE) cleanall -C $$target; done + @rm -f $(GROUP_LOG_FILE) diff --git a/template/Makefile b/template/Makefile new file mode 100644 index 0000000..92f36c5 --- /dev/null +++ b/template/Makefile @@ -0,0 +1,18 @@ +# autotest.mk > test_template > Makefile +# テストグループ作成のMakefile +# +# オペレーター +# make : テストグループディレクトリーを作成 +# make creategroup: ↓ + +include Define.mk + +creategroup: +ifndef GROUPDIR + @echo "no test group created. set GROUPDIR." +else + @mkdir $(GROUPDIR) + @cp $(GROUP_MAKEFILE) $(GROUPDIR)/Makefile + @cp $(TEST_MAKEFILE) $(GROUPDIR)/ + @cp $(DEF_FILE) $(GROUPDIR)/ +endif diff --git a/template/Test.mk b/template/Test.mk new file mode 100644 index 0000000..cf5979b --- /dev/null +++ b/template/Test.mk @@ -0,0 +1,35 @@ +# autotest.mk > test_template > test.mk +# 自動テスト用のMakefile +# +# 要: Define.mk +# +# オペレーター +# make : CMDで設定されたコマンドを実行した出力結果を1.txtに出力し、0.txtと比較し、レポート +# make check : ↓ +# make prepare : CMDで設定されたコマンドを実行した出力結果を0.txt(テストの想定結果)に出力 +# make clean : 「make」で生成されたファイルをクリア +# make cleanall: 「make」と「make prepare」で生成されたファイルをクリア + +.PHONY: check set reset clean cleanall + +check: clean $(LOG_FILE) + +set: $(TEST0_FILE) + +reset: cleanall $(TEST0_FILE) + +clean: + @rm -f $(TEST1_FILE) $(DIFF_FILE) $(LOG_FILE) $(ERR_FILE) + +cleanall: clean + @rm -f $(TEST0_FILE) + +$(TEST0_FILE) $(TEST1_FILE): + @if test ! -s $(CMD_FILE); then echo "set command file: $(CMD_FILE)."; else $(CMD); fi + +$(DIFF_FILE): $(TEST1_FILE) + @-diff -c $(TEST0_FILE) $(TEST1_FILE) >$@ 2>&1 + +$(LOG_FILE): $(DIFF_FILE) + @if test -s $(DESC_FILE); then cat $(DESC_FILE) >>$@; fi; + @if test ! -s $^; then echo "$(TEST): Test Success $(DATE)" >>$@; else echo "$(TEST): Test Failure $(DATE)" >>$@; fi;