Automake: как эффективно обрабатывать глобальные и локальные проверки? - PullRequest
2 голосов
/ 26 января 2010

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

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:

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, но я почти уверен, что есть какой-то способ решить эту дилемму. Кто-нибудь здесь может дать мне подсказку?

Ответы [ 3 ]

4 голосов
/ 03 февраля 2010

Прекратите свои тесты. В ваших тестах / 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».

1 голос
/ 29 января 2010

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

check:
        DISABLE_SUBTESTS=1 make check-recursive

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

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

1 голос
/ 28 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...