其他分享
首页 > 其他分享> > c – 如何在我的通过autotools构建的项目中使用Google Test?

c – 如何在我的通过autotools构建的项目中使用Google Test?

作者:互联网

似乎有一些答案是那种,有点理智,但我不知道如何执行.我还没有找到一个全面的答案.

第一个问题

Google Test不应该是已安装的库,它应该与项目一起构建. (参见FAQ.)据我所知,这意味着Google Test库是我单元测试的依赖项,应该在我第一次在项目中运行“make check”时构建.这应该在某个目录中构建Google Test库.我不知道该怎么做.它提到了一些被弃用的autotools脚本,我不确定他们在谈论什么,或者如何正确地指出我的构建.

第二个问题

假设构建成功,我如何编写使用我的本地编译版Google Test运行测试的测试?我假设我在test目录中放了一堆Makefile.am命令.但他们是什么?什么是使用Google Test的单元测试的例子?

解决方法:

我解决了这个问题让我满意!我现在完全继续前进.这基本上是要求教程.有许多决定必须在逻辑上进行,以便Google Test与autotools很好地吻合.所以我提前为长期答案道歉,但所有细节都应该在那里.

第一个问题

为了理解答案,这个问题需要稍微改写一下.我们正在将Google Test编译为我们的测试代码将链接到的库.该库将不会安装.我们想问的问题是

“How do we configure autotools to compile Google Test as a library
which our test code can link against?”

为此,我们需要下载Google Test并将其放入我们的项目中.我使用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)

我需要按照instructions编译.我只想在运行make check时构建Google Test库,所以我将使用check_LTLIBRARIES.我将以下内容添加到/ tests中的测试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
libgtest_la_LDFLAGS = -pthread

这需要在configure.ac中启用subdir-objects.这是通过将其添加到AM_INIT_AUTOMAKE行来实现的.我还需要在AC_CONFIG_FILES中包含makefile.我们也想使用libtool,因为我们正在编译库文件(我将在稍后解释为什么以及如何工作).要使用libtool,我们添加AM_PROG_AR,LT_INIT.我们希望autoreconf将m4宏安装到/ m4,然后我们希望automake找到它们,所以我们需要AC_CONFIG_MACRO_DIRS.我的configure.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
                 ])

我还需要在/Makefile.am中的/ m4宏目录中包含子目录和指向宏的行:

ACLOCAL_AMFLAGS = -I m4

SUBDIRS = src tests

这样做了什么? Libtool已启用AM_PROG_AR和LT_INIT. check_LTLIBRARIES意味着我们将使用libtool创建一个名为libgtest.la的便捷库.启用subdir-objects后,它将内置到/ tests目录中,但不会安装.这意味着,每当我们想要更新测试时,我们就不必重新编译Google Test库libgtest.la.这将节省测试时间并帮助我们更快地迭代.然后,我们将在稍后更新它们时编译我们的单元测试.只有在运行make check时才会编译库,如果我们想做的就是make或make install,那么通过不编译来节省时间.

第二个问题

现在,第二个问题需要改进:你如何(a)创建一个链接到Google Test库并因此使用它们的测试(b)?问题是交织在一起的,所以我们马上回答它们.

创建测试只需将以下代码放入位于/tests/gtest.cpp的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.要为您的库创建测试,您需要阅读primer.您会注意到我们不需要标题(尚未).我们链接到文件“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行来启用pthread.最后,我们需要包含将找到标题“gtest / gtest.h”的位置,即gtest_CPPFLAGS行.谷歌还希望我们包含/ googletest / googletest位置,并包括

事物的状态:Google Test库libgtest.la将使用make编译到目录/ tests中,但不会安装.二进制gtest只能使用make check进行编译,但不会安装.

接下来我们要告诉automake实际运行已编译的二进制gtest并报告错误.这是通过在/tests/Makefile.am中添加一行来完成的:

TESTS = gtest

最终的/tests/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(注意任何错误并希望修复它们)并进行检查,你应该得到一个运行的测试:

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
============================================================================

标签:c,unit-testing,automated-tests,googletest,autotools
来源: https://codeday.me/bug/20190928/1827087.html