聊天室项目开发——安装并使用gtest库以及spdlog日志组件
1.安装gtest库以及apdlog
这里直接使用apt进行安装,一般来说是没有问题的,如果有问题可以先尝试更新apt,再不信就只能使用源码进行安装了,这里提一下就是如果使用源码安装,然后你的ubuntu机子是新机就什么都没有可能需要先安装cmake,make这些东西,不然你没有办法对源码进行编译以及安装,这个可以问问ai还是比较简单的。
sudo apt-get install libgtest-dev
sudo apt-get install libspdlog-dev
2.gtest库的介绍以及使用
2.1 介绍
GTest 是一个跨平台的 C++单元测试框架,由 google 公司发布。gtest 是为了在不同 平台上为编写 C++单元测试而生成的。它提供了丰富的断言、致命和非致命判断、参数化等等测试所需的宏,以及全局测试,单元测试组件。
其实说白了就是,我们平常对写的程序进行测试的时候,会通过打印来和自己的预期进行比对,来看是否符合预期,这个库就是提供了一个TEST宏函数以及一些比较函数,有ASSERT_系列和EXPECT_系列,ASSERT系列如果和预期不同就会退出这组测试,而EXPECT系列如果不符合预期依旧会继续进行。
下面是所有的ASSERT系列函数,EXPECT_系列只需要将ASSERT换成EXPECT就行
2.2 简单使用
再使用前我们需要进行初始化也就是testing::InitGoogleTest(&argc,argv);
TEST宏函数的相关参数的解释
#include <gtest/gtest.h>
#include <iostream>//EQ:==,NE:!=,LT:<,GT:>,LE:<=,GE:>= int add(int x,int y)
{return x+y;
}TEST(test1,add_test1)
{//EXPECT_系列宏,如果当前点检测失败则继续往下执行EXPECT_EQ(3,add(1,2));std::cout<<"test1"<<std::endl;//ASSERT_系列宏,如果当前点检测失败则不再往下执行ASSERT_EQ(4,add(2,2)-1);std::cout<<"test1_2"<<std::endl;
}int main(int argc,char *argv[])
{testing::InitGoogleTest(&argc,argv); //将命令行参数传递给gtest -- >> 框架初始化接口//运行所有测试案例return RUN_ALL_TESTS();
}
//makefile
main : main.cc g++ -std=c++17 $^ -o $@ -lgtest
3.spdlog的介绍和使用
3.1 spdlog介绍
spdlog 是一个高性能、超快速、零配置的C++ 日志库,它旨在提供简洁的API 和丰富的功能,同时保持高性能的日志记录。它支持多种输出目标、格式化选项、线程安全以及异步日志记录。以下是对spdlog 的详细介绍和使用方法。
特点
• 高性能:spdlog 专为速度而设计,即使在高负载情况下也能保持良好的性能。
• 零配置:无需复杂的配置,只需包含头文件即可在项目中使用。
• 异步日志:支持异步日志记录,减少对主线程的影响。
• 格式化:支持自定义日志消息的格式化,包括时间戳、线程ID、日志级别等。
• 多平台:跨平台兼容,支持Windows、Linux、macOS 等操作系统。
• 丰富的 API:提供丰富的日志级别和操作符重载,方便记录各种类型的日志。
3.2 简单使用
对于同步日志器我们在使用时需要先创建落地方向,可以有多个,这个落地方向其实就是往哪个地方输出,根据落地方向类的限制输出等级,可以完成输出不同的日志,比如我下面写的这个multi_sink_example这个函数内的日志器就有两个落地方,只有当日志的等级大于warn才会在标准输出上进行输出,而trace等级以上的都会往文件落地方向输出。
异步日志器我注释写的比较详细,看了应该就明白了。
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/async.h>
void multi_sink_example()
{// 创建一个标准输出的落地方向对象auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();// 该方向仅允许 warn 等级以上的日志输出console_sink->set_level(spdlog::level::warn);console_sink->set_pattern("[multi_sink_example] [%^%l%$] %v");// 创建一个文件输出的落地方向对象auto file_sink =std::make_shared<spdlog::sinks::basic_file_sink_mt>("logs/multisink.txt", true);// 该方向允许 trace 等级以上的日志输出file_sink->set_level(spdlog::level::trace);// 构造一个日志器对象,用于输出日志spdlog::logger logger("multi_sink", {console_sink, file_sink}); // 每个日志器都可以设置初步过滤等级,其次内部每个 sink 也可以设置自己独立的过滤等级logger.set_level(spdlog::level::debug);logger.set_pattern("%Y-%m-%d %H:%M:%S [%l] %v");logger.warn("this should appear in both console and file");logger.info("this message should not appear in the console, only in the file");
}
void async_example()
{// void init_thread_pool(size_t q_size, size_t thread_count);spdlog::init_thread_pool(32768, 1); // 设置默认线程池属性信息// 通过工厂模式创建异步日志记录器的同时,会在内部创建默认线程池作为异步线程auto async_logger =spdlog::basic_logger_mt<spdlog::async_factory>("async_file_logger", "logs/async_log.txt");async_logger->set_pattern("%Y-%m-%d %H:%M:%S [%l] %v");for (int i = 1; i < 101; ++i){// 需要注意的是,在多参数的时候,spdlog 并非使用 %s %d 这种通配符来匹配参数// 而是使用 {}, spdlog 可以自己识别数据类型async_logger->info("Async message #{} {}", i, "hello");}
}
int main()
{// multi_sink_example();async_example();return 0;
}