一文掌握google开源单元测试框架Google Test(3)

发表于:2023-3-15 09:20

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:linux    来源:知乎

  TestSuite测试事件
  TestSuite测试事件,同样的也需要实现的两个函数SetUpTestCase()和TearDownTestCase(),而这两个函数是静态函数。这两个静态函数同样也是testing::Test类的成员,我们直接改写下测试类calcFunctionTest,添加两个静态函数SetUpTestCase()和TearDownTestCase()到测试类中即可。
  class calcFunctionTest : public testing::Test
  {
  protected:
      static void SetUpTestCase()
      {
          std::cout<< "--> " <<  __func__ << " <--" << std::endl;
      }
      static void TearDownTestCase()
      {
          std::cout<< "--> " << __func__ << " <--" << std::endl;
      }
      virtual void SetUp()
      {
          std::cout << "--> " << __func__ << " <--" <<std::endl;
      }
      virtual void TearDown()
      {
          std::cout << "--> " << __func__ << " <--" <<std::endl;
      }
      calcFunction calc;
  };
  改写好之后,我们再看一下运行结果。这两个函数分别是在本TestSuite中的第一个TestCase之前和最后一个TestCase之后执行。
  全局测试事件
  全局测试事件,也需要继承一个类,但是它需要继承testing::Environment类实现SetUp()和TearDown()两个函数。还需要在main函数中调用testing::AddGlobalTestEnvironment方法注册全局事件。我们直接上代码吧!
  #include <iostream>
  #include <gtest/gtest.h>
  class calcFunction
  {
  public:
      int add(int a, int b)
      {
          return a + b;
      }
      int sub(int a, int b)
      {
          return a - b;
      }
  };
  class calcFunctionEnvironment : public testing::Environment
  {
      public:
          virtual void SetUp()
          {
              val = 123;
              std::cout << "--> Environment " << __func__ << " <--" << std::endl;
          }
          virtual void TearDown()
          {
              std::cout << "--> Environment " << __func__ << " <--" << std::endl;
          }
          int val;
  };
  calcFunctionEnvironment* calc_env;
  class calcFunctionTest : public testing::Test
  {
  protected:
      static void SetUpTestCase()
      {
          std::cout<< "--> " <<  __func__ << " <--" << std::endl;
      }
      static void TearDownTestCase()
      {
          std::cout<< "--> " << __func__ << " <--" << std::endl;
      }
      virtual void SetUp()
      {
          std::cout << "--> " << __func__ << " <--" <<std::endl;
      }
      virtual void TearDown()
      {
          std::cout << "--> " << __func__ << " <--" <<std::endl;
      }
      calcFunction calc;
  };
  TEST_F(calcFunctionTest, test_add)
  {
      std::cout << "--> test_add start <--" << std::endl;
      EXPECT_EQ(calc.add(1,2), 3);
      std::cout << "Global Environment val = " << calc_env->val << std::endl;
      std::cout << "--> test_add end <--" << std::endl;
  }
  TEST_F(calcFunctionTest, test_sub)
  {
      std::cout << "--> test_sub start <--" << std::endl;
      EXPECT_EQ(calc.sub(1,2), -1);
      std::cout << "Global Environment val = " << calc_env->val << std::endl;
      std::cout << "--> test_sub end <--" << std::endl;
  }
  int main(int argc, char **argv)
  {  
      calc_env = new calcFunctionEnvironment;
      testing::AddGlobalTestEnvironment(calc_env);
      testing::InitGoogleTest(&argc, argv);  
      return RUN_ALL_TESTS(); 
  } 
  从测试结果上看,全局事件的这两个函数分别是在第一个TestSuite之前和最后一个TestSuite之后执行的。
  以上三种测试事件我们可以根据需要进行灵活使用。另外,细心的同学会发现,这里测试用例我们该用了TEST_F这个宏,这是因为继承了testing::Test,与之对应就需要使用TEST_F宏。
  参数化
  在学习gTest参数化之前我们先看一个测试例子。
  #include <iostream>
  #include <gtest/gtest.h>
  class calcFunction
  {
  public:
      int add(int a, int b)
      {
          std::cout << a << " + " << b << " = " << a + b << std::endl;
          return a + b;
      }
      int sub(int a, int b)
      {
          std::cout << a << " - " << b << " = " << a - b << std::endl;
          return a - b;
      }
  };
  class calcFunctionTest : public testing::Test
  {
  protected:
      calcFunction calc;
  };
  TEST_F(calcFunctionTest, test_add0)
  {
      EXPECT_EQ(calc.add(1,2), 3);
  }
  TEST_F(calcFunctionTest, test_add1)
  {
      EXPECT_EQ(calc.add(1,3), 4);
  }
  TEST_F(calcFunctionTest, test_add2)
  {
      EXPECT_EQ(calc.add(2,4), 6);
  }
  TEST_F(calcFunctionTest, test_add3)
  {
      EXPECT_EQ(calc.add(-1,-2), -3);
  }
  int main(int argc, char **argv)
  {  
      testing::InitGoogleTest(&argc, argv);  
      return RUN_ALL_TESTS(); 
  } 
  示例执行结果:
  上面的测试用例中我们写了多个测试用例,但是其参数都是同样的,有的实际应用场景可能比这个程序写的测试检查还要多。写这么多重复的代码实在是太累了。gTest提供了一个非常友好的工具,将这些测试的值进行参数化,就不用写那么多重复的代码了。
  如何对其进行参数化呢?直接上代码,我们再来看下面一个例子。
  #include <iostream>
  #include <gtest/gtest.h>
  class calcFunction
  {
  public:
      int add(int a, int b)
      {
          std::cout << a << " + " << b << " = " << a + b << std::endl;
          return a + b;
      }
      int sub(int a, int b)
      {
          std::cout << a << " - " << b << " = " << a - b << std::endl;
          return a - b;
      }
  };
  struct TestParam
  {
      int a;
      int b;
      int c;
  };
  class calcFunctionTest : public ::testing::TestWithParam<struct TestParam>
  {
  protected:
      calcFunction calc;
      TestParam param;
      virtual void SetUp()
      {
          param.a = GetParam().a;
          param.b = GetParam().b;
          param.c = GetParam().c;
      }
  };
  TEST_P(calcFunctionTest, test_add)
  {
      EXPECT_EQ(calc.add(param.a, param.b), param.c);
  }
  INSTANTIATE_TEST_CASE_P(addTest, calcFunctionTest, ::testing::Values( TestParam{1, 2 , 3}, 
                                                                        TestParam{1, 3 , 4},
                                                                        TestParam{2, 4 , 6},
                                                                        TestParam{-1, -2 , -3}));
  int main(int argc, char **argv)
  {  
      testing::InitGoogleTest(&argc, argv);  
      return RUN_ALL_TESTS(); 
  } 
  执行结果和前面的例子一样。
  从这个例子中,我们不难发现和之前的测试程序有一些不同。这里继承了::testing::TestWithParam类,参数T就是需要参数化的数据类型,这个例子里参数化数据类型是TestParam结构体。这里还需要使用另外一个宏TEST_P而不是TEST_F这个宏,它的两个参数和TEST_F和TEST一致。另外,程序中还增加一个宏INSTANTIATE_TEST_CASE_P用来输入测试参数,它有三个参数(第一个参数大家可任意取名,第二个参数是test_case_name和TEST_P宏的名称一致,第三个参数是需要传递的参数)。
  以上就是今天的所有内容,感谢大家耐心的阅读,希望大家都有所收获,愿大家代码无bug。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号