美文网首页
单元测试工具GTest/Gmock(一)

单元测试工具GTest/Gmock(一)

作者: wayyyy | 来源:发表于2020-05-24 22:31 被阅读0次

    编译安装

    • 配置编译工具
      • 编译Google Test 需要cmake2.6 版本以及上。
        yum list | grep cmake # 
        cmake --version  # 查看 cmake 版本
        
      • 支持C++11

    这里以Gtest 1.8.0 安装为例,项目地址:https://github.com/google/googletest/

    • 获取源码
      wget https://github.com/google/googletest/archive/release-1.8.0.tar.gz
      tar -zxvf release-1.8.0.tar.gz
      
    • 编译安装
      cmake .  
      make && make install
      
      安装默认会将:
      -- Installing: /usr/local/lib/libgmock.a
      -- Installing: /usr/local/lib/libgmock_main.a
      -- Installing: /usr/local/lib/libgtest.a
      -- Installing: /usr/local/lib/libgtest_main.a
      
    • 测试:
      • 测试代码
        #include <stdio.h>
        #include <gtest/gtest.h>
        
        int add(int a, int b)  {  return a+b;  }
        
        TEST(MyTest, AddTest) {  EXPECT_EQ(add(1, 2), 3);  }
        
        int main(int argc, char *argv[]) {
            ::testing::InitGoogleTest(&argc, argv);
            return RUN_ALL_TESTS();
        }
        
      • 编译
        g++ -o test test.cpp -lgtest -lgtest_main -lpthread
        
      • 运行输出
        [==========] Running 1 test from 1 test case.
        [----------] Global test environment set-up.
        [----------] 1 test from MyTest
        [ RUN      ] MyTest.AddTest
        [       OK ] MyTest.AddTest (0 ms)
        [----------] 1 test from MyTest (0 ms total)
        
        [----------] Global test environment tear-down
        [==========] 1 test from 1 test case ran. (0 ms total)
        [  PASSED  ] 1 test.
        

    jenkins 集成

    GTest结果可以输出为xml文件的形式,配合第三方工具可以将其转为html网页形式。可以配合jenkins使用实现测试报告可视化。


    基本使用介绍

    官方文档:https://github.com/google/googletest/blob/master/googletest/docs/primer.md

    如果局部测试使用了EXPECT系列函数,它将保证本次局部测试结果不会影响之后的流程。但是ASSERT系列在出错的情况下,当前测试特例中剩下的流程就不走了。

    Testsuit 和 Testcase
    断言
    • 布尔值类型检查

      Fatal assertion Nonfatal assertion Verifies
      ASSERT_TRUE(condition); EXPECT_TRUE(condition); condition is true
      ASSERT_FALSE(condition); EXPECT_FALSE(condition); condition is false
    • 数值类型检查

      Fatal assertion Nonfatal assertion Verifies
      ASSERT_EQ(expected, actual); EXPECT_EQ(expected, actual); expected == actual
      ASSERT_NE(val1, val2); EXPECT_NE(val1, val2); val1 != val2
      ASSERT_LT(val1, val2); EXPECT_LT(val1, val2); val1 < val2
      ASSERT_LE(val1, val2); EXPECT_LE(val1, val2); val1 <= val2
      ASSERT_GT(val1, val2); EXPECT_GT(val1, val2); val1 > val2
      ASSERT_GE(val1, val2); EXPECT_GE(val1, val2); val1 >= val2
    • 字符串类型检查

      Fatal assertion Nonfatal assertion Verifies
      ASSERT_STREQ(expected_str, actual_str); EXPECT_STREQ(expected_str, actual_str); the two C strings have the same content
      ASSERT_STRNE(str1, str2); EXPECT_STRNE(str1, str2); the two C strings have different content
      ASSERT_STRCASEEQ(expected_str, actual_str); EXPECT_STRCASEEQ(expected_str, actual_str); the two C strings have the same content, ignoring case
      ASSERT_STRCASENE(str1, str2); EXPECT_STRCASENE(str1, str2); the two C strings have different content, ignoring case
    • 异常检查

    • 类型检查

    自定义输出
    事件

    gtest提供了多种事件机制,非常方便可以在测试前后做些自定义的动作。

    1. 全局的,所有案例执行前后。
    2. TestSuite级别的,在某一批案例中第一个案例前,最后一个案例执行后。
    3. TestCase级别的,每个TestCase前后。
    • 全局
      要实现全局事件,必须写一个类,继承testing::Environment类,实现里面的SetUp和TearDown方法。

      class FooEnvironment : public testing::Environment
      {
      public:
          virtual void SetUp()  {  std::cout << "Foo FooEnvironment SetUP" << std::endl;  }
          virtual void TearDown()  {  std::cout << "Foo FooEnvironment TearDown" << std::endl;  }
      };
      
      TEST(GlobalTest0, test00)  {  EXPECT_EQ(1, 1);  };
      TEST(GlobalTest0, test01)  {  EXPECT_EQ(1, 1);  };
      TEST(GlobalTest1, test10)  {  EXPECT_EQ(1, 1);  };
      
      int main(int argc, char**argv)
      {
          testing::AddGlobalTestEnvironment(new FooEnvironment);
          testing::InitGoogleTest(&argc, argv);
          return RUN_ALL_TESTS();
      }
      
      1.png
    • TestSuit

      class MyTestSuite0 : public testing::Test
      {
      protected:
          static void SetUpTestSuite()  {  cout << "TestSuite event0 : start" << endl;  }
          static void TearDownTestSuite()  {  cout << "TestSuite event0 : end" << endl;  }
      };
      
      TEST_F(MyTestSuite0, test0) {  EXPECT_EQ(1, 1);  }
      TEST_F(MyTestSuite0, test1) {  EXPECT_EQ(1, 1);  }
      TEST_F(MyTestSuite0, test2)  {  EXPECT_EQ(1, 1);  }
      
      int main(int argc, char** argv)
      {
          testing::InitGoogleTest(&argc, argv);
          return RUN_ALL_TESTS();
      }
      

      在编写测试案例时,我们需要使用TEST_F这个宏,第一个参数必须是我们上面类的名字,代表一个TestSuite。

    • TestCase

      class MyTestCase0 : public testing::Test
      {
      protected:
          virtual void SetUp()  {  cout << "TestCase event0 : start" << endl;  }
          virtual void TearDown()  {  cout << "TestCase event0 : end" << endl;  }
      };
      
      TEST_F(MyTestCase0, test0)  {  EXPECT_EQ(1, 1);  }
      TEST_F(MyTestCase0, test1)  {  EXPECT_EQ(1, 1);  }
      TEST_F(MyTestCase1, test0)  {  EXPECT_EQ(1, 1);  }
      
      int main(int argc, char** argv)
      {
          testing::InitGoogleTest(&argc, argv);
          return RUN_ALL_TESTS();
      }
      
      3.png
    参数化
    死亡测试
    运行测试
    gmock

    参考资料

    1. http://hh-yzm.com/index.php/archives/30/
    2. https://zhuanlan.zhihu.com/p/34497162
    3. http://www.ibm.com/developerworks/cn/linux/l-cn-cppunittest/
    4. http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html
    5. http://www.ibm.com/developerworks/cn/linux/l-cn-cppunittest/>
    6. http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html

    相关文章

      网友评论

          本文标题:单元测试工具GTest/Gmock(一)

          本文链接:https://www.haomeiwen.com/subject/xjffvhtx.html