编译安装
- 配置编译工具
- 编译Google Test 需要cmake2.6 版本以及上。
yum list | grep cmake # cmake --version # 查看 cmake 版本
- 支持C++11
- 编译Google Test 需要cmake2.6 版本以及上。
这里以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使用实现测试报告可视化。
-
输出为xml形式
./test --gtest_output=xml:./result.xml
将GTest 输出的xml结果转为html
https://blog.csdn.net/Neil4/article/details/104484792jenkins安装插件 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提供了多种事件机制,非常方便可以在测试前后做些自定义的动作。
- 全局的,所有案例执行前后。
- TestSuite级别的,在某一批案例中第一个案例前,最后一个案例执行后。
- 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(); }
-
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(); }
参数化
死亡测试
运行测试
gmock
参考资料
- http://hh-yzm.com/index.php/archives/30/
- https://zhuanlan.zhihu.com/p/34497162
- http://www.ibm.com/developerworks/cn/linux/l-cn-cppunittest/
- http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html
- http://www.ibm.com/developerworks/cn/linux/l-cn-cppunittest/>
- http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html