CPP

gtest学习和使用

gtest

Posted by xray1 on October 7, 2019

如何测试自己代码的正确性是个老生常谈的问题,在学校里面写作业经常用到的方式的就是使用 cout 输出代码运行结果,来测试代码逻辑的正确性。但这样会使得代码变得十分难看,所以在就找到了 google-test这个单元测试框架。

C++

Google test

配置
  1. windows + vs配置
    • 在最新版下载完成以后,打开 msvc目录下的 sln工程项目。注意:这里的工程项目必须得在 vs2010+以上的版本中打开。
    • releasedebug两种模式下各自生成解决方案。注意:完成这一步以后,会各自生成两个lib文件,这将是后面需要用到的库文件。
    • 以上为止就生成了使用 google-test所需要的文件,下面就是配置工程的阶段。
  2. 工程配置(需要修改的地方)
    • 配置头文件: c/c++ —> 常规—–>附加包含目录 添加 include 文件夹所在的位置
    • 修改运行库运行模式:c/c++ —>代码生成—-> 运行库修改为动态链接
    • 添加库文件:链接器—->输入—->在附加依赖项中添加1中生成的库文件。
使用
  1. 目录基本结构
1
2
3
4
--- function.h
--- function.cxx
--- functionunittest.cxx
--- main.cxx
  • function.h中存放头文件和函数的声明。
  • function.cxx中存放函数体
  • functionunittest.cxx中存放google-test的测试语句
  • main.cxx中存放执行google-test的语句
  1. 代码基本框架

    • function.hfunction.cxx中和没有使用test的写法一样,主要修改是在 functionunittest.cxxmain.cxx

    • functionunittest.cxx

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    //数值类型检查
    TEST(test_name, test_value){
        EXPECT_EQ(val1, val2); //测试 val1 == val2
        EXPECT_GT(val1, val2); //测试 val1 > val2
        EXPECT_NE(val1, val2); //测试val1 != val2
        EXPECT_LE(val1, val2); //测试val1 <= val2
        EXPECT_LT(val1, val2); //测试val1 < val2
    }
    //布尔值检查
    TEST(test_name, test_value){
        EXPECT_TRUE(condition); //condition is true;
        EXPECT_FALSE(condition); //condition is false;
    }
    //字符串检查
    TEST(test_name, test_value){
        EXPECT_STREQ(str1, str2); // str1的内容和str2的内容相等
        EXPECT_STRNE(str1, str2); //str1的内容和str2的内容不相等
        EXPECT_STRCASEEQ(str1, str2) //在忽略大小的情况下,str1和str2的内容相等
    }
       
    
    • main.cxx

      1
      2
      3
      4
      5
      
      #include<gtest/gtest.h>
      int main(int argc, char* argv[]){
          testing::InitGoogleTest(&argc, argv);
      	return RUN_ALL_TESTS();
      }
      
  2. 使用方式

    • Simple Test

      这种使用方式就如上面介绍的代码所示,就是使用 TEST宏,本质上和c++一样,只是没有返回值。在其中可以使用任意的 c++语句。TEST中写入不同的测试语句。

    • Test Fixtures: using the same data configuration for multiple tests

      1. 从 ::testing::Test 继承一个 protected属性的class
      2. class里面可以声明任何准备使用的对象
      3. SetUp()中准备需要测试的数据。
      4. TearDown()销毁在 SetUp()中分配的资源
      5. 使用fixture的时候,需要使用 TEST_F这个宏。

      6. 运行流程
        1. googletest创建一个QueueTest对象t1
        2. 调用t1.SetUp()初始化t1
        3. 第一个测试 IsEmptyInitially开始运行
        4. 调用t1.TearUp()回收内存
        5. t1被销毁
        6. 重复上面过程。
    • ASSERT_* 和 EXPECT_*的区别

    ​ 当错误不影响程序继续运行时,则使用 EXPECT_*

    ​ 当错误影响程序继续运行时,则使用ASSERT_*

    1
    2
    3
    4
    
    n2 = q2_.Dequeue();
    ASSERT_NE(n, nullptr);
    EXPECT_EQ(*n, 2);
    ....
    

    例如如上代码,里面用到了ASSERT_NE(n, nullptr)。这是因为在接下来的EXPECT_EQ(*n,2)中,要对n进行解引用,如果nnullptr 却对其解引用会造成 segfault