【问题标题】:How to test a function which returns void in google test?如何测试在谷歌测试中返回 void 的函数?
【发布时间】:2022-12-10 12:07:45
【问题描述】:

我有一个需要测试的函数,但它返回void

该函数可能会修改一些全局变量。

例如:

/* target_code.h */

void add_num(int n);
/* target_code.c */

#include "target_code.h"

int number = 0;

void add_num(int n) {
    number += n;
}

(我要测试的真实功能比它更复杂。)

我想使用框架 - 谷歌测试来测试这个功能。

所以也许我需要实施一个测试程序来测试它。

/* testProgram.cpp */
include "target_code.h"

/* implement the test case for it */


但是这个函数不返回任何东西。它只是修改一个全局变量。

在我的同事看来,extern这个变量number并检查这个例子中的值是否正确是不好的。

不好的事情之一是,也许我们会更改关于number 的变量名,并且这个测试程序可能需要重新编写(难以维护)。

但是没有这个方法,我不知道如何测试这个功能是否正常工作。

我认为的一个方法是实现一个与add_num 做类似事情的函数,并验证这个函数。

这是我认为的一个例子:

/* testProgram.cpp */

int fake_number = 0;
void fake_add_num(int n) {
    fake_number += n;
}

/* Implement the test cases */

fake_add_num 对真正的函数“add_num”做同样的事情。他们之间的区别是我可以直接联系到这个fake_number

也许有不同的方法来验证这种功能。

请给我一个例子来做到这一点。谢谢!!

【问题讨论】:

  • 在我的同事看来,在这个例子中,extern 这个变量号并检查值是否正确是不好的。不,问题是你首先有一个修改全局状态的方法。它应该被更改为不依赖于任何全局变量。如果您绝对不能这样做,那么 extern 是您唯一的选择 - 您需要以某种方式访问​​该全局变量以对其进行检查。或者测试可能过于精细,您应该考虑测试使用add_num 的代码,而不是函数本身。
  • extern这个变量号不好“已经是了。

标签: c++ c unit-testing googletest


【解决方案1】:

您可以创建一个内部可见方法(在某些内部名称空间中),测试使用它来获取此全局状态,然后您可以执行类似的操作

// in header
namespace my_proj {
namespace internal {
int GetNumber() { return number; }
}
}

// in test
add_num(5);
EXPECT_EQ(expected_value, GetNumber());

最后一件事,使用全局变量不是推荐的方法,因为它会引入问题,所以如果你能避免它,可能会更好。

【讨论】:

    猜你喜欢
    • 2022-11-23
    • 1970-01-01
    • 2019-03-07
    • 2019-04-21
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    相关资源
    最近更新 更多