Googletest C++ 是一个单元测试框架。这意味着它是用于测试的
C++ API 的实现。它不是为了测试而设计的programs.
出于实际目的,C++ API 就是您在 C++ 头文件中获得的内容。这
这样一个 API 的实现可能是:
- 只是头文件本身。 (实现完全是内联的)
- 头文件加上单个 C++ 源文件
- 头文件加上一堆C++源文件
概括地说,C++ API 的实现是一个头文件加上
0 个或多个源文件。
说出你的程序my_prog
调用您或您的团队开发的 API
用于管理小发明。实现是这样的:
gizmo.h
[gizmo_0.cpp,...gizmo_N.cpp]
where [...]
means 可选...
Maybe my_prog
依赖于您或您的团队负责的其他 API,
但我们会坚持只用一个。my_prog
通过以下方式使用 Gizmo API:-
- Using
#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
被误导了:-
也许你的同事编写了另一个也需要管理小玩意的程序
通过这个实施。或许you再写一篇。这是谁写的
其他程序应该重复合并 Gizmo 单元测试的过程
进入它 - 相同的?不同的? - 并有条件地制定程序
编译为小发明测试工具或现实生活中的任何内容?
你怎么知道小发明的实现没有以某种方式与
独特的功能my_prog
,或者通过实施一些
其他APImy_prog
以同样的方式使用 - 这样当你或某人
否则尝试在另一个程序中重用它,它会损坏或行为错误吗?
任何依赖于这个小发明实现的程序都不是放置的地方
它的单元测试。制作my_prog
有条件地编译不同的main
功能所以它可以
作为 Gizmo 库的单元测试工具,类似于在
牛仔裤的胯部,让你的头可以穿过。
对 Gizmo 库进行单元测试的方法是编写一个程序is这
这个库的测试工具,仅此而已。这个程序,说gizmo_test
, 将要
使用 Gizmo API 的方式与任何其他程序使用它的方式相同,但是
仅用于测试 Gizmo 库。所有这些gizmo_test
要做的就是执行测试
通过调用其 API 来访问 Gizmo 库。
作为第一个近似值,GoogleTest 配方为gizmo_test
is:
写一个头文件,gizmo_test.h
#include "gizmo.h"
in it
#include <gtest/gtest.h>
in it
然后在里面写你的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]
, plus libgtest
以及您的 Gizmo 库所依赖的任何其他库
你有two项目。那个使my_prog
和那个使gizmo_test
。在您的开发环境中或
构建系统,构建my_prog
取决于构建gizmo_test
,这样当你改变任何影响
Gizmo 库并重建my_prog
, gizmo_test
首先被重建。
这是第一个近似值。你有没有注意到不久前我开始谈论你的小玩意library?就是这样
你已经(或应该)了。在 C++ 和一般编程中,API 的实现称为library.
也许您还注意到了配方中的一些脆弱性、不便性和浪费。gizmo_test
。您有相同的 Gizmo 源文件集[gizmo_0.cpp,...gizmo_N.cpp]
在这两个项目中。因此,您可以在两个项目中以不同的方式编辑、编译和链接它们。它们将在两个项目中进行编译,无论是不同的,
这是wrong,或者相同,这是毫无意义的。
当然,如果这组源文件是空的 - gizmo 库只不过是gizmo.h
- 不存在这样的问题。但如果不为空的话
有。
如您所知,在 C++ 中,我们不会通过在每个使用库的程序中构建其源文件来使用库 - 除非它是仅包含头文件的库。
库本身构建成object库(静态或动态),并且要使用它,程序只需包含该库的
头文件并链接对象库。
这也是程序应该如何使用你的小工具库的方式。所以最终的近似值:-
- 做一个项目
libgizmo
构建一个 gizmo 对象库(静态或动态,如您认为合适)。
- 做一个项目
gizmo_test
如上所述,只不过不是编译和链接[gizmo_0.cpp,...gizmo_N.cpp]
,它只是链接libgizmo
,并使这个项目
取决于libgizmo
项目。
- 做一个项目
my_prog
正如你现在所拥有的,但不是编译和链接[gizmo_0.cpp,...gizmo_N.cpp]
,只需链接libgizmo
,并使这个项目
取决于gizmo_test
项目。
所以你有了three当您构建第一个使用 gizmo 库的程序时,您就可以完成项目了。每个使用 gizmo 库的后续程序都需要一个
更多项目,例如my_prog
项目。
Googletest 是为测试 C++ 而设计的图书馆,这就是你应该如何使用它。
现在我对你的程序一无所知,也不知道你目前如何在你的项目中部署 Googletest 测试用例。也许有没有任何一个其中有明确定义的 API 实现
这些测试用例应该可以运行,您可以将其分解到独立的库中。可能是因为你的程序非常简单
对其“组件”进行单元测试是不适用的,您最好编写程序的黑盒测试。更有可能的是因为到目前为止你已经失败了
设计一个能够进行单元测试的程序架构。如果这就是你所发现的,你需要修复它,然后以正确的方式应用Googletest。这将是值得的
努力。
如果需要指出的话,单元测试不是program测试,以及对您的程序所依赖的任何库进行单元测试,如果它们是您的责任,那么您also需要对您的程序进行黑盒测试。