gtest教程(记录小白从0学习gtest的过程)

本文介绍如何在不同平台上使用gtest测试框架进行C++单元测试。从获取源码、创建工程到编译gtest,最后通过实例演示gtest的基本用法,包括断言、测试套件等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

gtest使用教程

1 简介

之前对gtest一无所知,最近,找了些相关的资料,学习了下.这里主要记录了学习过程和相关知识点.

什么是gtest: gtest测试框架是在不同平台上(Linux,Mac OS X,Windows,Cygwin,Windows CE和Symbian)为编写C++测试而生成的。它是基于xUnit架构的测试框架,支持自动发现测试,丰富的断言集,用户定义的断言.

2 准备工作

无需linux虚拟机,Windows就可以,无需安装任何专业软件,但是要求可以上网.
是的,我们将直接在网页上进行在线编码,编译,运行.还不知道如何在线编译调试代码的,见上一篇文章

3 获取gtest源码

https://github.com/google/googletest.git

我是用git小乌龟下载的.
在这里插入图片描述
也可以用其他方式,目的就是获取源码:
在这里插入图片描述

4 创建工程

进入https://replit.com/
创建一个c++空白工程.
(如果你有linux环境或者虚拟机,将文件拷贝到linux就好了)
在这里插入图片描述
我的工程名叫test.
然后导入源码.
在这里插入图片描述
选择本地的gtest源码目录.
成功后:
在这里插入图片描述

5 编译gtest

  • 1 进入googletest,创建build文件夹(实际拼写出了点问题)
    在这里插入图片描述
    在shell下:
cd  googletest/bulid/
cmake ..
make

编译可能出现的问题:cmake版本过低,c++版本过低
解决:升级cmake版本—>怎么升级cmake版本
c++版本问题:要么升级c++版本比如c++14,c++17,或者用较低发布版本的gtest,不要用最新的,c++版本要求在README.MD有说明的

在这里插入图片描述
成功后得到静态库文件:
在这里插入图片描述

将libgtest.a  libgtest_main.a拷贝到main.cpp同级目录下(main.cpp自己创建)
cp googletest/bulid/lib/libgtest*.a .

6 测试

先搞个例子跑起来.
main.cpp

/* main.cpp
 * Created by 一条晓鱼 on 2022/12/15.
 */
#include "gtest/gtest.h"
#include <iostream>
#include <string>

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

TEST(fun, add_a)
{
	EXPECT_EQ(-3, add(-2,-1));
	EXPECT_EQ(-2, add(1,-3));
}

int main(int argc, char **argv){

    ::testing::InitGoogleTest(&argc, argv);
	return RUN_ALL_TESTS();

	return 0;
}
g++ main.cpp  libgtest.a -lpthread -std=c++14 -I /home/runner/test/googletest/googletest/include -o m
./m
(由于gtest版本问题,12.x  必须c++14以上才能编译通过,刚开始编译用的11标准,一直报错)
(有用的就是静态库和头文件,将来移植的时候就是需要这两个东西)

在这里插入图片描述
这样就算可以用啦.后面具体讲一下,gtest怎么用.

7 gtest 怎么用

  • 断言
    分ASSERT_XXX 和 EXPECT_XXX两类.
    区别:
    如果ASSERT_XXX 测试结果不通过,后面的测试就不会执行了.
    如果EXPECT_XXX 测试结果不通过,后面的测试会接着执行.
    布尔断言:单参断言
    ASSERT_TRUE、ASSERT_FALSE、EXPECT_TRUE、EXPECT_FALSE
    数值断言:双参
    ASSERT_EQ、ASSERT_NE、ASSERT_LT、ASSERT_LE、ASSERT_GT、ASSERT_GE
    EXPECT_EQ、EXPECT_NE、EXPECT_LT、EXPECT_LE、EXPECT_GT、EXPECT_GE
    字符串断言
    ASSERT_STREQ、ASSERT_STRCASEEQ

  • TEST(test_suite_name,test_name)
    一个TEST()算是一个测试case.
    TEST(x,y)展开为x_y_TEST()这样的函数
    比如测试add()函数,我们可以考虑多种测试情况:和为负数,和为正数,极限值测试.

/*
 * Created by 一条晓鱼 on 2022/12/15.
 */
#include "gtest/gtest.h"
#include <iostream>
#include <string>

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

TEST(add, negative)
{
	EXPECT_EQ(-3, add(-2,-1));
	EXPECT_EQ(-2, add(1,-3));
}

TEST(add, positive)
{
	EXPECT_EQ(1, add(2,-1));
	EXPECT_EQ(2, add(-1,3));
}

TEST(add, limit)
{
    int a = 0x7fffffff + 1;
    std::cout<<"a = "<<a<<"\n";
	EXPECT_EQ(a, add(0x7fffffff,1));
	EXPECT_EQ(0, add(0xffffffff,1));
}

int main(int argc, char **argv){

  ::testing::InitGoogleTest(&argc, argv);
	return RUN_ALL_TESTS();

	return 0;
}

