Googletest Eclipse C:如何让测试和生产都可执行?

我在
Eclipse中有一个关于
Googletest的基本问题.

我正在使用test-runner插件来运行Googletests.
但是我需要指定一个运行单元测试的二进制文件(当然这是有意义的.)

问题是,在我的项目中,我现在有两个主要功能,一个用于运行实际程序,另一个用于运行实际程序

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

运行谷歌测试.

每次我想运行一个我都会评论另一个,这当然是愚蠢的.

但是你用什么做法来处理这种情况呢?

最佳答案 Googletest C是一个单元测试框架.这意味着它用于测试

C API的实现.它不适用于测试程序.

出于实际目的,您可以在C头文件中获得C API.该
这种API的实现可能是:

>只是头文件本身. (实施完全是内联的)
>头文件加上一个C源文件
>头文件加上一堆C源文件

总而言之,C API的实现是头文件加
0个或更多源文件.

假设您的程序my_prog调用您或您的团队开发的API
用于管理小玩意儿.实现类似于:

gizmo.h
[gizmo_0.cpp,...gizmo_N.cpp]

其中[…]意味着……

也许my_prog依赖于您或您的团队负责的其他API,
但我们只会坚持一个. my_prog使用gizmo API: –

>在某些源文件中使用#include“gizmo.h”.
>编译[gizmo_0.cpp,… gizmo_N.cpp]源文件(如果有).
>链接[gizmo_0.o,… gizmo_N.o]目标文件(如果有).

(gizmo_0.obj,等等,如果你在Windows上)

假设使用Googletest测试您的Gizmo API实现
确认此实现是正确的,独立于my_prog
或任何其他依赖它来管理小玩意的程序.所以结合
my_prog实现中的实现单元测试是误导的: –

也许你的同事写了另一个也需要管理小玩意的程序
有了这个实现.也许你写另一个.是谁写的
其他程序应该重复整合Gizmo单元测试的过程
进入它 – 同样的?不同的? – 并有条件地制定计划
编译为Gizmo测试工具或现实生活中应该是什么?

你怎么知道Gizmo实现不是以某种方式纠缠在一起的
my_prog独有的功能,或者某些功能的实现
my_prog以同样的方式使用的其他API – 这样当你或某人时
否则尝试在另一个程序中重用它,它会破坏或行为错误?

没有依赖于这个Gizmo实现的程序是放置的地方
它的单元测试.使my_prog有条件地编译不同的主要功能,以便它可以
double作为你的Gizmo库的单元测试线束类似于切割一个洞
你的牛仔裤的裤裆让你的头穿过.

您应该对Gizmo库进行单元测试的方法是编写一个程序
这个库的测试工具,没有别的.这个程序,比如说gizmo_test,会的
使用Gizmo API的方式与任何其他程序使用它的方式相同,但是
仅用于测试Gizmo库. gizmo_test所做的就是执行测试
通过调用其API来调用Gizmo库.

作为第一个近似值,gizmo_test的GoogleTest配方是:

写一个头文件gizmo_test.h

#include“gizmo.h”

#include< gtest / gtest.h>在里面

然后在其中写下您的Googletest测试用例

编写以下源文件gizmo_test.cpp

#include "gizmo_test.h"

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

创建一个项目gizmo_test – 在Eclipse或您使用的任何开发环境或构建系统中 –
通过以下方式构建gizmo_test可执行文件:

>编译源文件gizmo_test.cpp [gizmo_0.cpp,… gizmo_N.cpp]
>链接生成的对象文件gizmo_test.o [gizmo_0.o,… gizmo_N.o],以及libgtest和您的Gizmo库所依赖的任何其他库

你有两个项目.制作my_prog的那个和制作gizmo_test的那个.在您的开发环境或
构建系统,使my_prog的构建依赖于gizmo_test的构建,这样当你改变任何影响的东西时
Gizmo库并重建my_prog,首先重建gizmo_test.

这是第一个近似值.你有没有注意到我开始谈论你的小发明图书馆?那是什么
你有(或应该有).在C和编程中,API的实现称为库.

也许你也注意到gizmo_test配方中的一些脆弱性,不便和浪费.您有相同的Gizmo源文件集
两个项目中的[gizmo_0.cpp,… gizmo_N.cpp].因此,您可以在两个项目中以不同方式编辑,编译和链接它们.他们将在两个项目中编译,或者以不同方式编译
这是错误的,或相同的,这是毫无意义的.

当然,如果这组源文件是空的 – Gizmo库只不过是gizmo.h – 没有这样的问题.但如果它不是空的,
有.

如您所知,在C中,我们不会通过在每个使用它的程序中构建源文件来使用库 – 除非它是一个仅限标头的库.
库本身构建为对象库(静态或动态),并且使用它只需要包含库的程序
头文件和链接对象库.

这也是程序应该如何使用你的Gizmo库.所以到最后的近似值: –

>制作一个项目libgizmo,用于构建Gizmo对象库(静态或动态,如您所见).
>如上所述制作一个项目gizmo_test,除了编译和链接[gizmo_0.cpp,… gizmo_N.cpp],它只是链接libgizmo,并使这个项目
依赖于libgizmo项目.
>现在就创建一个项目my_prog,但不是编译和链接[gizmo_0.cpp,… gizmo_N.cpp],只需链接libgizmo,然后创建这个项目
取决于gizmo_test项目.

因此,在构建使用Gizmo库的第一个程序时,您有三个项目.每个使用Gizmo库的后续程序都需要一个
更多项目,比如my_prog项目.

Googletest专为测试C库而设计,这就是您应该如何使用它.

现在,我对您的程序或您目前在项目中部署Googletest测试用例的方式一无所知.也许它里面没有任何定义明确的API实现
那些测试用例应该运用,你可以将其分解为独立的库.可能这可能是因为你的程序非常简单
对其“组件”进行单元测试是不适用的,只要编写程序的黑盒测试就更明智了.更可能是因为你到目前为止失败了
设计一个能够进行单元测试的程序架构.如果这是你找到的,你需要修复它,然后以正确的方式应用Googletest.值得的
努力.

如果需要指出,单元测试不是程序测试,所以以及对程序所依赖的任何库进行单元测试,如果它们是您的责任,您还需要对程序进行黑盒测试.

点赞