2

我們在我們的軟件中利用autotools(autoconf & automake)基礎設施進行了多次迴歸測試。這些迴歸測試根據它們測試的功能/單元在不同的子目錄之間進行分割。我們發現,一旦任何一個子目錄在任何測試中失敗,後續子目錄中的後續測試都不會執行,因此我們無法完整了解哪些功能能夠按預期工作。是否有辦法改變這種行爲並強制執行所有測試,即使有一些測試失敗了?即使有一些失敗,也執行所有測試中的測試

請考慮下面的最小示例,其中subdir1失敗,然後make check不前進到subdir2。輸出使用make檢查(產生通過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 

此SMaL公司測試的文件有:

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

太棒了!我已經在啓動所有測試的根目錄下的Makefile.am文件中將-k選項添加到MAKEFLAGS變量中,並且它非常完美! – Harald

2

我知道這不是很美,但解決您的問題的一種方法是將所有子目錄中的所有測試放入一個Makefile中的單個TESTS對象。例如:

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

借調。另外,考慮使用* only *頂級'Makefile.am'。玩automake'SUBDIRS'很快就會令人困惑。 – rubicks

相關問題