似乎有些答案是合理的,但我不知道如何执行。而且我还没有找到一个全面的答案。
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] 删除。
我来说两句