Как я могу использовать Google Test с моим проектом, который строит через autotools?

похоже, есть несколько ответов, которые имеют смысл, но я не знаю, как их выполнить. И я не нашел исчерпывающего ответа.

Первая Проблема

Google Test не должен быть установленной библиотекой, он должен быть построен с проектом. (См. часто задаваемые вопросы.) Насколько я могу судить, это означает, что тестовые библиотеки Google являются зависимостью от моих модульных тестов и должны быть построены при запуске "make check" в моем проекте для первый раз. Это должно создать тестовые библиотеки Google в некотором каталоге. Я не знаю, как это делать. В нем упоминается какой-то устаревший сценарий autotools, и я не уверен, о чем они говорят или Как правильно указать мою сборку.

Вторая Проблема

предполагая, что сборка успешна, как написать тест, который использует мою локально скомпилированную версию Google Test для запуска тестов? Я предполагаю, что есть куча Makefile.команды, которые я ставлю в своих тестах справочник. Но что это такое? И какой пример модульного теста использует Google Test?

2 ответов


я решил проблему, к моему удовлетворению! Теперь я буду двигаться дальше. Это в основном просит учебник. Есть много решений, которые должны быть приняты, надеюсь, логически, так что тест Google хорошо вписывается в autotools. Поэтому я заранее извиняюсь за длинный ответ, но все детали должны быть там.

Первая Проблема

чтобы понять ответ, вопрос нужно немного перефразировать. Мы компилируем тест Google как библиотека, на которую будет ссылаться наш тестовый код. Библиотека не будет установлена. Вопрос, который мы хотим задать: "Как настроить autotools для компиляции Google Test в качестве библиотеки, с которой можно связать наш тестовый код?"

для этого нам нужно загрузить тест Google и поместить его в наш проект. У меня есть Github, поэтому я делаю это, добавляя подмодуль в корневой путь моего проекта:

git submodule add git@github.com:google/googletest.git
git submodule init
git submodule update

это загружает googletest в мой корень моего проект:

/:
    Makefile.am
    configure.ac
    src/:
        (files for my project)
    tests/:
        (test files)
    googletest/:
        googletest/:
            include/:
                (headers, etc., to be included)
                gtest/:
                    gtest.h
            m4/:
                (directory for m4 scripts and things)
            src/:
                (source files for Google Test)

мне нужно скомпилировать в - инструкции. Я только хочу, чтобы тестовая библиотека Google была построена на запуске make check, поэтому я буду использовать check_LTLIBRARIES. Я добавляю следующее к моим тестам Makefile.am in / тесты:

check_LTLIBRARIES = libgtest.la
libgtest_la_SOURCES = ../googletest/googletest/src/gtest-all.cc
libgtest_la_CPPFLAGS = -I$(top_srcdir)/googletest/googletest/include -I$(top_srcdir)/googletest/googletest
libgtest_la_LDFLAGS = -pthread

для этого необходимо включить subdir-объекты в configure.ac. Это достигается путем добавления его в строку AM_INIT_AUTOMAKE. Мне также нужно включить makefile в AC_CONFIG_FILES. Мы также хотим использовать libtool, потому что мы собираем библиотечные файлы (я объясню, почему и как это работает в данный момент). Чтобы использовать libtool, мы добавляем AM_PROG_AR, LT_INIT. Мы хотим, чтобы autoreconf установил макросы m4 в /m4, а затем мы хотим, чтобы automake нашел их, поэтому нам нужен AC_CONFIG_MACRO_DIRS. Моя настройка.ac обновил строки:

AM_INIT_AUTOMAKE([-Wall -Werror subdir-objects])
...
AM_PROG_AR
LT_INIT
AC_CONFIG_MACRO_DIRS([m4])
...
AC_CONFIG_FILES([Makefile
                 src/Makefile
                 tests/Makefile
                 ])

мне также нужно включить подкаталог и строку, указывающую на макросы в каталоге макросов /m4 в моем / Makefile.am:

ACLOCAL_AMFLAGS = -I m4

SUBDIRS = src tests

что это сделано? Libtool был включен с AM_PROG_AR и LT_INIT. Check_LTLIBRARIES означает, что мы будем использовать libtool для создания так называемой библиотеки удобства под названием libgtest.Ла. С включенными объектами subdir он будет встроен в каталог /tests, но не установлен. Это означает, что всякий раз, когда мы хотим обновить наши тесты, нам не нужно перекомпилировать тестовую библиотеку Google libgtest.Ла. Это сэкономит время при тестировании и поможет нам быстрее выполнять итерации. Затем мы захотим скомпилировать наше подразделение тесты против него позже, когда мы их обновляем. Библиотека будет скомпилирована только при запуске make check, экономить время, не компилируя его, если все, что мы хотим сделать, это make или make install.

Вторая Проблема

теперь вторая проблема должна быть уточнена: как вы (a) создаете тест (b), который связан с тестовыми библиотеками Google и, таким образом, использует их? Вопросы вроде как переплетены, поэтому мы сразу на них отвечаем.

создание теста-это просто вопрос о вводе следующего кода в gtest.cpp файл, расположенный в /tests / gtest.cpp:

#include "gtest/gtest.h" // we will add the path to C preprocessor later

TEST(CategoryTest, SpecificTest)
{
    ASSERT_EQ(0, 0);
}

int main(int argc, char **argv)
{
    ::testing::InitGoogleTest(&argc, argv);

    return RUN_ALL_TESTS();
}

