From: j8takagi Date: Mon, 22 Nov 2010 17:20:47 +0000 (+0900) Subject: セルフテストを元に、テストの内容を再整理 X-Git-Tag: 0.2p3~56 X-Git-Url: https://j8takagi.net/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7c4a1ddce199171c274bf53932afe01596856853;p=autotest_mk.git セルフテストを元に、テストの内容を再整理 --- diff --git a/selftest/unittest/.gitignore b/selftest/unittest/.gitignore new file mode 100644 index 0000000..7320273 --- /dev/null +++ b/selftest/unittest/.gitignore @@ -0,0 +1,2 @@ +1.txt +*.log diff --git a/selftest/unittest/Define.mk b/selftest/unittest/Define.mk index 943f724..4537b43 100644 --- a/selftest/unittest/Define.mk +++ b/selftest/unittest/Define.mk @@ -1,74 +1,44 @@ -###################################################################### -# テストテンプレートのディレクトリー -###################################################################### -# テストグループの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 +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)) - -#テストグループ計時ファイル -GROUP_TIME_FILE = $(shell echo $(GROUP) | tr '[a-z]' '[A-Z]').log +TEST_MAKEFILE := Test.mk ###################################################################### # テストのディレクトリー ###################################################################### -# テスト名。カレントディレクトリー名から取得 -TEST = $(notdir $(shell pwd)) +# Makefile +MAKEFILE := Makefile # 現在の日時 DATE = $(shell date +"%F %T") # テストコマンドファイル -CMD_FILE = cmd +CMD_FILE := cmd # テスト説明ファイル -DESC_FILE = desc.txt +DESC_FILE := desc.txt # テスト想定結果ファイル -TEST0_FILE = 0.txt +TEST0_FILE := 0.txt # テスト結果ファイル -TEST1_FILE = 1.txt +TEST1_FILE := 1.txt # テストの、想定結果と結果の差分ファイル -DIFF_FILE = diff.txt +DIFF_FILE := diff.txt # テストエラーファイル -ERR_FILE = err.txt +ERR_FILE := err.txt # テストログファイル -LOG_FILE = test.log +LOG_FILE := test.log # 実行時間ファイル -TIME_FILE = time.log +TIME_FILE := time.log ###################################################################### # コマンド @@ -92,23 +62,119 @@ DEV_NULL := /dev/null CHMOD := chmod -DESC = if test -s $(DESC_FILE); then cat $(DESC_FILE) >>$@; fi; +###################################################################### +# エラー +###################################################################### -# 2ファイルの差分を出力。引数は2ファイル -DIFF = diff -c +# chk_var_null: 変数がNULLの場合、エラー +# 用例: $(call chk_var_null,var) +define chk_var_null + $(if $1,,$(error NULL argument)) +endef -# ファイルを実行可能にする。引数は1ファイル -CHMOD = chmod u+x +# chk_file_ext: 変数で指定されたファイルが実在する場合、エラー +# 用例: $(call chk_file_ext,var) +define chk_file_ext + $(if $(wildcard $1),$(error $(wildcard $1) exists)) +endef -# テスト実行コマンド。 -# ファイルの内容と、CMD_FILE実行の標準出力を、ターゲットファイルに保存。 -# エラー発生時は、エラー出力をターゲットファイルとERR_FILEに保存。 -# ターゲットファイルは、TEST0_FILEまたはTEST1_FILE -CMD = \ - $(CHMOD) $(CMD_FILE); \ - $(CAT) $(CMD_FILE) >$@; \ - ./$(CMD_FILE) >>$@ 2>$(ERR_FILE); \ - if test -s $(ERR_FILE); then $(CAT) $(ERR_FILE) >>$@; else $(RM) $(ERR_FILE); fi +###################################################################### +# マクロ +###################################################################### -# テストの結果をログに出力 -REPORT_TEST = if test ! -s $^; then $(ECHO) "$(TEST): Test Success $(DATE)" >>$@; else $(ECHO) "$(TEST): Test Failure $(DATE)" >>$@; fi; +# 指定したディレクトリーを作成 +# 用例: $(call create_testdir,name) +define create_testdir + $(call chk_var_null,$1) + $(call chk_file_ext,$1) + $(MKDIR) $1 +endef + +# TESTディレクトリーのMakefileを作成 +# 用例: $(call create_testmakefile,file) +define create_testmkfile + $(RM) $1 + $(foreach mkfile,$(DEF_FILE) $(TEST_MAKEFILE),$(ECHO) "include ../$(mkfile)" >>$1; ) +endef + +# リストで指定したディレクトリーでMakeを実行 +# 用例: $(call make_tests,list_dir,target) +define make_tests + $(foreach dir,$1,$(call make_test_each,$(dir),$2)) +endef + +# 指定したディレクトリーでMakeを実行 +# 用例: $(call make_test_each,tests,target) +define make_test_each + $(MAKE) $2 -sC $1; + +endef + +# 引数のファイルをチェックし、内容がない場合は削除 +# 用例: $(call rm_null,file) +define rm_null + if test ! -s $1; then $(RM) $1; fi +endef + +# 説明ファイルの内容を、引数のファイルに出力。 +# 用例: $(call desc_log,file_out) +define desc_log + if test -s $(DESC_FILE); then $(CAT) $(DESC_FILE) >>$1; fi +endef + +# テスト実行の経過時間を、ファイルに出力して表示。 +# 引数は、テスト名、コマンドファイル、出力ファイル +# 用例: $(call time_cmd,name,file_cmd,file_out) +define time_cmd + $(TIME) -f"$1: %E" -o $3 ./$2 >$(DEV_NULL) +endef + +# テスト実行コマンド。引数は、コマンドファイル、出力ファイル、エラーファイル +# ファイルの内容と、CMD_FILE実行の標準出力を、出力ファイルに保存。 +# エラー発生時は、エラー出力を出力ファイルとエラーファイルに保存。 +# 用例: $(call exec_cmd,file_cmd,file_out,file_err) +define exec_cmd + $(CHMOD) u+x $1 + $(CAT) $1 >$2 + ./$1 >>$2 2>$3 + if test -s $3; then $(CAT) $3 >>$2; fi + $(call rm_null,$3) +endef + +# 2つのファイルを比較し、差分ファイルを作成。 +# 引数は、ファイルのリスト(セパレーターは空白)、差分ファイル +# 用例: $(call diff_files,files,file_out) +define diff_files + $(DIFF) $1 >$2 2>&1 + $(call rm_null,$2) +endef + +# 差分ファイルの内容をログファイルに出力。 +# 引数は、テスト名、差分ファイル、ログファイル +# 用例: $(call test_log,name,file_diff,file_log) +define test_log + if test ! -s $2; then RES=Success; else RES=Failure; fi; $(ECHO) "$1: Test $$RES $(DATE)" >>$3 +endef + +# テストごとのファイルをグループファイルに出力 +# 引数は、テストのリスト、グループファイル、テストファイル +# 用例: $(call group_log,files_test_log,file_group_log) +define group_log + $(foreach target,$1,$(call group_log_each,$(target),$2)) +endef + +# テストのログファイルをグループログファイルに出力。引数は、テスト、グループログファイル +# 用例: $(call group_log_each,file_test_log,file_group_log) +define group_log_each + if test -s $1; then $(CAT) $1 >>$2; else $(ECHO) $(dir $1): no log >>$2; fi + echo >>$2; + +endef + +# テストの結果を、グループログファイルを元にレポート。 +# 引数は、グループログファイル +# 用例: $(call group_report,name,file_log_file_report) +define group_report + $(ECHO) "$1: $(SUCCESS_TEST) / $(ALL_TEST) tests passed. Details in $2" >$3; + if test $(FAIL_TEST) -eq 0; then $(ECHO) "$1: All tests are succeded." >>$3; fi +endef diff --git a/selftest/unittest/Makefile b/selftest/unittest/Makefile index f31df90..874ea47 100644 --- a/selftest/unittest/Makefile +++ b/selftest/unittest/Makefile @@ -11,43 +11,84 @@ # make clean : すべてのテストで、"make" で生成されたファイルをクリア # make cleanall: すべてのテストで、"make" と "make set" で生成されたファイルをクリア -include Define.beta.mk +###################################################################### +# テストグループの定義 +###################################################################### -.PHONY: check create set checkeach report clean cleanall +include Define.mk -check: checkeach report +# グループディレクトリー +GROUP_DIR := $(shell pwd) -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 +# グループ名。ディレクトリ名から取得 +GROUP := $(notdir $(GROUP_DIR)) + +# テスト名。カレントディレクトリー内の、名前が大文字または.以外で始まるディレクトリー +TESTS = $(notdir $(shell find -maxdepth 1 -name "[^A-Z.]*" -type d)) + +# テストごとのログファイル +TEST_LOG_FILES := $(foreach test,$(TESTS),$(test)/$(LOG_FILE)) + +# テストグループログファイル +GROUP_LOG_FILE := $(shell echo $(GROUP) | tr '[a-z]' '[A-Z]').log + +# テストグループレポートファイル +GROUP_REPORT_FILE := Report.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_TIME_FILES := $(foreach test,$(TESTS),$(test)/$(TIME_FILE)) -set: - @for target in $(TESTS); do $(MAKE) set -C $$target; done +# テストグループ実行時間ファイル +GROUP_TIME_FILE := $(shell echo $(GROUP) | tr '[a-z]' '[A-Z]')_time.log -checkeach: - @$(RM) $(GROUP_LOG_FILE) - @for target in $(TESTS); do $(MAKE) check -C $$target; done +###################################################################### +# ターゲット +###################################################################### + +.PHONY: check report create time clean cleanall + +check: clean report + +report: $(GROUP_REPORT_FILE) + @$(CAT) $^ + +$(GROUP_REPORT_FILE): $(GROUP_LOG_FILE) + @$(call group_report,$(GROUP),$^,$@) + +$(GROUP_LOG_FILE): $(TEST_LOG_FILES) + @$(call group_log,$^,$@) + +$(TEST_LOG_FILES): + @$(MAKE) check -sC $(call dir,$@) + +create: + @$(call create_testdir,$(TEST)) + @$(call create_testmkfile,$(TEST)/$(MAKEFILE)) -$(GROUP_LOG_FILE): - @for target in $(TESTS); do ($(ECHO) <$$target/$(LOG_FILE) && $(CAT) <$$target/$(LOG_FILE)) >>$@ || $(ECHO) $$target ": no log." >>$@; done +time: cleantime time_report -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 +time_report: $(GROUP_TIME_FILE) + @$(CAT) $^ -time: timeeach $(GROUP_TIME_FILE) - @$(CAT) $(GROUP_TIME_FILE) +$(GROUP_TIME_FILE): $(TEST_TIME_FILES) + @$(call group_log,$^,$@) -$(GROUP_TIME_FILE): - @for target in $(TESTS); do ($(ECHO)<$$target/$(LOG_FILE) && $(CAT) <$$target/$(TIME_FILE)) >>$@ || $(ECHO) $$target ": no time." >>$@; done +$(TEST_TIME_FILES): + @$(MAKE) time -sC $(call dir,$@) -timeeach: - @for target in $(TESTS); do $(MAKE) time -C $$target; done +cleantime: + @$(call make_tests,$(TESTS),$@) + @$(RM) $(GROUP_TIME_FILE) clean: - @for target in $(TESTS); do $(MAKE) clean -C $$target; done - @$(RM) $(GROUP_LOG_FILE) + @$(call make_tests,$(TESTS),$@) + @$(RM) $(GROUP_REPORT_FILE) $(GROUP_LOG_FILE) diff --git a/selftest/unittest/Test.mk b/selftest/unittest/Test.mk index 0237f11..eb2ef28 100644 --- a/selftest/unittest/Test.mk +++ b/selftest/unittest/Test.mk @@ -13,6 +13,9 @@ # make clean : "make" で作成されたファイルをクリア # make cleanall: "make" と "make set" で作成されたファイルをクリア +# テスト名。カレントディレクトリー名から取得 +TEST = $(notdir $(shell pwd)) + .PHONY: check set reset time cleantime clean cleanall check: clean $(LOG_FILE) @@ -33,14 +36,15 @@ cleanall: clean @$(RM) $(TEST0_FILE) $(TEST0_FILE) $(TEST1_FILE): $(CMD_FILE) - @$(call exec_cmd,$^,$@,$(ERR_FILE)) + @-$(call exec_cmd,$^,$@,$(ERR_FILE)) -$(DIFF_FILE): $(TEST1_FILE) - @-$(DIFF) $(TEST0_FILE) $(TEST1_FILE) >$@ 2>&1 +$(DIFF_FILE): $(TEST0_FILE) $(TEST1_FILE) + @-$(call diff_files,$^,$@) $(LOG_FILE): $(DIFF_FILE) - @$(DESC) - @$(REPORT_TEST) + @$(RM) $@ + @$(call desc_log,$@) + @$(call test_log,$(TEST),$^,$@) $(TIME_FILE): $(CMD_FILE) - @$(TIME) ./$(CMD_FILE) 1>/dev/null && $(CAT) $@ + @$(call time_cmd,$(TEST),$^,$@) diff --git a/selftest/unittest/UNITTEST.log b/selftest/unittest/UNITTEST.log index 073685d..56b6e25 100644 --- a/selftest/unittest/UNITTEST.log +++ b/selftest/unittest/UNITTEST.log @@ -1 +1,14 @@ -create_testmkfile : no time. +ファイルの内容と、CMD_FILE実行の標準出力を、出力ファイルに保存 +エラー発生時は、エラー出力を出力ファイルとエラーファイルに保存 +exec_cmd: Test Success 2010-11-23 02:10:44 + +create_testdir: Test Success 2010-11-23 02:10:45 + +time_cmd: Test Success 2010-11-23 02:10:48 + +説明ファイルの内容を、引数のファイルに出力 +desc_log: Test Success 2010-11-23 02:10:48 + +TESTディレクトリーのMakefileを作成 +create_testmkfile: Test Success 2010-11-23 02:10:48 + diff --git a/selftest/unittest/create_testdir/0.txt b/selftest/unittest/create_testdir/0.txt new file mode 100644 index 0000000..531b441 --- /dev/null +++ b/selftest/unittest/create_testdir/0.txt @@ -0,0 +1,9 @@ +make -s clean_utest +make -s utest 2>&1 && ls | grep atest +make -s utest_err 2>&1 && ls | grep atest +make -s utest 2>&1 && ls | grep atest +echo +atest +Makefile:8: *** NULL argument. Stop. +Makefile:5: *** atest exists. Stop. + diff --git a/selftest/unittest/create_testdir/Makefile b/selftest/unittest/create_testdir/Makefile new file mode 100644 index 0000000..99b96b0 --- /dev/null +++ b/selftest/unittest/create_testdir/Makefile @@ -0,0 +1,11 @@ +include ../Define.mk +include ../Test.mk + +utest: + @$(call create_testdir,atest) + +utest_err: + @$(call create_testdir) + +clean_utest: + @rm -rf atest diff --git a/selftest/unittest/create_testdir/cmd b/selftest/unittest/create_testdir/cmd new file mode 100755 index 0000000..87c33d7 --- /dev/null +++ b/selftest/unittest/create_testdir/cmd @@ -0,0 +1,5 @@ +make -s clean_utest +make -s utest 2>&1 && ls | grep atest +make -s utest_err 2>&1 && ls | grep atest +make -s utest 2>&1 && ls | grep atest +echo diff --git a/selftest/unittest/create_testmkfile/Makefile b/selftest/unittest/create_testmkfile/Makefile index 04dbf90..c305ccd 100644 --- a/selftest/unittest/create_testmkfile/Makefile +++ b/selftest/unittest/create_testmkfile/Makefile @@ -1,4 +1,4 @@ -include ../Define.beta.mk +include ../Define.mk include ../Test.mk utest: diff --git a/selftest/unittest/desc_log/Makefile b/selftest/unittest/desc_log/Makefile index 34bed81..d19867d 100644 --- a/selftest/unittest/desc_log/Makefile +++ b/selftest/unittest/desc_log/Makefile @@ -1,4 +1,4 @@ -include ../Define.beta.mk +include ../Define.mk include ../Test.mk utest: diff --git a/selftest/unittest/exec_cmd/Makefile b/selftest/unittest/exec_cmd/Makefile index 4c6f8b6..b293b5f 100644 --- a/selftest/unittest/exec_cmd/Makefile +++ b/selftest/unittest/exec_cmd/Makefile @@ -1,5 +1,6 @@ -include ../Define.beta.mk +include ../Define.mk include ../Test.mk utest: - $(call exec_cmd,cmd0,00.txt,uerr.txt) + $(RM) 0.log + $(call exec_cmd,cmd0,00.txt,err.txt) diff --git a/selftest/unittest/exec_cmd/desc.txt b/selftest/unittest/exec_cmd/desc.txt index a9ada04..cb71972 100644 --- a/selftest/unittest/exec_cmd/desc.txt +++ b/selftest/unittest/exec_cmd/desc.txt @@ -1 +1,2 @@ -TESTディレクトリーのMakefileを作成 +ファイルの内容と、CMD_FILE実行の標準出力を、出力ファイルに保存 +エラー発生時は、エラー出力を出力ファイルとエラーファイルに保存 diff --git a/selftest/unittest/time_cmd/0.txt b/selftest/unittest/time_cmd/0.txt new file mode 100644 index 0000000..9a28196 --- /dev/null +++ b/selftest/unittest/time_cmd/0.txt @@ -0,0 +1,2 @@ +make -s utest && cat 00.txt +time_cmd: 0:03.00 diff --git a/selftest/unittest/time_cmd/00.txt b/selftest/unittest/time_cmd/00.txt new file mode 100644 index 0000000..33a0d78 --- /dev/null +++ b/selftest/unittest/time_cmd/00.txt @@ -0,0 +1 @@ +time_cmd: 0:03.00 diff --git a/selftest/unittest/time_cmd/Makefile b/selftest/unittest/time_cmd/Makefile new file mode 100644 index 0000000..4b7c247 --- /dev/null +++ b/selftest/unittest/time_cmd/Makefile @@ -0,0 +1,5 @@ +include ../Define.mk +include ../Test.mk + +utest: + $(call time_cmd,$(TEST),cmd0,00.txt) diff --git a/selftest/unittest/time_cmd/cmd b/selftest/unittest/time_cmd/cmd new file mode 100755 index 0000000..52943b1 --- /dev/null +++ b/selftest/unittest/time_cmd/cmd @@ -0,0 +1 @@ +make -s utest && cat 00.txt diff --git a/selftest/unittest/time_cmd/cmd0 b/selftest/unittest/time_cmd/cmd0 new file mode 100755 index 0000000..5d8ebd0 --- /dev/null +++ b/selftest/unittest/time_cmd/cmd0 @@ -0,0 +1,2 @@ +sleep 3 +expr 2 + 3