使用多个版本运行测试,并在Makefile中收集返回值

使用多个版本运行测试,并在Makefile中收集返回值,makefile,sh,gnu-make,Makefile,Sh,Gnu Make,我正在开发从Emacs-22运行到Emacs26的Emacs包,我想确认测试通过了这些Emacs 但是,由于每个日志都很长,我希望收集每个测试的返回值,并在最后清楚地显示它 如何在Makefile中写入此文件? 待测试的Emacs列表已在所有Emacs版本as array(22.1 23.4 24.5 25.3 26.1)中获得,现在我运行测试如下 EMACS ?= emacs LOAD_PATH := -L $(dir $(lastword $(MAKEFILE_L

我正在开发从Emacs-22运行到Emacs26的Emacs包,我想确认测试通过了这些Emacs

但是,由于每个日志都很长,我希望收集每个测试的返回值,并在最后清楚地显示它

如何在Makefile中写入此文件? 待测试的Emacs列表已在
所有Emacs版本
as array(22.1 23.4 24.5 25.3 26.1)中获得,现在我运行测试如下

EMACS          ?= emacs
LOAD_PATH      := -L $(dir $(lastword $(MAKEFILE_LIST)))
BATCH          := $(EMACS) -Q --batch $(LOAD_PATH)
ALL_EMACS_VERS := $(shell compgen -c emacs- | grep -oP '(?<=emacs-)([0-9]|\.)+' | sort | uniq)

test:
    $(BATCH) -l srt-tests.el -f srt-run-tests

debug-localtest:
    for ver in $(ALL_EMACS_VERS); do \
        echo "===  test by emacs-$${ver}...  ==="; \
        EMACS=emacs-$${ver} make test; \
    done
===  test by emacs-22.1  ===
emacs-22.1 -Q --batch -L ./ -l srt-tests.el -f srt-run-tests

Running 30 tests...
GNU Emacs 22.1.1 (mac-apple-darwin)
 of 2017-10-07 on osx339.sd.apple.com
[PASSED]  simple:equal
[PASSED]  simple:=
...

===== Run 30 Tests, 29 Expected, 1 Failed, 0 Errored =====

make[1]: Leaving directory '/Users/conao/Develop/git/.dotfiles/.emacs.d/local/26.1/site-lisp/srt.el'


===  test by emacs-23.4  ===
emacs-23.4 -Q --batch -L ./ -l srt-tests.el -f srt-run-tests

Running 30 tests...
GNU Emacs 23.4.1 (x86_64-apple-darwin, NS apple-appkit-1038.36)
 of 2012-01-29 on bob.porkrind.org
[PASSED]  simple:equal
[PASSED]  simple:=
...

===== Run 30 Tests, 29 Expected, 1 Failed, 0 Errored =====

make[1]: Leaving directory '/Users/conao/Develop/git/.dotfiles/.emacs.d/local/26.1/site-lisp/srt.el'

...
(Emacs 24.5, 25.3, 26.1)
...

===  localtest completed!!  ===

*FAILED* Emacs-22.1
*FAILED* Emacs-23.4
[PASSED] Emacs-24.5
*FAILED* Emacs-25.3
[PASSED] Emacs-26.1

这个问题有两部分。第一个是为一次测试提供所需的输出。如果(如您问题的标题所示)这取决于流程的返回值,那么这种方法将起作用:

single-test:
    (some-command && echo PASS) || echo FAIL
在您的情况下,这将成为:

ARGS := -Q --batch $(LOAD_PATH) -l srt-tests.el -f srt-run-tests

test-emacs-22.1:
    (emacs-22.1 $(ARGS) && echo [PASS] emacs-22.1) || echo *FAIL* emacs-22.1
第二部分是迭代版本列表。我建议使用模式规则:

ALL_EMACS_VERS := 22.1 23.4 24.5 25.3 26.1
TESTS := $(addprefix test-emacs-, $(ALL_EMACS_VERS))

all-tests: $(TESTS)

test-%:
    ($* $(ARGS) && echo [PASS] $*) || echo *FAIL* $*
最后,如果这些过程产生您希望抑制的输出:

test-%:
    ($* $(ARGS) > /dev/null && echo [PASS] $*) || echo *FAIL* $*
编辑:要在所有脚本输出后打印所有结果,最简单的方法是将它们保存在一个名为“结果”的文件中:


这个问题有两部分。第一个是为一次测试提供所需的输出。如果(如您问题的标题所示)这取决于流程的返回值,那么这种方法将起作用:

single-test:
    (some-command && echo PASS) || echo FAIL
在您的情况下,这将成为:

ARGS := -Q --batch $(LOAD_PATH) -l srt-tests.el -f srt-run-tests

test-emacs-22.1:
    (emacs-22.1 $(ARGS) && echo [PASS] emacs-22.1) || echo *FAIL* emacs-22.1
第二部分是迭代版本列表。我建议使用模式规则:

ALL_EMACS_VERS := 22.1 23.4 24.5 25.3 26.1
TESTS := $(addprefix test-emacs-, $(ALL_EMACS_VERS))

all-tests: $(TESTS)

test-%:
    ($* $(ARGS) && echo [PASS] $*) || echo *FAIL* $*
最后,如果这些过程产生您希望抑制的输出:

test-%:
    ($* $(ARGS) > /dev/null && echo [PASS] $*) || echo *FAIL* $*
编辑:要在所有脚本输出后打印所有结果,最简单的方法是将它们保存在一个名为“结果”的文件中:


谢谢你的回复!我想不出一个办法来定义这样的工作。但是,我不想丢弃每个测试的日志(尽管我的问题写得不好)。我编辑了这个问题,所以我很高兴看到它。@Naoyayahashita:现在还不清楚每个emacs过程应该产生什么。不清楚的是什么?我不想丢弃Emacs的所有输出日志,并立即显示测试摘要。@Conao3:那么问题出在哪里?我的解决方案有效。是的,你做到了。但您的解决方案是放弃Emacs详细测试日志(如
simple:equal
is pass等)。谢谢您的回复!我想不出一个办法来定义这样的工作。但是,我不想丢弃每个测试的日志(尽管我的问题写得不好)。我编辑了这个问题,所以我很高兴看到它。@Naoyayahashita:现在还不清楚每个emacs过程应该产生什么。不清楚的是什么?我不想丢弃Emacs的所有输出日志,并立即显示测试摘要。@Conao3:那么问题出在哪里?我的解决方案有效。是的,你做到了。但您的解决方案是放弃Emacs详细测试日志(例如
simple:equal
is pass等等)