C++17 JSON解析库测试框架。
使用现代C++,保证程序内存安全,跨平台。
提供 解析速度,内存占用,浮点精度,字符串转义,语法严格性,增删改查 等多项测试内容。
提供测试报告和结果数据表格,提供工具生成测试对比图。
- 框架采用C++17,框架本身仅依赖标准库。
- 项目构建使用
CMake
,搭配CMakePreset
,完全跨平台。 - 第三方库管理,默认使用
vcpkg
,可以自行修改CMakePreset
调整。 - Qt测试依赖
qtbase
,库太大,默认不下载,需要自行配置库目录。 若不需要,可删除此测试和相关依赖导入。 - Boost测试,也需要下载较多的文件,不需要的话可以自行删去。
TestBase的子类,也就是各库的测试代码文件,统一放在test_codes/
目录下。
新增测试类,直接添加cpp文件即可,无需修改主函数和CMake等配置。
(仅test_codes/
文件夹下的.cpp
文件,不递归扫描,因此不编译test_codes/models/
下的文件。)
注:若test_codes/
下没有任何文件,也就没有注册任何测试类。 主程序依然能正常运行,但是输出的报告中不含任何测试结果。
下面提供3种方式:
- 使用vcpkg安装第三方库,推荐清单模式,使用
vcpkg add port 包名
添加。然后在CMakeLists.txt
中使用find_package
和target_link_libraries
即可。 - 直接放源码。将头文件放入
include
文件夹,将源文件放入src
文件夹即可,项目构建/生成时会把这些代码也加入构建/编译生成。 - 使用vcpkg的custom-overlay模式,添加自定义位置的第三方库,推荐看官方示例。
根据上述的工作原理,你只需要写一个.cpp
文件,导入头文件model_class.h
和你的库的头文件。
内部写一个子类继承TestBase
接口并实现全部纯虚函数,最后通过宏注册即可。
test_codes/
文件夹下有一些现成的代码,test_codes/models/
文件夹中提供了一些参考代码。
如果你有CMake基础,可以看看CMakeLists.txt
和CMakePresets.json
,项目结构其实非常简单。
根据自己的情况,调整一下CMakePresets.json
,然后选择合适的预设选项,使用
cmake --preset <configure-preset-name>
cmake --build --preset <build-preset-name>
就能配置和生成。(推荐Release模式,Debug模式下栈空间消耗大,深层递归解析测试可能失败。)
前置: 完成上述步骤并运行可执行程序。
测试完成后,各种数据将放在result/
文件夹下,这里有3大内容:
result/reports/
文件夹,存放各库的测试错误报告(部分错误并无危害,是正常的)。result/result.csv
文件,存放着各库 各测试项目的具体分数。get_chart_**.py
Python程序,用于读取result.csv
并生成图表。
请进入result/
文件夹,然后执行python get_chart_zh.py
命令即可。
图片将生成在result/images_zh/
文件夹中。
test_codes/
文件夹下存放测试类代码,不会递归查询,所以test_codes/models
内的代码不会被编译。test_codes/
文件夹即使全删,程序依然能正常运行。不想要什么测试,删了就行。- 如果删除了测试文件,记得修改
CMakeLists.txt
和vcpkg.json
,删除项目的库依赖,不然还会下载。 - Qt测试默认使用本地Qt,需要自行设置CMake预设,指定位置。(
qtbase
库太大,保护大量不相关内容,不推荐vcpkg下载)。 - 如果测试QtJson,执行时需要Qt6Core.dll动态库文件,需要自己复制本地的dll文件到目标文件夹。
documents
文件夹下提供了Qt6Core.dll动态库文件,由于版本问题,不一定能够兼容。推荐使用自己的文件。
目前仅比较如下几个库,各有优劣(Release下):
- rapidjson 操作非常繁杂,解析与操作极快,内存占用很低,性能极佳,库中等。
- boost-json 操作简单,现代,会抛出异常,性能极佳,库很大。
- Qt 操作难度中等,值类型的直接解析 支持性较差,性能中等,修改元素较慢,库很大。
- mysvac-jsonlib 操作非常简单,现代,会抛出异常,性能较好,库非常小。
- nlogmann-json 操作非常简单,现代,会抛出异常,性能较好,库较小。
- jsoncpp 操作非常简单,现代,不抛出异常,性能略差,库较小。