c++使用googletest进行单元测试

googletest进行单元测试

使用Google test进行测试

使用场景:

在平时写代码中,我们需要测试某个函数是否正确时可以使用Google test使用,当然,我们也可以自己写函数进行验证,但是使用google test是一个封装好的,使用也很简单,同时显示效果更佳能有效提高我们的效率

安装方式:

  1. 使用vcpkg: vcpkg install gtest:x64-windows
  2. 官网下载:传送门

vcpkg(c++包管理器)相关介绍,使用很简单:vcpkg 在clion和vs中的使用

以下是基于clion和vcpkg使用(vs好像继承了google test):

这里就不介绍怎么安装了,不会在clion中使用vcpkg安装gtest的可以看一看前面的文章,很快就能看完

一、单元测试

CMakeLists.txt文件

cmake 复制代码
cmake_minimum_required(VERSION 3.28)
# vcpkg经典模式下建议手动添加这个,不然可能会报错找不到路径,别折腾了
set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake"
        CACHE STRING "Vcpkg toolchain file")

project(test)

set(CMAKE_CXX_STANDARD 17)
find_package(GTest CONFIG REQUIRED)

add_executable(test main.cpp)

target_link_libraries(test PRIVATE GTest::gtest GTest::gtest_main GTest::gmock GTest::gmock_main)

源代码

c++ 复制代码
//使用google test进行单元测试
#include <gtest/gtest.h>
#include <iostream>

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

TEST(testCase1,should_3_when_1_add_2)
{
	EXPECT_EQ(3, add(1, 2));
}

int main(int argc, char **argv)
{
	std::cout << "hello world" << std::endl;
    testing::InitGoogleTest(&argc, argv);
	return RUN_ALL_TESTS();
}

测试结果:

解释:

  1. TEST(testCase1,should_3_when_1_add_2) testCase1为测试名称,should_3_when_1_add_2为常用的命名规范,让人们一看就知道要测试什么

  2. EXPECT_EQ(3, add(1, 2)); EXPECT_EQ为测试宏,用于对比函数结果和预期结果,如果结果相同则测试正确,不同则报错

    这种是固定写法,用于测试使用

c++ 复制代码
 int main(int argc, char **argv)
 {
     testing::InitGoogleTest(&argc, argv);
     return RUN_ALL_TESTS();
 }

错误示例:

二、使用gmock测试

gmock测试呢,就是在你将函数写出来了,但还没有实现定义,这是你可以使用gmock实现简单的测试。

使用gmock时需要**继承**要gmock的类,例如我需要gmock User类的get_name函数,可以这样使用

c++ 复制代码
//User类定义
#ifndef USER_H
#define USER_H
#include <iostream>
class User{
public:
  virtual std::string get_name() = 0;
};

#endif
c++ 复制代码
//MockUser类定义
#ifndef MOCKUSER_H
#define MOCKUSER_H

#include "User.h"
#include <gmock/gmock.h>
class MockUser: public User{
public:
  MOCK_METHOD(std::string, get_name, (), (override));
};

#endif
c++ 复制代码
//使用google test进行单元测试
#include <gtest/gtest.h>
#include <iostream>
#include "MockUser.h"
int add(int a, int b) {
	return a + b;
}

TEST(testCase1, should_3_when_1_add_2) {
	EXPECT_EQ(3, add(1, 2));
}

TEST(testCase2, test) {
	MockUser user;
	EXPECT_CALL(user, get_name()).Times(testing::AtLeast(3)).
	WillOnce(testing::Return("one")).
	WillOnce(testing::Return("two")).
	WillRepeatedly(testing::Return("other"));

	std::cout << user.get_name() << std::endl;
	std::cout << user.get_name() << std::endl;
	std::cout << user.get_name() << std::endl;
	std::cout << user.get_name() << std::endl;
	std::cout << user.get_name() << std::endl;
	std::cout << user.get_name() << std::endl;
}

int main(int argc, char **argv) {
	std::cout << "hello world" << std::endl;
	testing::InitGoogleTest(&argc, argv);
	return RUN_ALL_TESTS();
}

测试结果:

解释:

  1. Times(testing::AtLeast(3))设置至少执行三次,如果少于三次就错误
  2. WillOnce(testing::Return("one")). WillOnce表示执行一次,Return表示传入的参数,这里有两个WillOnce分别调式第一次调用和第二次调用分别传入one和two
  3. WillRepeatedly(testing::Return("other")); 表示递归调用,这里的Return表示后续递归调用传入的值,前两次输出one和two,后面输出other
相关推荐
sanjiaomao3335 小时前
从论文公式到Python实现:用单元测试校验滑动平均算法
python·算法·单元测试
梁辰兴3 天前
软件工程:单元测试
单元测试·软件工程·梁辰兴·‘设计原则·方法技术·tdd驱动·mock隔离
2601_962299886 天前
python脚本如何单元测试
python·单元测试·pytest·unittest·mock对象
牛油果子哥q7 天前
C++大型项目工程精讲:CMake完整实战、静态库&动态库、模块化拆分、单元测试、gdb调试、性能工具、工程踩坑全解
开发语言·c++·单元测试
leoZ2318 天前
AI+前端提效-09 AI赋能前端测试:单元测试、E2E测试自动生成,提升覆盖率
前端·人工智能·opencv·目标检测·数据挖掘·单元测试·语音识别
边吃番茄边敲代码11 天前
从本地工具到 MCP:给 Agent 接入独立工具服务,并补齐自动化测试
人工智能·python·功能测试·ai·单元测试·pytest
qq_4523962312 天前
第十三篇:《测试策略:单元测试、组件测试、E2E 测试的落地实践》
单元测试
ly768913 天前
前端测试完整指南:从单元测试、组件测试到端到端测试与 CI/CD
前端·ci/cd·单元测试
咖啡星人k13 天前
2026 AI 自动化测试:让 AI 帮你写用例、跑测试、修 Bug(MonkeyCode 云端实战)
人工智能·功能测试·单元测试·测试用例·bug·集成测试