此栏目参考https://www.cnblogs.com/coderzh/archive/2009/04/06/1430364.html
一、前期知识准备:
1、断言用法
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(val1, val2); | EXPECT_EQ(val1, val2); | val1 == val2 |
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); | EXPERT_GE(val1, val2); | val1 >= val2 |
Fatal assertion | Nonfatal assertion | Verifies |
ASSERT_STRED(str1, str2) | EXPERT_STRED(str1, str2) | the two strings are the same |
ASSERT_STRNE(str1, str2) | EXPERT_STRNE(str1, str2) | the two trings are not the same |
ASSERT_STRCASEEQ(str1, str2) | EXPERT_STRCASEEQ(str1, str2) | ignoring case, the two strings are the same |
ASSERT_STRCASENE(str1, str2) | EXPERT_STRCASENE(str1, str2) | ignoring case, the two strings are not the same |
Fatal assertion | Nonfatal assertion | Verifies |
ASSERT_FLOAT_EQ(experted, actual); | EXPECT_FLOAT_EQ(expert, actual); | the two float values are almost equal |
ASSERT_DOUBLE_EQ(experted, actual); | EXPERT_DOUBLE_EQ(experted, actual); | the two double values are almost equal |
Fatal assertion | Nonfatal assertion |
FAIL(); | ADD_FAILURE(); |
2、事件机制
gtest的事件一共有三种:
1. 全局的,所有案例执行前后。
2. TestSuite级别的,在某一批案例中第一个案列前,最后一个案例执行后。
3. TestCase级别的,每个TestCase前后。
全局事件
需要写一个类继承testing::Environment类,实现里面的Setup和TearDown方法。
其中SetUp()方法在所有案列执行前后执行,TearDown()方法在所有案列执行后执行。
#include <gmock/gmock.h>
#include <iostream>
class FooEnvironmen : public testing::Environment
{
public:
virtual void SetUp()
{
std::cout << "Foo FooEnvironment SetUP" << std::endl;
}
virtual void TearDown()
{
std::cout << "Foo FooEnvironment TearDown" << std::endl;
}
};
int main(int argc, char* argv[])
{
testing::AddGlobalTestEnvironment(new FooEnvironmen); // 将事件挂进来
::testing::InitGoogleMock(&argc, argv);
RUN_ALL_TESTS();
}
TestSuite事件
需要写一个类继承testing::Test,然后实现两个静态方法SetUpTestCase()和TearDownTestCase()。
其中SetUpTestCase()方法在第一个TestCase之前执行,TearDownTestCase()方法在最后一个TestCase之后执行。
TestCase事件
TestCase事件是挂在每个案列执行前后的,实现方式和上面的几乎一样,不过需要实现的是另外两个方法:SetUp方法和TearDown方法。SetUp()方法在每个TestCase之前执行,TearDown()方法在每个TeatCase之后执行。
#include <gmock/gmock.h>
using namespace testing;
class FooTest : public testing::Test
{
public:
// for TestSuite event
static void SetUpTestCase()
{
std::cout << "Foo FooTset SetUP" << std::endl;
}
static void TearDownTestCase()
{
std::cout << "Foo FooTset TearDown" << std::endl;
}
// for TestCase event
virtual void SetUp(){
std::cout << "Foo Setup" << std::endl;
}
virtual void TearDown(){
std::cout << "Foo TearDown" << std::endl;
}
};
TEST_F(FooTest, OnePlusOneEqTwo)
{
ASSERT_THAT(1+1, Eq(2));
}
TEST_F(FooTest, OnePlusOneEqTwo2)
{
ASSERT_THAT(1+1, Eq(2));
}
3、参数化
如果有很多参数需要进行判断,为了简省代码可以用googleTest里的参数化方式。
首先创建一个类继承testing::TestWithParam,用宏定义INSTANTIATE_TEST_SUITE_P添加参数。用GetParm()方法去获取数据。
class MyTest : public::testing::TestWithParam<int>
{
};
bool GetEven(int n)
{
if (n == 0) return false;
if (n % 2 == 0)
{
return true;
}
else
{
return false;
}
return true;
}
TEST_P(MyTest, HandleTest)
{
int n = GetParam(); // 用此方法获得参数
EXPECT_TRUE(GetEven(n));
}
// 定义参数
// INSTANTIATE_TEST_SUITE_P的第一个参数为自定义,第二个参数为测试案列的名字,第三个参数是参数生成器
INSTANTIATE_TEST_SUITE_P(example, MyTest, testing::Values(2,7, 1, 20, 19));
INSTANTIATE_TEST_SUITE_P(range, MyTest, Range(0,10,1));
int main(int argc, char** argv)
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
4、死亡测试
通常在测试过程中,需要考虑各种各样的输入,有的输入可能直接导致程序崩溃,这时我们就需要检查程序是否按照预期的方式挂掉,这就是所谓的“死亡测试”。
Fatal assertion | Nonfatal assertion | Verifies |
ASSERT_DEATH(statement,regex) | EXPECT_DEATH(statement, regex) | statement crashes with the given error |
ASSERT_EXIT(statement,regex) | EXPECT_EXIT(statement, regex) | statement exits with the given error and its exit code mathes predicate |
注意:编写死亡测试案例时,TEST的第一个参数,即testcase_name,请使用DeathTest后缀。原因是gtest会优先运行死亡测试案列。
5、运行参数
对于运行参数,gtest提供了三种设置的途径:
1. 系统环境变量
2. 命令行参数
3. 代码中指令FLAG
--gtest_filter | 对执行的测试案例进行过滤,支持通配符 ? 单个字符 * 任意字符 - 排除,如,-a表示除了a这个案列 :取或,如,a:b 表示a或b |