c++ - 具有大型 C 和 C++ 代码库的 Gtest

标签 c++ c unit-testing googletest cxxtest

我参与了一个项目,我们有一个大型代码库,目前它根本没有单元测试框架。我们正在处理的代码最终将在充当交换机/路由器/防火墙的盒子上运行。

所以我正在编写一段需要使用 Gtest 进行单元测试的代码。 我遇到的问题是模拟变量以测试函数本身。 例如,我有一个函数,它使用类似 4 个指向不同对象的指针并使用几个全局变量。为了测试代码中的不同路径,我需要初始化几乎整个状态机/因变量的值。 增加了复杂性,因为在大型代码库中确实如此,我编写的这个函数/方法使用了一堆其他例程/方法,这些例程/方法也需要进行测试。其中每一个都需要进行统一测试,并且每个人都有自己的依赖关系。 我不确定我是否正确地解决了这个问题,或者 gtest 可能不是测试如此庞大的代码库的正确工具。

如果有人有测试经验,请说调用堆栈

function A {
    code 
    code
    function B
    code 
    code
    function C
    code
}

function B
{
    function D
    code
    function E
}

function C{
    code
    function F
    function G
    code
}

类似这样的事情。我如何测试所有这些功能 A-F ??什么是好的策略??

最佳答案

首先是重构代码,以便隔离可测试的部分。特别是,这意味着删除对全局变量的访问。示例:

int global;
int function() {
    int r = foo();
    global += r / 2;
    bar(r);
    return 42;
}

移除全局对象意味着将其转换为输入参数:

int real_function(int* target) {
    assert(target);
    int r = foo();
    *target += r / 2;
    bar(r);
    return 42;
}

当然,剩下的代码将停止编译,因此您添加一个向后兼容的代码:

int global_bar;
// @deprecated, use real_function() directly
int function() {
    return real_function(&global_bar);
}

使用它,您可以加强调用链,提取依赖项,并希望有一天可以删除对需要全局变量的变体的最后一次调用。同时,您可以为不再依赖于全局内容的函数编写测试。请注意,对于 C++,您将使用引用而不是指针,并且可能将所需的外部对象传递给类构造函数。这也称为依赖项注入(inject),请务必研究该术语以获得透彻的理解。

另一种测试涉及全局的函数的方法是使用测试的设置函数将全局重置为已知状态。不过,这仍然需要在全局范围内进行链接,这可能会很困难。不使用全局变量可能首先会使代码库变得更好,因此接受它也会发出错误的信息。

关于c++ - 具有大型 C 和 C++ 代码库的 Gtest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25773140/

相关文章:

c++ - OpenGL + SDL2 黑屏

c++ - 未解析的外部符号 “void __cdecl boost::tss_cleanup_implemented(void)”

c++ - 用于提高中间浮点计算精度的编译器标志

java - 测试 Jersey 客户端包装器

node.js - 单元测试快速路由器

C# - 单元测试工厂设计模式

c++ - 头文件和附加库

c - 在 Eclipse 索引器中处理 Keil C51 关键字

c - 达到计数 32751 后无法创建线程

c++ - fork 与父子通信