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

编译安装

  • 配置编译工具
    • 编译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 
      #include 
      
      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使用实现测试报告可视化。

  • 输出为xml形式

    ./test --gtest_output=xml:./result.xml
    
  • 将GTest 输出的xml结果转为html
    https://blog.csdn.net/Neil4/article/details/104484792

  • jenkins安装插件 publish HTML


基本使用介绍

官方文档: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(一))