谷歌单元测试gtest代码:GitHub - google/googletest: GoogleTest - Google Testing and Mocking Framework
下载.zip文件
解压到当前文件夹
D:\googletest-release-1.7.0\msvc
使用VS2015打开gtest.sln
打开VS2015
新建Source.cpp
#include <iostream>
using namespace std;
#include "gtest/gtest.h"
int Add(int i1, int i2) {
return i1 + i2;
}
TEST(fun, Add) {
EXPECT_EQ(5, Add(2, 3));
EXPECT_EQ(12, Add(2, -1));
}
int main(int argc, char* argv[])
{
::testing::GTEST_FLAG(output) = "xml:report.xml";
::testing::InitGoogleTest(&argc, argv);
RUN_ALL_TESTS();
system("pause");
return 0;
}
D:\googletest-release-1.7.0\include
D:\googletest-release-1.7.0\msvc\gtest\Debug
gtestd.lib
<?xml version="1.0" encoding="UTF-8"?>
<testsuites tests="1" failures="1" disabled="0" errors="0" timestamp="2022-08-28T19:10:53" time="0.005" name="AllTests">
<testsuite name="fun" tests="1" failures="1" disabled="0" errors="0" time="0.002">
<testcase name="Add" status="run" time="0.002" classname="fun">
<failure message="c:\users\33779\documents\visual studio 2015\projects\gtest\gtest\source.cpp:14
Value of: Add(2, -1)
 Actual: 1
