googletest:测试太大的数据结构



我一直在尝试创建一个测试用例,其中我的向量太大而无法由我的函数处理,但是在将输入向量的大小与 std::vector 进行比较时,我的输入验证没有被触发

我使用 Bazel 作为我的构建平台,使用 googletest 作为我的测试框架。

以下是用于捕获超大矢量的验证语句:

std::vector<int> Solution::fit_sum(std::vector<int> v, int sum)
{
// input validation
if(v.empty() || 
v.size() > v.max_size() ||
v.size() < 0) // handle int overflow
{
printf("input invalidn");
return {};
}
printf("v.size = %dn", v.size());
printf("v.max_size() = %dn", v.max_size());
// functional code below
}

这是我创建的测试用例:

TEST(FIT_SUM_TEST, TOO_LARGE) {
Solution solution;
std::vector<int> input;
for (int i = 0; i < input.max_size() + 1; i++)
{
input.push_back(i);
}
int sum = 1;
std::vector<int> actual = solution.fit_sum(input, sum);
std::vector<int> expected = {};
EXPECT_EQ(expected, actual);
}

输出如下:

[ RUN      ] FIT_SUM_TEST.TOO_LARGE
v.size = -2147483648
v.max_size() = -1
[       OK ] FIT_SUM_TEST.TOO_LARGE (46174 ms)

我有点困惑,因为即使满足条件,我也没有输入我的输入验证 if 语句。

有谁知道发生了什么?

编辑:

我意识到我正在测试的内容从根本上是有缺陷的,因为任何构建太大数组的程序都会崩溃。

我想更好的提问方式是: 1( 如何正确考虑过大的向量? 2(我如何确定"太大"有多大? 3( 函数本身的运行时间为 O(n^2(。鉴于这种复杂性,我是否应该对我的输入施加不同的限制?

您的测试成功完成,因为您看到以下行:

[       OK ] FIT_SUM_TEST.TOO_LARGE (46174 ms)

对于"向量何时太大?通常,如果您在编译时知道矢量的大小,则需要为矢量预分配内存。 如果不这样做,那么矢量将经常以耗时的方式调整大小。 使用 std::vector::resize(( 函数或在构造函数中指定向量的大小。

但是,在您的情况下,一开始不预分配内存是避免程序崩溃的原因。 如果您尝试预先分配 max_size(( 元素,您将获得bad_alloc异常,因为需要大量的虚拟内存来实现这一点。 另一方面,一旦可用内存耗尽,push_back(( 将停止分配额外的内存。 它可能会也可能不会通过异常,具体取决于实现。https://en.cppreference.com/w/cpp/container/vector/push_back

将大小视为负数的原因是您在 printf(( 中使用了不正确的类型规范。你应该改用std::cout。

最新更新