2

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

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

... 
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; } 

ответ

1

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

make -k check 
+0

Отлично! Я добавил параметр -k в переменную MAKEFLAGS в Makefile.am в корневом каталоге, который запускает все тесты, и он отлично работает! – Harald

2

Я знаю, что это некрасиво, но один из способов решить вашу проблему - перенести все ваши тесты из всех подкаталогов в один объект 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.я

TESTS = subdir1/fail subdir1/pass subdir2/pass 
+1

Откомандирован. Кроме того, рассмотрите возможность использования * только * верхнего уровня 'Makefile.am'. Игра с automake 'SUBDIRS' очень запутывается очень быстро. – rubicks