Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 如何使用GoogleTest测试重数据结构的方法?_Unit Testing_C++11_Testing_Googletest - Fatal编程技术网

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边,那么最好的方法是什么
  • 从我的观点和经验来看,最重要的问题是1:

    • 我在测试性能吗?然后是的,我需要测试100K边缘情况(并测量时间或其他资源使用情况)
    • 我是否正在测试边界条件,并且我知道该实现有大约100K条边的条件代码?那么是的,我需要测试这个案例
    • 我是否正在测试健壮性或安全性,并且我有理由认为我可能能够用100K边缘破坏被测系统?那么是的,我需要测试这个案例
    • 另一方面,如果我“只是”测试正确性,为什么我会觉得测试(比如)10条边不足以让自己相信实现也可以用于100K条边?在继续之前,我需要回答这个问题
    进行比较:假设我正在测试一个函数,该函数返回一系列数字的和。假设我对0、1和5个元素的列表进行了测试。为什么我认为5个元素不能很好地代表一般情况

    我想说的是,在开始编写测试代码之前,第一个人必须真正理解自己正在测试什么以及为什么要测试

    对于问题2,我认为罗伯特的答案是正确的,我只能解释一下。您需要编写一个尽可能简单的助手函数,以便在运行时生成图形

    但从代码来看,似乎有一些
    图形
    类的设计问题需要解决:

    • 既然构造器需要边缘列表,为什么它还需要参数
      num_edges
      中此类列表的大小?实现可以很容易地从列表本身获得列表的大小
    • 此外,要求顶点数量的事实也是有问题的,其原因始终与接收边列表的原因相同。顶点数量应根据边列表计算,否则,如果
      num_顶点
      与根据边列表计算的顶点数量之间存在矛盾,会发生什么情况

    您正在编写一个测试这一事实非常好,因为该测试迫使您对
    图形的设计提出质疑。考虑一下,并考虑重新设计,使用其他更简单的测试来指导你的设计。

    < P>实际上隐藏了两个问题:

  • 我到底在测试什么
  • 假设我决定我真的需要测试100K边,那么最好的方法是什么
  • 从我的观点和经验来看,最重要的问题是1:

    • 我在测试性能吗?然后是的,我需要测试100K边缘情况(并测量时间或其他资源使用情况)
    • 我是否正在测试边界条件,并且我知道该实现有大约100K条边的条件代码?那么是的,我需要测试这个案例
    • 我是否正在测试健壮性或安全性,并且我有理由认为我可能能够用100K边缘破坏被测系统?那么是的,我需要测试这个案例
    • 另一方面,如果我“只是”测试正确性,为什么我会觉得测试(比如)10条边不足以让自己相信实现也可以用于100K条边?在继续之前,我需要回答这个问题
    进行比较:假设我正在测试一个函数,该函数返回一系列数字的和。假设我对0、1和5个元素的列表进行了测试。为什么我认为5个元素不能很好地代表一般情况

    我想说的是,在开始编写测试代码之前,第一个人必须真正理解自己正在测试什么以及为什么要测试

    对于问题2,我认为罗伯特的答案是正确的,我只能解释一下。您需要编写一个尽可能简单的助手函数,以便在运行时生成图形

    但从代码来看,似乎有一些
    图形
    类的设计问题需要解决:

    • 既然构造器需要边缘列表,为什么它还需要参数
      num_edges
      中此类列表的大小?实现可以很容易地从列表本身获得列表的大小
    • 此外,要求顶点数量的事实也是有问题的,其原因始终与接收边列表的原因相同。顶点数量应根据边列表计算,否则,如果
      num_顶点
      与根据边列表计算的顶点数量之间存在矛盾,会发生什么情况

    您正在编写一个测试这一事实非常好,因为该测试迫使您对
    图形的设计提出质疑。考虑一下,并考虑重新设计,使用其他更简单的测试来指导你的设计。

    看起来你想让我们为你编写一些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只在