Unit testing 如何使用GoogleTest测试重数据结构的方法?
假设我们有以下类:Unit testing 如何使用GoogleTest测试重数据结构的方法?,unit-testing,c++11,testing,googletest,Unit Testing,C++11,Testing,Googletest,假设我们有以下类: class Graph { public: Graph(int num_vertices, int num_edges, const EdgeList& edge_list) : num_vertices_(num_vertices), num_edges_(num_edges), edge_list_(edge_list) { } int GetNumberOfComponents() { ... } private: int num_
class Graph {
public:
Graph(int num_vertices, int num_edges, const EdgeList& edge_list)
: num_vertices_(num_vertices), num_edges_(num_edges), edge_list_(edge_list) { }
int GetNumberOfComponents() { ... }
private:
int num_vertices_;
int num_edges_;
EdgeList edge_list;
}
在gtest.cpp文件中,我有如下内容:
#include "gtest/gtest.h"
TEST(Test, NumberOfComponentsTest) {
Graph graph(4, 3, {{1, 2}, {2, 3}, {1, 3}});
EXPECT_EQ(2, graph.GetNumberOfComponents());
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
目标是使用Google测试框架检查GetNumberOfComponents()
是否正常工作
但是,让我们考虑一个大的测试用例,例如:<代码> No.Vig顶点= 1000 ,<代码> NoMyByLead=100000 < /COD>。如果我不想硬编码所有边,那么在这种情况下如何编写这样的测试?;)
如果您不想硬编码大型图,那么您需要一种确定性的方法在运行时生成它。从文件读取会创建文件系统依赖项并降低测试速度。如果不想硬编码大型图形,则需要确定的方法在运行时生成它。从文件读取会创建文件系统依赖项并降低测试速度。该问题实际上隐藏了两个问题:- 我在测试性能吗?然后是的,我需要测试100K边缘情况(并测量时间或其他资源使用情况)
- 我是否正在测试边界条件,并且我知道该实现有大约100K条边的条件代码?那么是的,我需要测试这个案例
- 我是否正在测试健壮性或安全性,并且我有理由认为我可能能够用100K边缘破坏被测系统?那么是的,我需要测试这个案例
- 另一方面,如果我“只是”测试正确性,为什么我会觉得测试(比如)10条边不足以让自己相信实现也可以用于100K条边?在继续之前,我需要回答这个问题
图形
类的设计问题需要解决:
- 既然构造器需要边缘列表,为什么它还需要参数
中此类列表的大小?实现可以很容易地从列表本身获得列表的大小num_edges
- 此外,要求顶点数量的事实也是有问题的,其原因始终与接收边列表的原因相同。顶点数量应根据边列表计算,否则,如果
与根据边列表计算的顶点数量之间存在矛盾,会发生什么情况num_顶点
您正在编写一个测试这一事实非常好,因为该测试迫使您对
图形的设计提出质疑。考虑一下,并考虑重新设计,使用其他更简单的测试来指导你的设计。 < P>实际上隐藏了两个问题:
我到底在测试什么
假设我决定我真的需要测试100K边,那么最好的方法是什么
从我的观点和经验来看,最重要的问题是1:
- 我在测试性能吗?然后是的,我需要测试100K边缘情况(并测量时间或其他资源使用情况)
- 我是否正在测试边界条件,并且我知道该实现有大约100K条边的条件代码?那么是的,我需要测试这个案例
- 我是否正在测试健壮性或安全性,并且我有理由认为我可能能够用100K边缘破坏被测系统?那么是的,我需要测试这个案例
- 另一方面,如果我“只是”测试正确性,为什么我会觉得测试(比如)10条边不足以让自己相信实现也可以用于100K条边?在继续之前,我需要回答这个问题
进行比较:假设我正在测试一个函数,该函数返回一系列数字的和。假设我对0、1和5个元素的列表进行了测试。为什么我认为5个元素不能很好地代表一般情况
我想说的是,在开始编写测试代码之前,第一个人必须真正理解自己正在测试什么以及为什么要测试
对于问题2,我认为罗伯特的答案是正确的,我只能解释一下。您需要编写一个尽可能简单的助手函数,以便在运行时生成图形
但从代码来看,似乎有一些图形
类的设计问题需要解决:
- 既然构造器需要边缘列表,为什么它还需要参数
num_edges
中此类列表的大小?实现可以很容易地从列表本身获得列表的大小
- 此外,要求顶点数量的事实也是有问题的,其原因始终与接收边列表的原因相同。顶点数量应根据边列表计算,否则,如果
num_顶点
与根据边列表计算的顶点数量之间存在矛盾,会发生什么情况
您正在编写一个测试这一事实非常好,因为该测试迫使您对图形的设计提出质疑。考虑一下,并考虑重新设计,使用其他更简单的测试来指导你的设计。看起来你想让我们为你编写一些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只在