lsekfe 发表于 2023-3-13 09:44:57

浅谈google开源单元测试框架Google Test

我们在开发的过程中,需要做一些验证测试,来保证我们的代码是按照设计要求工作的,这就需要单元测试了。单元测试(Unit Test),我们称为“UT测试”。对于一个复杂的系统来说,需要编写大量的单元测试用例,有人会觉得这么多的测试代码,将会花费大量的时间,影响开发的进度,会得不偿失。真的是这样吗?其实,对于越是复杂的系统就越是需要单元测试来保证我们的代码的开发质量,及时测试出代码的问题,在开发阶段发现问题总比在系统发布之后发现问题能够较少的节省资源或成本。
  对于单元测试应该是每个开发工程师必备的技能,尤其是高阶的开发工程师会更加注重UT的重要性。同时,我们在开发功能模块之前会考虑到测试用例的实现,这样自然的就会考虑到功能模块的模块化便于UT的编写,从这一方面来说也能提高开发人员开发的代码质量。另外,单元测试用例还可以作为示例供开发人员参考,从而能够更轻松的掌握模块的使用。
  今天就和大家一起学习一个开源的C++的单元测试框架Google test,大家看名字就知道它是由牛逼的Google公司出品。Google Test可以在多种平台上使用,它可以支持:
  Linux、Mac OS X、Windows、Cygwin、MinGW、Windows Mobile、Symbian、PlatformIO等。

  安装和配置
  我们可以从github获取Google Test的源码。
  因为我们下载到的gTest是源代码,还需要将其编译成库文件再进行使用。下面将和大家一起学习如何在windows环境下生成gTest的库文件。在这之前我们需要安装CMake和MinGW。
  将下载的gTest的源码进行解压,源码目录如下图所示。
http://www.51testing.com/attachments/2023/03/15326880_202303091443251ALCC.jpg
  打开命令行工具cmd,进入源码的工程目录,新建一个build目录用来存放构建文件,然后,进入build目录执行cmake命令生成Makefile文件。
  mkdir build
  cd build
  cmake -G "MinGW Makefiles" ..


http://www.51testing.com/attachments/2023/03/15326880_202303091443281HKTX.jpghttp://www.51testing.com/attachments/2023/03/15326880_202303091443311no68.jpg
  Makefile文件生成后,再执行下面的命令mingw32-make编译库文件。编译成功后就会发现有libgtest.a 和libgtest_main.a两个静态库生成。这里注意,Windows下mingw安装的make工具名称是mingw32-make而不是make。
  mingw32-make

http://www.51testing.com/attachments/2023/03/15326880_202303091443341aUxx.jpg
  接下来我们在VS Code写一个测试用例,使用生成的gTest静态库测试下。按下快捷键【Ctrl+Shift+p】,在弹出的搜索框中搜索【C/C++:Edit Configurations】,可以创建c_cpp_properties.json配置文件。
http://www.51testing.com/attachments/2023/03/15326880_202303091443371Ahyj.jpg
  在c_cpp_properties.json配置文件添加gTest的头文件目录。
http://www.51testing.com/attachments/2023/03/15326880_202303091443401OS0c.jpg
  在task.json配置文件中添加gTest头文件目录和库文件,task.json配置文件可以通过菜单栏中Terminal选项下的【Configure Default Build Task】选项创建。
http://www.51testing.com/attachments/2023/03/15326880_202303091443441J0vI.jpghttp://www.51testing.com/attachments/2023/03/15326880_202303091443471K7Nh.jpg
  上面配置好之后,我们写个测试用例跑一下。
  #include <iostream>
  #include <gtest/gtest.h>
  int add(int a, int b)
  {
      return a + b;
  }
  int sub(int a, int b)
  {
      return a - b;
  }
  TEST(testcase, test_add)
  {
      EXPECT_EQ(add(1,2), 3);
      EXPECT_EQ(sub(1,2), -1);
  }
  int main(int argc, char **argv)
  {
      std::cout << "run google test --> " << std::endl << std::endl;
      testing::InitGoogleTest(&argc, argv);
      return RUN_ALL_TESTS();
  }


  运行结果如下图所示,代码中的TEST是一个宏,用来创建测试用例,它有test_case_name和test_name两个参数。分别是测试用例名和测试名,在后面的文章中我们会对其有更深刻的理解,这里就不细说了。RUN_ALL_TESTS也是一个宏,它是测试用例的入口。EXPECT_EQ这个是一个断言相关的宏,用来检测两个数值是否相等。
http://www.51testing.com/attachments/2023/03/15326880_202303091443501U8pQ.jpg

页: [1]
查看完整版本: 浅谈google开源单元测试框架Google Test