Просто убедитесь, что каждый тест оставляет свой результат в файле, уникальном для этого теста.Наименьшим трением будет создание теста .pass
, если тест пройден, в противном случае создайте тест .fail
.В конце тестового прогона соберите все файлы и сгенерируйте отчет.
Эта схема имеет два преимущества, которые я вижу:
- Вы можете запустить тесты параллельно (Вы делаете нам флаг
-jn
, не так ли? (Подсказка: весь смысл make )) - Вы можете использовать файлы результатов, чтобы записать, нужен ли тестперезапуск (стандартная отбраковка работы (подсказка: это почти весь смысл make ))
При условии, что тесты называются test-blah где бла - любая строка, и у вас есть список тестов в ${tests}
(в конце концов, вы только что построили их, так что это не является необоснованным предположением).
Aэскиз:
fail = ${@:%.pass=%.fail}
test-passes := $(addsuffix .pass,${tests})
${test-passes}: test-%.pass: test-%
rm -f ${fail}
touch $@
$* || mv $@ ${fail}
.PHONY: all
all: ${test-passes}
all:
# Count the .pass files, and the .fail files
echo '$(words $(wildcard *.pass)) passes'
echo '$(words $(wildcard *.fail)) failures'
Более детально:
test-passes := $(addsuffix .pass,${tests})
Если ${tests}
содержит test-1 test-2
(скажем), то ${test-passes}
будет test-1.pass test-2.pass
${test-passes}: test-%.pass: test-%
Вы просто должны любить статические правила паттернов. - Это говорит о том, что файл
test-1.pass
зависит от файла test-1
.Аналогично для test-2.pass
.
- Если
test-1.pass
не существует или старше исполняемого файла test-1
, то make запустит рецепт. rm -f ${fail}
${fail}
расширяется до цели: pass заменяется на fail или test-1.fail
в этом случае.-f
гарантирует, что rm не вернет ошибку в случае, если файл не существует. touch $@
- создайте файл .pass $< || mv $@ ${fail}
Здесь мы запускаем исполняемый файл - Если он возвращает успех, наша работа завершается
- В случае неудачи выходной файл удаляется, и на его место ставится
test-1.fail
- В любом случае, make не видит ошибок
.PHONY: all
- Цель all является символической и не являетсяфайл all: ${test-passes}
Прежде чем запустить рецепт для all , мы собираем и запускаем все тесты echo '$(words $(wildcard *.pass)) passes'
Перед передачей текста в оболочку, make раскрывает $(wildcard)
в список файлов передачи, а затем считает файлы с помощью $(words)
.Оболочка получает команду echo 4 passes
(скажем)
Вы запускаете это с
$ make -j9 all
Make сохранит 9 заданийработает сразу - прекрасно, если у вас 8 процессоров.