Expected: 12" type=""><![CDATA[c:\users\33779\documents\visual studio 2015\projects\gtest\gtest\source.cpp:14
Value of: Add(2, -1)
Actual: 1
Expected: 12]]></failure>
</testcase>
</testsuite>
</testsuites>
二、gtest系列之断言
gtest中断言的宏可以分为两类:一类是ASSERT宏,另一类就是EXPECT宏了。
1、ASSERT_系列:如果当前点检测失败则退出当前函数
2、EXPECT_系列:如果当前点检测失败则继续往下执行
如果你对自动输出的错误信息不满意的话,也是可以通过operator<<能够在失败的时候打印日志,将一些自定义的信息输出。
ASSERT_系列:
bool值检查
1、 ASSERT_TRUE(参数),期待结果是true
2、ASSERT_FALSE(参数),期待结果是false
数值型数据检查
3、ASSERT_EQ(参数1,参数2),传入的是需要比较的两个数 equal
4、ASSERT_NE(参数1,参数2),not equal,不等于才返回true
5、ASSERT_LT(参数1,参数2),less than,小于才返回true
6、ASSERT_GT(参数1,参数2),greater than,大于才返回true
7、ASSERT_LE(参数1,参数2),less equal,小于等于才返回true
8、ASSERT_GE(参数1,参数2),greater equal,大于等于才返回true
字符串检查
9、ASSERT_STREQ(expected_str, actual_str),两个C风格的字符串相等才正确返回
10、ASSERT_STRNE(str1, str2),两个C风格的字符串不相等时才正确返回
11、ASSERT_STRCASEEQ(expected_str, actual_str),忽略大小写
12、ASSERT_STRCASENE(str1, str2),str1和str2不同,忽略大小写
异常检查
13、ASSERT_THROW(statement,exception_type),根据给定的类型抛出异常
14、ASSERT_ANY_THROW(statement),根据任何类型抛出异常
15、ASSERT_NO_THROW(statement),不抛出任何类型
浮点检查
16、ASSERT_FLOAT_EQ(expected,actual),两个浮点值几乎相等
17、ASSERT_DOUBLE_EQ(expected,actual),这两个双精度值几乎相等
相近值检查
18、ASSERT_NEAR(val1,val2,abs_error),val1和val2之间的差异不超过给定的绝对误差
EXPECT_系列:
bool值检查
1、 EXPECT_TRUE(参数),期待结果是true
2、EXPECT_FALSE(参数),期待结果是false
数值型数据检查
3、EXPECT_EQ(参数1,参数2),传入的是需要比较的两个数 equal
4、EXPECT_NE(参数1,参数2),not equal,不等于才返回true
5、EXPECT_LT(参数1,参数2),less than,小于才返回true
6、EXPECT_GT(参数1,参数2),greater than,大于才返回true
7、EXPECT_LE(参数1,参数2),less equal,小于等于才返回true
8、EXPECT_GE(参数1,参数2),greater equal,大于等于才返回true
字符串检查
9、EXPECT_STREQ(expected_str, actual_str),两个C风格的字符串相等才正确返回
10、EXPECT_STRNE(str1, str2),两个C风格的字符串不相等时才正确返回
11、EXPECT_STRCASEEQ(expected_str, actual_str),忽略大小写
12、EXPECT_STRCASENE(str1, str2),str1和str2不同,忽略大小写
异常检查
13、EXPECT_THROW(statement,exception_type),根据给定的类型抛出异常
14、EXPECT_ANY_THROW(statement),根据任何类型抛出异常
15、EXPECT_NO_THROW(statement),不抛出任何类型
浮点检查
16、EXPECT_FLOAT_EQ(expected,actual),两个浮点值几乎相等
17、EXPECT_DOUBLE_EQ(expected,actual),这两个双精度值几乎相等
相近值检查
18、EXPECT_NEAR(val1,val2,abs_error),val1和val2之间的差异不超过给定的绝对误差
eg:
#include <iostream>
using namespace std;
#include "gtest/gtest.h"
int Add(int i1, int i2) {
return i1 + i2;
}
TEST(fun, Add) {
EXPECT_EQ(5, Add(2, 3));
EXPECT_EQ(12, Add(2, -1));
EXPECT_TRUE(Add(2, 3) == 5) << "Add(2, 3) == 5"; //ASSERT_TRUE期待结果是true,operator<<输出一些自定义的信息
EXPECT_FALSE(Add(2, -1) == -2); //期待结果是false
EXPECT_LT(Add(2, 3), 15);
EXPECT_GT(Add(2, 3), 15);
EXPECT_LE(Add(2, 3), 15);
EXPECT_GE(Add(2, 3), 15);
}
int main(int argc, char* argv[])
{
::testing::GTEST_FLAG(output) = "xml:report.xml";
::testing::InitGoogleTest(&argc, argv);
RUN_ALL_TESTS();
system("pause");
return 0;
}
结果:
三、gtest系列之事件机制
“事件” 本质是框架给你提供了一个机会, 让你能在这样的几个机会来执行你自己定制的代码, 来给测试用例准备/清理数据。gtest提供了多种事件机制,总结一下gtest的事件一共有三种:
1、TestSuite事件
需要写一个类,继承testing::Test,然后实现两个静态方法:SetUpTestCase 方法在第一个TestCase之前执行;TearDownTestCase方法在最后一个TestCase之后执行。
2、TestCase事件
是挂在每个案例执行前后的,需要实现的是SetUp方法和TearDown方法。SetUp方法在每个TestCase之前执行;TearDown方法在每个TestCase之后执行。
3、全局事件
要实现全局事件,必须写一个类,继承testing::Environment类,实现里面的SetUp和TearDown方法。SetUp方法在所有案例执行前执行;TearDown方法在所有案例执行后执行。
例如全局事件可以按照下列方式来使用:
除了要继承testing::Environment类,还要定义一个该全局环境的一个对象并将该对象添加到全局环境测试中去。
#include <iostream>
using namespace std;
#include "gtest/gtest.h"
class GlobalTest :public testing::Environment
{
public:
virtual void SetUp()
{
cout << "Setup" << endl;
}
virtual void TearDown()
{
cout << "TearSown" << endl;
}
};
int Add(int i1, int i2) {
return i1 + i2;
}
TEST(fun, Add) {
EXPECT_EQ(5, Add(2, 3));
EXPECT_EQ(12, Add(2, -1));
EXPECT_TRUE(Add(2, 3) == 5) << "Add(2, 3) == 5"; //ASSERT_TRUE期待结果是true,operator<<输出一些自定义的信息
EXPECT_FALSE(Add(2, -1) == -2); //期待结果是false
EXPECT_LT(Add(2, 3), 15);
EXPECT_GT(Add(2, 3), 15);
EXPECT_LE(Add(2, 3), 15);
EXPECT_GE(Add(2, 3), 15);
}
int main(int argc, char* argv[])
{
::testing::GTEST_FLAG(output) = "xml:report.xml";
::testing::InitGoogleTest(&argc, argv);
::testing::Environment* env = new GlobalTest();
::testing::AddGlobalTestEnvironment(env);
RUN_ALL_TESTS();
system("pause");
return 0;
}
结果:
四、gtest系列之死亡测试
这里的”死亡”指的是程序的奔溃。通常在测试的过程中,我们需要考虑各种各样的输入,有的输入可能直接导致程序奔溃,这个时候我们就要检查程序是否按照预期的方式挂掉,这也就是所谓的”死亡测试”。
死亡测试所用到的宏:
1、ASSERT_DEATH(参数1,参数2),程序挂了并且错误信息和参数2匹配,此时认为测试通过。如果参数2为空字符串,则只需要看程序挂没挂即可。
2、ASSERT_EXIT(参数1,参数2,参数3),语句停止并且错误信息和被提前给的信息匹配。
#include <iostream>
using namespace std;
#include "gtest/gtest.h"
int func()
{
int *ptr = NULL;
*ptr = 100;
return 0;
}
TEST(FuncDeathTest, nullptr)
{
ASSERT_DEATH(func(), "");
}
int main(int argc, char* argv[])
{
::testing::GTEST_FLAG(output) = "xml:report.xml";
::testing::InitGoogleTest(&argc, argv);
RUN_ALL_TESTS();
system("pause");
return 0;
}