Skip to content

Google Test

Format

gtest的cpp文件格式:

C++
#include <gtest/gtest.h>
// 用于简单测试,为静态、全局函数或简单类编写unittest
TEST(TestSuiteName, TestName) {}
// 用于需要访问unittest中的对象和子程序时,TestFixture需要继承testing::Test,类中使用public或protected,便于子类调用
// 多个测试场景需要相同数据配置时
TEST_F(TestFixture, TestName) {}
// 用于使用参数编写测试,TestSuiteName需要继承testing::TestWithParam<T>,T为参数类型
TEST_P(TestSuiteName, TestName) { auto n = GetParam(); ... }
// 告诉gtest测试参数的范围,案例名被命名为CastPrefix/TestSuiteName.TestName/Param
INSTANTIATE_TEST_CASE_P(CasePrefix, TestSuiteName, testing::Values())

int main(int argc, char** argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}
function meaning
Range(begin, end[, step]) [begin, end), use step
Values(v1, v2, ..., vN) v1, v2, ..., vN
Valuesln(container) & Valuesln(begin, end) from C array or stl
Bool() true, false
Combine(g1, g2, ..., gN) permunate g1, g2, ..., gN, form a tuple as param

Event Mechanism

Global

所有案例执行前后,需要编写一个继承testing::Environment的类,实现其中的SetUp和TearDown方法。

C++
class XXXEnvironment: public testing::Environment
{
public:
    virtual void SetUp() { ... }
    virtual void TearDown() { ... }
};

// add to gtest

int main(int argc, char** argv)
{
    test::AddGlobalTestEnvironment(new XXXEnvironment);
    ...
}

TestSuite

在某一批案例中第一个案例执行前,最后一个案例执行后。需要编写继承testing::Test的类,实现两个静态方法。

C++
class XXXTest: public testing::Test
{
// or public
protected:
    // can be used to initialize
    static void SetUpTestCase() { ... }
    static void TearDownTestCase() { ... }
};

// use TEST_F to use XXXTest
TEST_F(XXXTest, Test) { ... }

TestCase

在每个案例执行前后,同TestSuite,但需要实现的是SetUp和TearDown

C++
1
2
3
4
5
6
// onaji to TestSuite
protected:
    virtual void SetUp() { ... }
    virtual void TearDown() { ... }

// use TEST_F

DeathTest

编写死亡测试时,TEST第一个参数,使用DeathTest作为后缀,这样gtest会优先执行,线程安全。

C++
// statement为被测试的代码/函数,regex为匹配异常时输出内容的正则表达式
EXPECT_DEATH(statement, regex)

有需要见死亡测试

Run Parameters

Priority: Command-line > code-flag > system env path.

C++
1
2
3
// 设置参数,如--gtest_output相当于testing::GTEST_FLAG(output) = "xml"
testing::GTEST_FlAG()
// 而系统环境变量为全大写

常用的参数:

  1. --gtest_filter=// 通配符,运行所有案例
  2. --gtest_output=xml[:DIReCTORY_PATH|:FILE_PATH]
  3. --gtest_catch_exceptions

Google Mock

模拟接口进行测试。

C++
EXPECT_CALL(mock_object, Method(argument-matchers)) // mock_object为模拟的对象,Method为mock_object中的mock方法。
    .With(multi-argument-matchers)
    .Times(cardinality)
    .InSequence(sequences) // InSquence用于指定函数执行的顺序,通过同意序列中声明期待的顺序确定
    .After(expectations)
    .WillOnce(action)
    .WillRepeatedly(action)
    .RetiresOnSaturation();

// where all clauses are optional, and .InSequence()/.After()/.WillOnce() can appear any number of times.