Выполнять все тесты в подкаталогах, даже если некоторые из них терпят неудачу

В нашем программном обеспечении есть несколько регрессионных тестов, использующих инфраструктуру autotools (autoconf и automake). Эти регрессионные тесты разделены между разными подкаталогами в соответствии с тестируемыми функциями / модулями. Мы обнаружили, что после сбоя одного из подкаталогов в любом тесте последующие тесты в следующих подкаталогах не выполняются, и поэтому мы не получаем полной картины того, какие функции продолжают работать должным образом. Есть ли способ изменить это поведение и принудительно выполнить все тесты, даже если некоторые тесты завершились неудачно?

Рассмотрим следующий минимальный пример, в котором subdir1 терпит неудачу, а затем проверка make не переходит к subdir2. Вывод (после генерации конфигурации с помощью autoreconf -fiv и простого вызова ./configure) с использованием make check:

...
make[2]: Entering directory `x/subdir1'
make[3]: Entering directory `x/subdir1'
FAIL: fail
PASS: pass
make[4]: Entering directory `x/subdir1'
make[4]: Nothing to be done for `all'.
make[4]: Leaving directory `x/subdir1'
============================================================================
Testsuite summary for test 1.0
============================================================================
# TOTAL: 2
# PASS:  1
# SKIP:  0
# XFAIL: 0
# FAIL:  1
# XPASS: 0
# ERROR: 0
============================================================================
See subdir1/test-suite.log
============================================================================
make[3]: *** [test-suite.log] Error 1
make[3]: Leaving directory `x/subdir1'
make[2]: *** [check-TESTS] Error 2
make[2]: Leaving directory `x/subdir1'
make[1]: *** [check-am] Error 2
make[1]: Leaving directory `x/subdir1'
make: *** [check-recursive] Error 1

Файлы для этого небольшого теста:

configure.ac

AC_INIT([test], [1.0])
AM_INIT_AUTOMAKE()
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([
 Makefile
 subdir1/Makefile
 subdir2/Makefile
])
AC_OUTPUT

subdir1 / Makefile.am

check_PROGRAMS = fail pass
TESTS = fail pass
fail_SOURCES = fail.c
pass_SOURCES = pass.c

subdir2 / Makefile.am

check_PROGRAMS = pass
TESTS = pass
pass_SOURCES = pass.c

и общие источники для fail.c и pass.c

pass.c

int main (void)
{ return 0; }

fail.c

int main (void)
{ return 1; }

person Harald    schedule 19.11.2015    source источник


Ответы (2)


чтобы продолжить выполнение make даже в случае сбоя некоторых подцелей, вы можете добавить флаг -k - это работает независимо от фактической цели:

make -k check
person umläute    schedule 21.11.2015
comment
Большой! Я добавил параметр -k в переменную MAKEFLAGS в файле Makefile.am в корневом каталоге, который запускает все тесты, и он отлично работает! - person Harald; 23.11.2015

Я знаю, что это некрасиво, но один из способов решить вашу проблему - поместить все ваши тесты из всех подкаталогов в один объект TESTS в одном Makefile. Например:

configure.ac

AC_INIT([test], [1.0])
AM_INIT_AUTOMAKE()
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([
 Makefile
 subdir1/Makefile
 subdir2/Makefile
])
AC_OUTPUT

subdir1 / Makefile.am

check_PROGRAMS = fail pass
fail_SOURCES = fail.c
pass_SOURCES = pass.c

subdir2 / Makefile.am

check_PROGRAMS = pass
pass_SOURCES = pass.c

добавляется к Makefile.am верхнего уровня

TESTS = subdir1/fail subdir1/pass subdir2/pass
person mkrufky    schedule 19.11.2015
comment
Прикомандированный. Также рассмотрите возможность использования только Makefile.am верхнего уровня. Игра с automake SUBDIRS очень быстро запутывается. - person rubicks; 20.11.2015