如何在通过自动工具构建的项目中使用Google Test?

乔尔:

似乎有些答案是合理的,但我不知道如何执行。而且我还没有找到一个全面的答案。

第一个问题

Google Test不应是已安装的库,而应与项目一起构建。(请参阅FAQ。)据我所知,这意味着Google Test库是我的单元测试的依赖项,应该在我第一次在项目中运行“ make check”时构建。这应该在某个目录中构建Google Test库。我不知道该怎么做。它提到了一些不推荐使用的自动工具脚本,我不确定他们在说什么或如何正确构建我的构建。

第二个问题

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

乔尔:

我已经满意地解决了这个问题!我现在将继续前进。这基本上是在要求教程。从逻辑上说,必须做出许多决定,以便Google Test与自动工具完美结合。因此,对于冗长的回答,我事先表示歉意,但是所有详细信息都应该存在。

第一个问题

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

“我们如何配置自动工具以将Google Test编译为我们的测试代码可以链接的库?”

为此,我们需要下载Google Test并将其放入我们的项目中。我使用Github,因此可以通过在项目的根路径中添加一个子模块来实现:

$ git submodule add [email protected]: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 Test库make check,因此我将使用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中启用子目录对象。这是通过将其添加到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)创建测试(b)并链接到Google Test库并使用它们?这些问题是相互交织的,因此我们立即回答。

创建测试仅需将以下代码放入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 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从中记录(注意所有错误,并希望予以纠正)/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
============================================================================

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Maven项目中使用OpenCV构建(opencv和opencv_contrib)

如何在Maven项目中使用JUnit Test Runners?

如何在Xcode 6.1.1中使用Google Test运行本地C ++单元测试

如何在py.test中使用多个内核?

如何在cmake add_test中使用重定向

如何使用自动工具使用clang和选项-std = c ++ 11编译项目

如何在Google Test(gtest)中使用夹具成员值运行参数化测试?

如何使用Google Test捕获细分错误?

如何在Android Studio中使用android.test.mock

如何在同一自动工具项目中为两个程序具有不同的生成选项

Google Test To Doxygen页面

如何在应用功能中使用cor.test?

如何在自动工具构建系统中完全包含另一个项目?

如何在由bazel构建的项目中使用vscode python调试器?

如何在Gradle项目中使用GWT快照构建?

递归自动工具项目中的并行构建

在静态lib配置中使用Clang消毒器配置自动工具项目?

如何在Jasmine中使用React Test Utilities

使用自动工具的多个构建标志

如何在不基于gradle构建的android项目中使用ShowcaseView库?

如何在Django项目中使用外部python实用工具文件?

如何在项目中使用Printf

如何在OSX上使用test -h或test -L?

如何使用自动工具构建特定组件?

如何在我的Android Studio项目中使用一个代号迁移工具?

如何在共享项目中使用 Google Admob?

如何在python中使用Box Pierce Test

无法在基于 jest 和 vue-test-utils 的测试项目中使用 vue.js 的 ES6 模块

如何在 py.test 中使用夹具?