2010-01-26 5 views
2

В более крупном проекте, я установил ./tests/Makefile.am для запуска ряда тестов, когда я звоню make check. Файл global_wrapper.c содержит код установки/пробоя и вызывает функции тестирования, реализованные в нескольких подкаталогах.Automake: как эффективно обрабатывать глобальные и локальные «make check»?

TESTS = global_test 

check_PROGRAMS = global_test 

global_test_SOURCES = global_wrapper.c foo/foo_test.c bar/bar_test.c 

Отлично работает. Но тесты занимают много времени, поэтому я хотел бы иметь возможность выполнять только тесты из одного субдира. Так я сделал это сначала.

Я добавил подкаталоги:

SUBDIRS = foo bar 

В подкаталогах, я добавил местные обертки и Makefile.am «S:

TESTS = foo_test 

check_PROGRAMS = foo_test 

# the foo_test.c here is of course the same as in the global Makefile.am 
foo_test_SOURCES = foo_wrapper.c foo_test.c 

Это тоже здорово работает - когда я звоню make check в подкаталоге foo, выполняются только тесты foo.

Однако, когда я теперь называю make check в ./tests, все тесты выполняются дважды. Один раз через global_test и один раз через локальные тестовые программы.

Если я опускаю оператор SUBDIRS в глобальном Makefile.am, подкаталог make-файлов не создается. Если я опускаю TESTS из локального Makefile.am, то make check ничего не делает для локальных каталогов.

Я не знаком с automake, но я уверен, что есть какой-то способ решить эту дилемму. Может ли кто-нибудь здесь дать мне подсказку?

ответ

4

Перерыва тестов вверх. В своих тестах/Makefile.am сделать:

 
TESTS = foo_test bar_test 

и строить foo_test bar_test соответственно с чем-то вроде

 
foo_test_SOURCES = foo/foo_wrapper.c foo/foo_test.c 
bar_test_SOURCES = bar/bar_wrapper.c bar/bar_test.c 

Теперь, если вы сырой «сделать чек», оба теста будут работать. Если вы хотите только запустить один тест, вы можете сделать это с помощью «make check TESTS = foo_test» или «make check TESTS = bar_test», и будет проведен только соответствующий тест. Как правило, Makefile.am перечисляет все тесты, которые будут выполняться по умолчанию в TESTS, и пользователь выбирает альтернативные тесты во время выполнения.Естественно, если вы много запускаете тесты, вы можете «экспортировать TESTS = foo_test» в свой сеанс оболочки, а затем набирать «make check».

+0

Хороший совет с настройкой переменной окружения, но это не помогает с моей проблемой: наличие для глобального тестового запуска сводки всех * тестов * выполняется на * конце * вывода. – DevSolar

+0

Файл Makefile, созданный Automake, выводит итоговую информацию в конце. Он сообщает вам: «Все 2 теста прошли». Если вам нужно что-то более явное, ваш тест должен сгенерировать для вас результат. См. Примерную схему проверки контрольной единицы. –

1

Невозможно удалить из «global_test» любой тест, который уже выполнен в подкаталоге? (. Просто так они просто не получают выполняться дважды)

+0

Тесты генерируют много результатов и печатают их резюме в конце. Выполнение тестов поддиректории в последовательности утопило бы фактические результаты в этом выпуске, поэтому использование всех тестов, включенных в один глобальный пакет, полезно (в конце вывода вы получаете правильное представление в виде одного взгляда). – DevSolar

+0

Мои тесты обычно имеют подробный вариант. Когда они запускаются из make check, они молчат: стандартный вывод перенаправляется в файл журнала, и выдается только вывод stderr (с упоминанием файла журнала в случае сбоя). Таким образом, важная информация не скрывается в выходе. Когда тесты запускаются вручную, они являются подробными, а стандартный вывод идет на терминал. – adl

1

Я думаю, что вы могли бы, возможно, переписать check правило на верхнем уровне, чтобы определить переменную среды:

check: 
     DISABLE_SUBTESTS=1 make check-recursive 

, а затем проверить DISABLE_SUBTESTS в вашем подкатегории, чтобы решить, действительно ли выполнять тесты или нет.

(Лично я предпочел бы организовать работу в существующей make check рамок, скрывая выход моих тестов, а не перезаписывать произведенные правила, как это.)

+0

Это звучит интересно; как я уже сказал, я не знаком с Automake и не знал, что вы можете перезаписать правила. (И все равно не знал бы, что все-таки рекурсивный baout). Я проверю это. – DevSolar