From: j8takagi Date: Tue, 23 Nov 2010 15:26:44 +0000 (+0900) Subject: make checkallで、ログにテスト結果と実行時間を表示するように仕様変更 X-Git-Tag: 0.2p3~53 X-Git-Url: https://j8takagi.net/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f3fffa4d1252c66d35f6de43fee9bbe8f8771505;p=autotest_mk.git make checkallで、ログにテスト結果と実行時間を表示するように仕様変更 --- diff --git a/template/Define.mk b/template/Define.mk index 943f724..97be24c 100644 --- a/template/Define.mk +++ b/template/Define.mk @@ -1,114 +1,192 @@ -###################################################################### -# テストテンプレートのディレクトリー -###################################################################### -# テストグループのMakefileとしてコピーされるファイル -GROUP_MAKEFILE = Group.mk +# autotest.mk > test_template > Define.mk +# 自動テスト用の変数、マクロ定義 + +SHELL=/bin/sh ###################################################################### # テストグループのディレクトリー ###################################################################### -# グループディレクトリー -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 ###################################################################### # コマンド ###################################################################### -CP := cp +CP ?= cp + +CAT ?= cat -CAT := cat +MKDIR ?= mkdir -MKDIR := mkdir +RM ?= rm -f -RM := rm -f +ECHO ?= echo -ECHO := echo +TIME ?= /usr/bin/time --quiet -TIME := /usr/bin/time +DIFF ?= diff -c -DIFF := diff -c +DEV_NULL ?= /dev/null -DEV_NULL := /dev/null +CHMOD ?= chmod -CHMOD := chmod +###################################################################### +# エラー +###################################################################### -DESC = if test -s $(DESC_FILE); then cat $(DESC_FILE) >>$@; fi; +# chk_var_null: 引数がNULLの場合、エラー +# 用例: $(call chk_var_null,var) +define chk_var_null + $(if $1,,$(error NULL argument)) +endef -# 2ファイルの差分を出力。引数は2ファイル -DIFF = diff -c +# chk_file_ext: 指定されたファイルが実在する場合、エラー +# 用例: $(call chk_file_ext,file) +define chk_file_ext + $(if $(wildcard $1),$(error $1 exists in $(shell pwd))) +endef -# ファイルを実行可能にする。引数は1ファイル -CHMOD = chmod u+x +# chk_file_notext: 指定されたファイルが実在しない場合、エラー +# 用例: $(call chk_file_notext,file) +define chk_file_notext + if test ! -s $1; then $(error $1 not exists in $(shell pwd)); fi +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_dir,name) +define create_dir + $(call chk_var_null,$1) + $(call chk_file_ext,$1) + $(MKDIR) $1 +endef + +# テストごとのMakefileを作成 +# 用例: $(call create_makefile,file) +define create_makefile + $(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) 2>&1 +endef + +# テスト実行コマンド。引数は、コマンドファイル、出力ファイル、エラーファイル +# ファイルの内容と、CMD_FILE実行の標準出力を、出力ファイルに保存。 +# エラー発生時は、エラー出力を出力ファイルとエラーファイルに保存。 +# 用例: $(call exec_cmd,file_cmd,file_out,file_err) +define exec_cmd + $(CAT) $1 >$2 + ./$1 >>$2 2>$3 + if test -s $3; then $(CAT) $3 >>$2; fi + $(call rm_null,$3) +endef + +# 2つのファイルを比較し、差分ファイルを作成。 +# 引数は、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/template/Group.mk b/template/Group.mk index ef976d2..bdae65f 100644 --- a/template/Group.mk +++ b/template/Group.mk @@ -11,43 +11,83 @@ # make clean : すべてのテストで、"make" で生成されたファイルをクリア # make cleanall: すべてのテストで、"make" と "make set" で生成されたファイルをクリア +SHELL = /bin/sh + +###################################################################### +# テストグループの定義 +###################################################################### + include Define.mk -.PHONY: check create set checkeach report clean cleanall +# グループディレクトリー +GROUP_DIR := $(shell pwd) -check: checkeach report +# グループ名。ディレクトリ名から取得 +GROUP := $(notdir $(GROUP_DIR)) -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 +# テスト名。カレントディレクトリー内の、名前が大文字または.以外で始まるディレクトリー +TESTS = $(notdir $(shell find -maxdepth 1 -name "[^A-Z.]*" -type d)) -set: - @for target in $(TESTS); do $(MAKE) set -C $$target; done +# テストごとのログファイル +TEST_LOG_FILES := $(foreach test,$(TESTS),$(test)/$(LOG_FILE)) -checkeach: - @$(RM) $(GROUP_LOG_FILE) - @for target in $(TESTS); do $(MAKE) check -C $$target; done +# テストグループログファイル +GROUP_LOG_FILE := $(shell echo $(GROUP) | tr '[a-z]' '[A-Z]').log -$(GROUP_LOG_FILE): - @for target in $(TESTS); do ($(ECHO) <$$target/$(LOG_FILE) && $(CAT) <$$target/$(LOG_FILE)) >>$@ || $(ECHO) $$target ": no log." >>$@; done +# テストグループレポートファイル +GROUP_REPORT_FILE := Report.log -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 +# 成功したテストの数。テストグループログファイルから取得 +SUCCESS_TEST = $(shell grep "^[^A-Z.].*: Test Success" $(GROUP_LOG_FILE) | wc -l) -time: timeeach $(GROUP_TIME_FILE) - @$(CAT) $(GROUP_TIME_FILE) +# 失敗したテストの数。テストグループログファイルから取得 +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)) + +# テストグループ実行時間ファイル +GROUP_TIME_FILE := $(shell echo $(GROUP) | tr '[a-z]' '[A-Z]')_time.log + +###################################################################### +# ターゲット +###################################################################### + +.PHONY: check checkall time create clean cleantime -$(GROUP_TIME_FILE): - @for target in $(TESTS); do ($(ECHO)<$$target/$(LOG_FILE) && $(CAT) <$$target/$(TIME_FILE)) >>$@ || $(ECHO) $$target ": no time." >>$@; done +check checkall: clean $(GROUP_REPORT_FILE) + @$(CAT) $(GROUP_REPORT_FILE) -timeeach: - @for target in $(TESTS); do $(MAKE) time -C $$target; done +time: cleantime $(GROUP_TIME_FILE) + @$(CAT) $(GROUP_TIME_FILE) + +create: + @$(call create_dir,$(TEST)) + @$(call create_makefile,$(TEST)/$(MAKEFILE)) 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) $(GROUP_TIME_FILE) + +cleantime: + @$(call make_tests,$(TESTS),$@) + @$(RM) $(GROUP_TIME_FILE) + +$(GROUP_REPORT_FILE): $(GROUP_LOG_FILE) + @$(call group_report,$(GROUP),$^,$@) + +$(GROUP_LOG_FILE): $(TEST_LOG_FILES) + @$(call make_tests,$(TESTS),$(MAKECMDGOALS)) + @$(call group_log,$^,$@) + +$(GROUP_TIME_FILE): cleantime $(TEST_TIME_FILES) + @$(call group_log,$(TEST_TIME_FILES),$@) + +$(TEST_LOG_FILES): + @$(MAKE) check -sC $(dir $@) + +$(TEST_TIME_FILES): + @$(MAKE) time -sC $(dir $@) diff --git a/template/Test.mk b/template/Test.mk index 5962b23..10fe274 100644 --- a/template/Test.mk +++ b/template/Test.mk @@ -13,13 +13,23 @@ # make clean : "make" で作成されたファイルをクリア # make cleanall: "make" と "make set" で作成されたファイルをクリア +SHELL = /bin/sh + +# テスト名。カレントディレクトリー名から取得 +TEST = $(notdir $(shell pwd)) + .PHONY: check set reset time cleantime clean cleanall check: clean $(LOG_FILE) +checkall: check $(TIME_FILE) + @$(CAT) $(TIME_FILE) >>$(LOG_FILE) + set: $(TEST0_FILE) + @$(CAT) $^ reset: cleanall $(TEST0_FILE) + @$(CAT) $(TEST0_FILE) time: cleantime $(TIME_FILE) @@ -32,15 +42,20 @@ clean: cleanall: clean @$(RM) $(TEST0_FILE) +$(CMD_FILE): + @$(call chk_file_notext,$@) + @$(CHMOD) u+x $@ + $(TEST0_FILE) $(TEST1_FILE): $(CMD_FILE) - @-$(CMD) + @-$(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),$^,$@)