это работает только простой тест 0=0. Чтобы создать тест для вашей библиотеки, вам нужно прочитать букварь. Вы заметите, что нам не нужен заголовок для этого (пока). Мы ссылаемся на файл "gtest/gtest.h", поэтому нам нужно будет убедиться, что мы скажем automake включить каталог с gtest/gtest.h.

Далее, мы должны сказать automake, что мы хотим построить проверьте и запустите его. Тест будет встроен в исполняемый файл, который мы не хотим устанавливать. Затем automake собирается запустить этот исполняемый файл. Он сообщит, говорит ли этот исполняемый файл, что тесты прошли или не прошли.

Automake делает это, глядя в makefile для переменной check_PROGRAMS. Это программы, которые он будет компилировать, но он не обязательно будет запускать их. Поэтому мы добавляем в /tests / Makefile.am:

check_PROGRAMS = gtest

gtest_SOURCES = gtest.cpp

gtest_LDADD = libgtest.la

gtest_LDFLAGS = -pthread

gtest_CPPFLAGS = -I$(top_srcdir)/googletest/googletest/include -I$(top_srcdir)/googletest/googletest -pthread

gtest_SOURCES находит /tests / gtest.файл cpp и компилирует его. gtest_LDADD ссылки против libgtest.la, который будет скомпилирован в каталог / tests. Google хочет, чтобы мы использовали строку gtest_LDFLAGS для включения pthreads. Наконец, нам нужно включить место, где заголовок " gtest / gtest.h " будет найден, и это строка gtest_CPPFLAGS. Google также хочет, чтобы мы включили местоположение /googletest/googletest и включили

ситуация: тестовая библиотека Google libgtest.la будет компилироваться с make в каталог / тесты, но не быть установленным. Двоичный gtest будет скомпилирован только с make check, но не будет установлен.

Далее мы хотим сказать automake фактически запустить скомпилированный двоичный gtest и сообщить об ошибках. Это достигается путем добавления строки в /tests / Makefile.am:

TESTS = gtest

окончательный / тесты / Makefile.am выглядит так:

check_LTLIBRARIES = libgtest.la
libgtest_la_SOURCES = ../googletest/googletest/src/gtest-all.cc
libgtest_la_CPPFLAGS = -I$(top_srcdir)/googletest/googletest/include -I$(top_srcdir)/googletest/googletest -pthread

check_PROGRAMS = gtest demo

gtest_SOURCES = gtest.cpp ../src/fields.cpp

gtest_LDADD = libgtest.la

gtest_LDFLAGS = -pthread

gtest_CPPFLAGS = -I$(top_srcdir)/googletest/googletest/include -I$(top_srcdir)/src

demo_SOURCES = demo.cpp ../src/fields.cpp

demo_CPPFLAGS = -I$(top_srcdir)/src

TESTS = gtest

теперь autoreconf -fiv (обратите внимание на любые ошибки и, надеюсь, исправить их) из / и make check и вы должны получить тест, который работает:

build(dev)$ make check
Making check in tests
/Applications/Xcode.app/Contents/Developer/usr/bin/make  gtest
make[2]: `gtest' is up to date.
/Applications/Xcode.app/Contents/Developer/usr/bin/make  check-TESTS
PASS: gtest
============================================================================
Testsuite summary for IonMotion 0.0.1
============================================================================
# TOTAL: 1
# PASS:  1
# SKIP:  0
# XFAIL: 0
# FAIL:  0
# XPASS: 0
# ERROR: 0
============================================================================

вот пример Makefile.am для проекта модульного тестирования (имя проекта: TestProject). Это зависит от GTEST и GMOCK:

Makefile.am

#######################################
# The list of executables we are building seperated by spaces
# the 'bin_' indicates that these build products will be installed
# in the $(bindir) directory. For example /usr/bin
#bin_PROGRAMS=exampleProgram

# Because a.out is only a sample program we don't want it to be installed.
# The 'noinst_' prefix indicates that the following targets are not to be
# installed.
noinst_PROGRAMS=utTestProject

#######################################
# Build information for each executable. The variable name is derived
# by use the name of the executable with each non alpha-numeric character is
# replaced by '_'. So a.out becomes a_out and the appropriate suffex added.
# '_SOURCES' for example.

# Sources for the a.out 
utTestProject_SOURCES= \
    utTestProject.cpp

# Library dependencies
utTestProject_LDADD = \
    $(top_srcdir)/../TestProject/build/${host}/libTestProject/.libs/libTestProject.a \
    ../$(PATH_TO_GTEST)/lib/libgtest.a \
    ../$(PATH_TO_GMOCK)/lib/libgmock.a 

# Compiler options for a.out
utTestProject_CPPFLAGS = \
    -std=c++11 \
    -I../$(PATH_TO_GTEST)/include \
    -I../$(PATH_TO_GMOCK)/include \
    -I$(top_srcdir)/include \
    -I$(top_srcdir)/..

TESTS = utTestProject

TESTS_ENVIRONMENT = export UT_FOLDER_PATH=$(top_srcdir)/utTestProject; \
                    export GTEST_OUTPUT="xml";

сборка gtest:

# Useful vars
SourceVersionedArchiveFolderName="gtest-1.7.0"

#
# Make it
#
pushd .
cd ./${SourceVersionedArchiveFolderName}/make

make gtest.a
if [ $? != 0 ]; then
    echo ": Make failed"
    exit 1
fi

popd