1v0*_*1v0 6 c++ eclipse googletest test-runner
我有一个关于Eclipse 中的Googletest的基本问题。
我正在使用test-runner插件来运行 Googletests。但是我需要指定一个运行我的单元测试的二进制文件(当然这是有道理的。)
问题是在我的项目中,我现在有两个主要功能,一个运行实际程序,一个
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
Run Code Online (Sandbox Code Playgroud)
运行谷歌测试。
每次我想运行一个时,我都会将另一个注释掉,这当然是愚蠢的。
但是你用什么方法来处理这种情况呢?
Googletest C++ 是一个单元测试框架。这意味着它旨在测试 C++ API 的实现。它不适合测试程序。
出于实际目的,C++ API 就是您在 C++ 头文件中获得的内容。这样一个 API 的实现可能是:
概括地说,C++ API 的实现是一个头文件加上 0 个或多个源文件。
假设您的程序my_prog调用您或您的团队为管理小发明而开发的 API。实现是这样的:
gizmo.h
[gizmo_0.cpp,...gizmo_N.cpp]
Run Code Online (Sandbox Code Playgroud)
其中[...]表示可选...
也许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
或依赖于它来管理 gizmos 的任何其他程序。因此,将实现的单元测试合并到实现中 my_prog是错误的:-
也许您的同事编写了另一个程序,该程序也需要使用此实现来管理小玩意。也许你再写一篇。编写这个其他程序的人是否应该重复将 gizmo 单元测试合并到其中的过程 - 相同的程序?不同的?- 并使程序有条件地编译为小发明测试工具或现实生活中的任何内容?
你怎么知道 gizmo 实现不会以某种方式与 独有的功能纠缠在一起,或者与以相同方式使用的my_prog其他一些 API 的实现纠缠在一起- 这样当你或其他人尝试在另一个程序中重用它时,my_prog它损坏或行为错误?
依赖此小发明实现的程序都不是进行单元测试的地方。my_prog有条件地编译不同的函数main,以便它可以兼作小发明库的单元测试工具,类似于在牛仔裤的裤裆上切一个洞,让你的头穿过。
对 gizmo 库进行单元测试的方法是编写一个程序作为该库的测试工具,仅此而已。例如,该程序gizmo_test将以与任何其他程序使用它相同的方式使用 gizmo API,但其唯一目的是测试 gizmo 库。要做的gizmo_test就是通过调用 API 来执行 Gizmo 库的测试。
作为第一个近似值,GoogleTest 的配方gizmo_test是:
写一个头文件,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();
}
Run Code Online (Sandbox Code Playgroud)
创建一个项目gizmo_test- 在 Eclipse 或您使用的任何开发环境或构建系统中 - 通过以下gizmo_test方式构建可执行文件:
gizmo_test.cpp+[gizmo_0.cpp,...gizmo_N.cpp]gizmo_test.o+ [gizmo_0.o,...gizmo_N.o]、 pluslibgtest以及您的 Gizmo 库所依赖的任何其他库你有两个项目。创造的人和my_prog创造的人gizmo_test。在您的开发环境或构建系统中,使 的构建my_prog依赖于 的构建gizmo_test,这样当您更改影响 gizmo 库和重建的任何内容时my_prog,gizmo_test首先会重建。
这是第一个近似值。您是否注意到不久前我开始谈论您的小发明库?这就是你已经拥有的(或者应该拥有的)。在 C++ 和编程中,API 的实现称为库。
也许您还注意到了配方中的一些脆弱性、不便性和浪费gizmo_test。[gizmo_0.cpp,...gizmo_N.cpp]两个项目中都有相同的 Gizmo 源文件集
。因此,您可以在两个项目中以不同的方式编辑、编译和链接它们。它们将在两个项目中进行编译,要么不同,这是错误的,要么相同,这是毫无意义的。
当然,如果这组源文件是空的 - gizmo 库只不过是gizmo.h- 就不存在这样的问题。但如果它不是空的,那就有。
如您所知,在 C++ 中,我们不会通过在每个使用库的程序中构建其源文件来使用库 - 除非它是仅包含头文件的库。库本身构建成对象库(静态或动态),要使用它,程序只需包含库的头文件并链接对象库。
这也是程序应该如何使用你的小工具库的方式。所以最终的近似值:-
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。这将是值得的。
如果需要指出,单元测试不是程序测试,因此,除了对程序依赖的任何库进行单元测试之外,如果它们是您的责任,您还需要对程序进行黑盒测试。
| 归档时间: |
|
| 查看次数: |
1852 次 |
| 最近记录: |