GoogleTest测试框架

基本测试用例是GoogleTest中最简单的测试单元,用于测定某个特定功能的行为。每个测试用例都是一个独立的函数,以TEST宏定义。

  • TEST宏:TEST宏定义了一个测试用例。它接收两个参数,第一个是测试用例集的名称(通常用类名或模块名),第二个是测试用例的名称。
  • GoogleTest提供了多种断言来验证测试结果,如EXPECT_EQ(相等)、EXPECT_TRUE(为真)等。
1
2
3
4
5
6
7
8
9
#include "gtest/gtest.h"
#include "my_module.h" // 假设这是你要测试的模块

TEST(MyModuleTest, TestFunctionality) {
MyModule module;
int result = module.SomeFunction();
EXPECT_EQ(result, 42); // 验证返回值是否为42
}

常用断言:

EXPECT_EQ(val1, val2): 验证 val1val2 是否相等。

EXPECT_NE(val1, val2): 验证 val1val2 是否不相等。

EXPECT_TRUE(condition): 验证条件 conditiontrue

EXPECT_FALSE(condition): 验证条件 conditionfalse

EXPECT_NEAR(val1, val2, abs_error): 验证 val1val2 之间的差值是否在 abs_error 之内(适用于浮点数)。

测试夹具类

测试夹具类用于在多个测试用例之间共享共同的设置和清理代码。通过使用测试夹具类,可以避免重复代码,提升测试的可维护性。

  • 当多个测试用例需要相同的初始化和清理工作时。
  • 当需要在测试用例之间共享资源(如文件、数据库连接等)时。

测试夹具类需要继承::testing::Test

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "gtest/gtest.h"
#include "my_module.h"

class MyModuleTest : public ::testing::Test {
protected:
void SetUp() override {
module = new MyModule();
}

void TearDown() override {
delete module;
}

MyModule* module;
};

TEST_F(MyModuleTest, TestFunctionality) {
EXPECT_EQ(module->SomeFunction(), 42);
}

TEST_F(MyModuleTest, AnotherTest) {
EXPECT_TRUE(module->AnotherFunction());
}

  • override关键字是重写关键字,在CXX中,没有这个关键字子类也可以重写父类的方法。但是有这个关键字以后,编译器会进行检查。

  • 虚函数是为了多态用的,可以用基类指针调用派生类的方法;纯虚函数是为了定义接口类用的。

  • SetUp()方法:这个方法在每个测试用例之前自动调用,用于设置测试环境,比如初始化对象或分配资源。

  • TearDown()方法:这个方法在每个测试用例之后自动调用,用于清理测试环境,比如释放资源或关闭连接。

  • 一旦定义了测试夹具类,就可以在测试用例中使用TEST_F宏来编写测试用例。

假设你有一个类 Calculator,其中有多个方法需要测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Calculator {
public:
Calculator(int a, int b) : a_(a), b_(b) {}
int Add() const { return a_ + b_; }
int Subtract() const { return a_ - b_; }
private:
int a_, b_;
};

class CalculatorTest : public ::testing::Test {
protected:
void SetUp() override {
calculator = new Calculator(10, 5);
}

void TearDown() override {
delete calculator;
}

Calculator* calculator;
};

TEST_F(CalculatorTest, AddTest) {
EXPECT_EQ(calculator->Add(), 15);
}

TEST_F(CalculatorTest, SubtractTest) {
EXPECT_EQ(calculator->Subtract(), 5);
}

在这个例子中,CalculatorTest 是一个测试夹具类,它在 SetUp() 中创建 Calculator 对象,并在 TearDown() 中销毁它。每个测试用例都会初始化一个独立的Calculator对象实例,这个夹具节省了代码。