在这里插入图片描述

  • TEST_F(x,y)
    以下函数使用需要定义测试套类继承::testing::Test,重新实现对应函数.
    SetUpTestSuite:static测试套级别,运行测试套第一个用例前执
    TearDownTestSuite: static 测试套级别,运行测试套最后一个用例后执行
    SetUp:virtual 测试套中每个测试用例开始时执行
    TearDown:virtrual 测试套中每个测试用例运行后执行
    x 为 class名.
    [怎么理解,举个例子:
    TEST()适用于单次api测试,但是通常我们都是以模块或者功能进行开发的,比如我们写了一个链表,链表里面有很多api:添加,删除,比较,等.对于整个链表的测试就是套件级别的,里面的api就是test级别的.
    TEST_F(list,add)
    TEST_F(list,delete)
    ]
/*
 * Created by 一条晓鱼 on 2022/12/15.
 */
#include "gtest/gtest.h"
#include <iostream>
#include <string>

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

TEST(add, negative)
{
	EXPECT_EQ(-3, add(-2,-1));
	EXPECT_EQ(-2, add(1,-3));
}

TEST(add, positive)
{
	EXPECT_EQ(1, add(2,-1));
	EXPECT_EQ(2, add(-1,3));
}

TEST(add, limit)
{
  int a = 0x7fffffff + 1;
  std::cout<<"a = "<<a<<"\n";
	EXPECT_EQ(a, add(0x7fffffff,1));
	EXPECT_EQ(0, add(0xffffffff,1));
}

class FooTest : public ::testing::Test {
 protected:
  // You can remove any or all of the following functions if their bodies would
  // be empty.

  FooTest() {
     // You can do set-up work for each test here.
  }

  ~FooTest() override {
     // You can do clean-up work that doesn't throw exceptions here.
  }
  static void SetUpTestSuite() {
    std::cout<<"===================run before first case..."<<std::endl;
  } 

  static void TearDownTestSuite() {
    std::cout<<"===================run after last case..."<<std::endl;
  }
  // If the constructor and destructor are not enough for setting up
  // and cleaning up each test, you can define the following methods:

  void SetUp() override {
    std::cout<<" =========================SetUp() \n";
     // Code here will be called immediately after the constructor (right
     // before each test).
  }

  void TearDown() override {
    std::cout<<" =========================TearDown() \n";
     // Code here will be called immediately after each test (right
     // before the destructor).
  }

  // Class members declared here can be used by all tests in the test suite
  // for Foo.
};

TEST_F(FooTest,test_a)
{
  EXPECT_EQ(2, add(0x7fffffff,1));
}

TEST_F(FooTest,test_b)
{
  EXPECT_EQ(1, add(0,1));
}

int main(int argc, char **argv){

  ::testing::InitGoogleTest(&argc, argv);
	return RUN_ALL_TESTS();

	return 0;
}

在这里插入图片描述

后续—gtest 死亡测试怎么用

上面两个是常用的.基本上就是初级教程里面的内容,高级教程后面有链接.

8 参考

初级教程
高级教程
在这里插入图片描述

03-19
### GTest 使用教程 #### 下载与安装 为了下载并安装 GTest,可以按照以下方法操作。通过 Git 克隆官方仓库后,在本地环境中完成编译和安装过程[^4]。 ```bash git clone https://github.com/google/googletest.git cd googletest mkdir build && cd build && cmake .. && make -j32 sudo make install sudo ldconfig ``` 上述命令会克隆 Google Test 的源码库,并利用 `cmake` 工具生成 Makefile 后执行构建流程。最终通过 `make install` 将其安装至系统目录中。 --- #### 配置开发环境 (Visual Studio 2010 版本为例) 对于 Windows 平台上的开发者来说,尤其是使用 Visual Studio 2010 的情况,可以通过手动配置的方式将 GTest 添加到项目工程中[^1]。具体步骤包括: - **下载 GTest**: 获取最新版本的 GTest 源代码。 - **复制头文件**: 把位于路径 `googletest-main/googletest/include/gtest/` 中的内容拷贝到项目的指定位置[^3]。 这一步骤确保了程序能够找到必要的头文件定义。 --- #### 构建测试模块 当采用 Linux 或其他支持 CMake 的平台时,推荐编写 `CMakeLists.txt` 来简化依赖管理以及目标可执行文件的创建工作[^2]。下面是一个简单的例子展示如何设置一个基于 GTest 的单元测试框架: ```cmake add_executable(gtest_demo2 mytest/gtest_demo_2.cc) target_link_libraries(gtest_demo2 GTest::GTest GTest::Main pthread) ``` 此脚本片段声明了一个名为 `gtest_demo2` 的可执行二进制文件,并将其链接到了预定义的目标库上 (`GTest::GTest`, `GTest::Main`) 和 POSIX 线程支持(`pthread`)。 随后运行 `make` 命令即可触发整个构建链路。 --- #### 示例代码 以下是关于如何在实际应用里调用 GTest 进行功能验证的一个简单实例: ```cpp #include <gtest/gtest.h> TEST(SampleTest, BasicAssertions) { EXPECT_TRUE(true); } int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } ``` 该段代码展示了最基本的测试套件定义方式及其入口函数实现逻辑。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值