GoogleTest(C++)使用教程

1.简介


GoogleTest是由Google开发的一个C++测试框架,支持Linux、Windows和macOS操作系统,使用Bazel或CMake构建工具。

项目主页:GitHub - google/googletest: GoogleTest - Google Testing and Mocking Framework
官方文档:GoogleTest User’s Guide | GoogleTest

2.windows使用

准备

将下载的googletest解压,将googletest文件夹复制到项目目录下

gtest_test
│  .gitattributes
│  .gitignore
│  CMakeLists.txt
│  LICENSE.txt
│  README.md
│                         
├─mytest
│      CMakeLists.txt
│      test_add.cpp
│      test_multiply.cpp                                   
├─src
│  │      
│  └─add
│          add.txt
│          add.cpp
│          CMakeLists.h
│          
└─googletest

在主目录下的CMakeLists.txt中引入googletest路径


#引入googletest子模块
add_subdirectory(googletest)
#引入googletest子模块的头文件,方便其他模块include
include_directories(googletest/include)

添加测试对象

在src文件中添加测试对象如下:

//add.h
#pragma once
int add(int x,int y);
//add.cpp
#include "add.h"
int add(int x,int y)
{
    return x + y;
}
//add文件夹中CMakeLists.txt
aux_source_directory(. ADD_SRC)
message("ADD_SRC: ${ADD_SRC}")
add_library(add STATIC ${ADD_SRC})
target_include_directories(add INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
将各部分作为子模块引入到项目中

在根目录CMakeLists.txt添加内容

#根目录CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(GtestTest VERSION 0.1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

#引入各子模块
add_subdirectory(src/add)

#使能测试
enable_testing()
#该选项对于msvc编译器很重要
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
#引入googletest子模块
add_subdirectory(googletest)
#引入googletest子模块的头文件,方便其他模块include
include_directories(googletest/include)

编写测试代码

//test_add.cpp
#include "gtest/gtest.h"
#include "add.h"

//其中第一个参数是测试套件名称,第二个参数是测试用例名称,二者都必须是合法的C++标识符,并且不应该包含下划线。
TEST(TestAdd, test_add_1) {
	int result = add(22, 33);
	EXPECT_EQ(result, 55);
}

TEST(TestAdd, test_add_2) {
	int result = add(22, 11);
	EXPECT_EQ(result, 33);
}
mytest文件夹中添加CMakeLists.txt
//mytest文件夹中CMakeLists.txt
add_executable(test_add test_add.cpp)

target_link_libraries(test_add add gtest gtest_main)

add_test(NAME test_add COMMAND test_add)
根目录CMakeLists.txt引入测试
#根目录CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(GtestTest VERSION 0.1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

#引入各子模块
add_subdirectory(src/app)

#引入测试
add_subdirectory(mytest)

#使能测试
enable_testing()
#该选项对于msvc编译器很重要
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
#引入googletest子模块
add_subdirectory(googletest)
#引入googletest子模块的头文件,方便其他模块include
include_directories(googletest/include)

运行测试

在QT工具中右击项目,选择"build",构建完毕后,在项目路径下会生成一个文件,进入生成的文件目录->在文件夹的路径里输入powershell,进入窗口->执行ctest -V命令

3.断言


GoogleTest断言是类似于函数调用的宏,用于测试类或函数的行为。当断言失败时,GoogleTest将打印断言所在的源文件、行数以及错误信息。

每个断言都有两种版本:

ASSERT_*版本的失败是致命失败,当检查点失败时,退出当前函数;

EXPECT_*版本的失败是非致命失败,当检查点失败时,继续往下执行。

GoogleTest提供了一组断言,用于检查布尔值、使用比较运算符比较两个值、比较字符串以及浮点数等。所有断言都定义在头文件<gtest/gtest.h>中。

常用断言如下(每个断言都有对应的ASSERT_*版本,这里省略):

断言验证条件
布尔值检查:
EXPECT_TRUE(condition)ASSERT_TRUE(condition)condition为真
EXPECT_FALSE(condition)ASSERT_FALSE(condition)condition为假
数值类型检查:
EXPECT_EQ(val1, val2)ASSERT_EQ(val1, val2)val1 == val2
EXPECT_NE(val1, val2)ASSERT_NE(val1, val2)val1 != val2
EXPECT_LT(val1, val2)ASSERT_LT(val1, val2)val1 < val2
EXPECT_LE(val1, val2)ASSERT_LE(val1, val2)val1 <= val2
EXPECT_GT(val1, val2)ASSERT_GT(val1, val2)val1 > val2
EXPECT_GE(val1, val2)ASSERT_GE(val1, val2)val1 >= val2
字符串类型检查:
EXPECT_STREQ(str1, str2)ASSERT_STREQ(str1, str2)C字符串str1str2相等
EXPECT_STRNE(str1, str2)ASSERT_STRNE(str1, str2)C字符串str1str2不相等
EXPECT_STRCASEEQ(str1, str2)ASSERT_STRCASEEQ(str1, str2)C字符串str1str2相等,忽略大小写
EXPECT_STRCASENE(str1, str2)ASSERT_STRCASENE(str1, str2)C字符串str1str2不相等,忽略大小写
浮点数检查:
EXPECT_FLOAT_EQ(val1, val2)ASSERT_FLOAT_EQ(val1, val2)两个floatval1val2近似相等
EXPECT_DOUBLE_EQ(val1, val2)ASSERT_DOUBLE_EQ(val1, val2)两个doubleval1val2近似相等
数值差检查:
EXPECT_NEAR(val1, val2, abs_error)ASSERT_NEAR(val1, val2, abs_error)val1val2之差的绝对值不超过abs_error
返回成功或失败:
EXPECT_THROW(statement, exception_type)ASSERT_THROW(statement, exception_type)statement抛出exception_type类型的异常
EXPECT_ANY_THROW(statement)ASSERT_ANY_THROW(statement)statement抛出任何类型的异常
EXPECT_NO_THROW(statement)ASSERT_NO_THROW(statement)statement不抛出任何异常
数值匹配检查:
EXPECT_THAT(val, matcher)ASSERT_THAT(val, matcher)val满足匹配器matcher

完整参考列表:Assertions Reference | GoogleTest 

4.测试宏

 TEST 宏

说明:该宏定义用来测试其内部代码,其内部断言决定最终的测试结果。

TEST(TestSuiteName, TestName) {
  ... statements ...
}

用途:针对多个用例之间不需要进行数据共用的测试场景。

示例:

int add(int a, int b) {
  return a + b;
}

TEST(TEST_ADD, UNSIGNED_INT_VALUE) {
  int result = add(100, 200);
  EXPECT_EQ(result, 300);
  result = add(200, 300);
  EXPECT_NE(result, 400);
}

TEST(TEST_ADD, NEGATIVE_INT_VALUE) {
  int result = add(-100, -200);
  EXPECT_EQ(result, -300);
  result = add(-200, -300);
  EXPECT_NE(result, -400);
}

TEST_F 宏

说明:该宏定义用来对 TestFixtureName 类进行多样测试。
使用方法:

TEST_F(TestFixtureName, TestName) {
  ... statements ...
}

用途:针对多个用例之间需要进行数据共用的测试场景,用于多样测试,也有助于简化测试代码。

使用示例:

class Student {
public:
  Student(int id, std::string name): id_(id), name_(name) {};
  ~Student() = default;
  void SetAge(int age) { age_ = age; }
  int GetAge() const { return this->age_; }
  void SetScore(int score) { score_ = score; }
  int GetScore() const { return this->score_; }
private:
  int id_;
  std::string name_;
  int age_;
  int score_;
};
class StudentTest : public testing::Test {
protected:
  void SetUp() override {
    student = new Student(1234, "Tom");
  }
  void TearDown() override {
    delete student;
  }
  Student* student;
};
TEST_F(StudentTest, SET_AGE_TEST) {
  student->SetAge(16);
  int age = student->GetAge();
  EXPECT_EQ(age, 16);
}
TEST_F(StudentTest, SET_SCORE_TEST) {
  student->SetScore(99);
  int score = student->GetScore();
  ASSERT_EQ(score, 99);
}
int main() {
  testing::InitGoogleTest();
  return RUN_ALL_TESTS();
}

TEST_P 宏

说明:该宏定义用来参数化测试。
使用方式:

TEST_P(TestFixtureName, TestName) {
  ... statements ...
}

用途:当待测试方法的行为取决于传入的参数时,而且这些参数的不同组合有多种, 而你又不想为此写多个类似的 test case 时,可以用参数化测试。
示例:


struct TestData {
  int  a;
  int  b;
  int  result;
  char type;
};
class CalculateTest : public ::testing::TestWithParam<TestData> {
protected:
  void checkData() {
    int a = GetParam().a;
    int b = GetParam().b;
    int result = GetParam().result;
    switch (GetParam().type) {
      case '+':
        EXPECT_EQ(a + b, result);
        break;
      case '-':
        EXPECT_EQ(a - b, result);
        break;
      case '*':
        EXPECT_EQ(a * b, result);
        break;
      case '/':
        EXPECT_EQ(a / b, result);
        break;
      default:
        break;
    }
  }
};
TEST_P(CalculateTest, Test) {
  checkData();
}
INSTANTIATE_TEST_SUITE_P(TestMyClassParams,
                         CalculateTest,
                         ::testing::Values(
                           TestData{100, 200, 300, '+'},
                           TestData{20, 5, 15, '-'},
                           TestData{5, 6, 30, '*'},
                           TestData{8, 2, 3, '/'}
                         ));
int main() {
  testing::InitGoogleTest();
  return RUN_ALL_TESTS();
}

  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Google Test(简称gtest)是由Google开发的一个C++测试框架,用于编写和运行单元测试、集成测试和功能测试。下面是一个简单的使用教程: 步骤1:下载和安装Google Test库 你可以从Google Test的官方仓库(https://github.com/google/googletest)下载最新的源代码。将源代码放在你的项目目录中,并将其编译为可执行文件或库。 步骤2:创建测试文件 在你的项目中创建一个新的测试文件,通常以"_test.cc"为后缀。例如,你可以创建一个名为"mytest_test.cc"的文件。 步骤3:编写测试用例 在测试文件中,你可以使用TEST宏定义来定义一个测试用例。一个测试用例可以包含多个测试。例如: ```cpp #include <gtest/gtest.h> TEST(MyTestSuite, Test1) { // 测试代码 ASSERT_EQ(2 + 2, 4); } TEST(MyTestSuite, Test2) { // 测试代码 ASSERT_TRUE(true); } ``` 步骤4:编写测试代码 在每个测试用例中,你可以使用Google Test提供的断言宏来编写测试代码。常用的断言有ASSERT_EQ、ASSERT_TRUE、ASSERT_FALSE等,用于对表达式进行断言判断。 步骤5:运行测试 编译并运行你的测试代码。Google Test会自动运行所有的测试用例,并输出测试结果。 以上是Google Test的基本使用教程,你可以根据需要深入学习和使用更多的功能和特性。更详细的文档和示例可以在Google Test的官方网站(https://github.com/google/googletest)上找到。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值