Как вы создаете тесты для проверки с помощью GNU autotools

Я использую автоинструменты GNU для системы сборки конкретного проекта. Я хочу начать писать автоматические тесты для проверки. Я хотел бы просто набрать "make check", чтобы он автоматически запустил их. Мой проект написан на C ++, хотя мне все еще интересно писать автоматические тесты для других языков.

Совместимо ли это практически со всеми существующими средами модульного тестирования (я думал об использовании cppunit)? Как подключить эти фреймворки модульного тестирования к make check? Могу ли я убедиться, что мне не требуется установка программного обеспечения для модульного тестирования, чтобы можно было настроить и собрать остальную часть проекта?


person Greg Rogers    schedule 25.09.2008    source источник


Ответы (5)


Чтобы выполнить тестовый запуск при выдаче make check, вам нужно добавить их в переменную TESTS

Предполагая, что вы уже создали исполняемый файл, который запускает модульные тесты, вы просто добавляете имя исполняемого файла в переменную TESTS следующим образом:

TESTS=my-test-executable

Затем он должен автоматически запускаться, когда вы make check, и если исполняемый файл возвращает ненулевое значение, он сообщит об этом как об ошибке теста. Если у вас несколько исполняемых файлов модульного теста, просто перечислите их все в переменной TESTS:

TESTS=my-first-test my-second-test my-third-test

и все они побегут.

person jonner    schedule 06.10.2008
comment
вы также можете использовать переменную TESTS_ENVIRONMENT, если вам нужно настроить среду, в которой будут запускаться ваши тесты, например PATH. - person tmatth; 18.03.2010
comment
И, конечно, если вы хотите собрать тесты из исходного кода, но не устанавливать их, вы, вероятно, должны указать их имена в переменной check_PROGRAMS Automake и определить все необходимые источники и параметры сборки, как и для любой другой цели. - person John Bollinger; 28.10.2018
comment
Правильно / неправильно / или безразлично, тесты не находятся в архиве, когда вы делаете make dist. - person Lloyd Rochester; 07.02.2020

Я использую Check 0.9.10

    configure.ac
    Makefile.am
    src/Makefile.am
    src/foo.c
    tests/check_foo.c
    tests/Makefile.am
  1. ./configure.ac

    PKG_CHECK_MODULES ([ПРОВЕРКА], [проверка> = 0.9.10])

  2. ./tests/Makefile.am для тестовых кодов

    TESTS = check_foo
    check_PROGRAMS = check_foo
    check_foo_SOURCES = check_foo.c $(top_builddir)/src/foo.h
    check_foo_CFLAGS = @CHECK_CFLAGS@
    
  3. и напишите тестовый код, ./tests/check_foo.c

    START_TEST (test_foo)
    {
        ck_assert( foo() == 0 );
        ck_assert_int_eq( foo(), 0);
    }
    END_TEST
    
    /// And there are some tcase_xxx codes to run this test
    

Используя проверку, вы можете использовать тайм-аут и сигнал повышения. это очень полезно.

person Dongho Yoo    schedule 29.11.2013

Кажется, вы задаете 2 вопроса в первом абзаце.

Первый касается добавления тестов в набор инструментов GNU autotools, но эти тесты, если я правильно вас понимаю, предназначены как для проверки того, что среда, необходимая для создания вашего приложения, существует (зависимые библиотеки и инструменты), так и для адаптации сборки к окружающая среда (отличия от платформы).

Второй касается модульного тестирования вашего приложения C ++ и того, где вызывать эти тесты, вы предложили сделать это из цепочки инструментов autotools, предположительно из скрипта configure. Однако это не является обычным делом - размещение «тестовой» цели в вашем Makefile - это более традиционный способ выполнения вашего набора тестов. Типичные шаги для создания и установки приложения с автоинструментами (по крайней мере, с точки зрения пользователя, а не с точки зрения разработчика) - это запустить сценарий configure, затем запустить make, затем, при необходимости, запустить make test и, наконец, выполнить установку.

Что касается второй проблемы, не желая, чтобы cppunit был зависимостью, почему бы просто не распространить его вместе с вашим приложением на C ++? Можете ли вы просто поместить его в любой архивный формат, который вы используете (будь то tar.gz, tar.bz2 или .zip) вместе с вашим исходным кодом. Раньше я использовал cppunit и был доволен им, поскольку использовал JUnit и другие фреймворки стиля xUnit.

person Kyle Burton    schedule 25.09.2008
comment
какое-нибудь представление о голосовании против? Вы чувствовали, что вопрос не был адресован напрямую? - person Kyle Burton; 25.09.2008

Вот метод без зависимостей:

#src/Makefile.am
check_PROGRAMS = test1 test2
test1_SOURCES = test/test1.c code_needed_to_test1.h code_needed_to_test1.c
test2_SOURCES = test/test2.c code_needed_to_test2.h code_needed_to_test2.c
TESTS = $(check_PROGRAMS)

make check, естественно, будет работать и отображать форматированный и обобщенный вывод:

$ make check
...
PASS: test1
PASS: test2
============================================================================
Testsuite summary for foo 1.0
============================================================================
# TOTAL: 2
# PASS:  2
# SKIP:  0
# XFAIL: 0
# FAIL:  0
# XPASS: 0
# ERROR: 0
============================================================================
  1. Когда вы сделаете make dist, ничего из src/test/* не будет в архиве. Тестового кода нет в дистрибутиве, будет только исходный код.
  2. Когда вы выполните make distcheck, он запустит make check и выполнит ваши тесты.
person Lloyd Rochester    schedule 22.02.2020

Вы можете использовать TESTS Automake для запуска программ, созданных с check_PROGRAMS, но это будет предполагать, что вы используете драйвер журнала и компилятор для вывода. Вероятно, проще использовать check_PROGRAMS, но вызывать набор тестов, используя локальное правило в Makefile:

check_PROGRAMS=testsuite

testsuite_SOURCES=...
testsuite_CFLAGS=...
testsuite_LDADD=...

check-local:
    ./testsuite
person wedesoft    schedule 20.10.2017