Wazuh DBSync 单元测试编译与运行指南:从零构建并验证 Linux 目标测试

Wazuh DBSync 单元测试编译与运行指南:从零构建并验证 Linux 目标测试 Wazuh DBSync 单元测试编译与运行指南从零构建并验证 Linux 目标测试【免费下载链接】wazuhWazuh - The Open Source Security Platform. Unified XDR and SIEM protection for endpoints and cloud workloads.项目地址: https://gitcode.com/GitHub_Trending/wa/wazuh导读DBSync 是 Wazuh 开源安全平台中负责本地数据库同步的核心共享模块位于src/shared_modules/dbsync它为 syscollector、FIM 等模块提供基于 SQLite 的高性能数据同步能力。本文围绕仓库内 DBSync 单元测试文档 展开系统讲解如何在 Linux 环境下完成 Wazuh 工程级编译、独立构建 DBSync 单元测试、运行指定测试目标与单条测试用例的全过程。读完本文你将掌握make TEST1的工程编译开关、CMake 独立构建命令、四个测试二进制的作用、gtest/gmock 测试组织方式以及如何借助 ctest 与覆盖率参数对 DBSync 进行质量验证。一、DBSync 单元测试体系概览1.1 被测对象DBSync 是什么DBSync 以共享库形式提供了一套面向 SQLite 的数据同步引擎。从 公开 C 接口 可以看到其核心能力通过dbsync_create/dbsync_create_persistent创建数据库句柄前者默认DbManagement::VOLATILE后者默认PERSISTENT并支持表结构升级语句通过dbsync_create_txn创建多线程事务再以行同步、快照更新、删除行回调等方式把 JSON 数据批量写入本地库。入口实现 中dbsync_create_会先校验path与sql_statement非空再委托给 C 实现层完成初始化。单元测试正是围绕这套接口及其底层 SQLite 封装src/sqlite/sqlite_wrapper.cpp、src/sqlite/sqlite_dbengine.cpp展开的。1.2 测试目录结构仓库中 tests 目录 的组织方式如下src/shared_modules/dbsync/tests/ ├── Readme.md # 本文对应的官方说明文档 ├── CMakeLists.txt # 汇总四个测试子目录的顶层构建脚本 ├── dbengine/ # 数据库引擎层测试sqlite_dbengine ├── interface/ # DBSync 公开接口层测试dbsync 句柄/事务 ├── mocks/ # gmock 桩sqlite_wrapper、sqlite factory、dbsync ├── pipelineFactory/ # 同步管线工厂测试多线程批量处理 └── sqlite/ # SQLite 封装层测试连接/事务顶层 tests/CMakeLists.txt 依次add_subdirectory(sqlite)、add_subdirectory(interface)、add_subdirectory(pipelineFactory)、add_subdirectory(dbengine)并引入external/googletest与external/googlemock头文件说明整套单测基于 GoogleTest / GoogleMock 框架编写。二、前置条件以 TEST 模式编译 Wazuh原文档明确指出要对某个 Wazuh 目标运行单元测试必须先以TEST选项构建整个工程。命令如下make deps RESOURCES_URLfile:///path/to/deps/ make TARGETserver|agent TEST1make deps RESOURCES_URLfile:///path/to/deps/拉取/解压第三方依赖资源。RESOURCES_URL指向存放预编译依赖的本地目录也可为 HTTP(S) 源是离线构建的常用方式。make TARGETserver|agent TEST1TARGET决定编译服务端还是 AgentTEST1是关键开关——它会让各模块的 CMake 构建脚本进入测试模式。以 DBSync 模块自身的 CMakeLists.txt 为例UNIT_TEST打开后会发生三件事enable_testing()启用 ctest 测试注册add_coverage_libraries(dbsync)并给所有测试可执行文件追加--coverage/-fprofile-arcs编译与链接参数GCC 与 Clang 均支持实现代码覆盖率收集追加add_subdirectory(tests)与add_subdirectory(integrationTests)把单元测试与集成测试一并纳入构建。反之当UNIT_TEST未定义时构建系统会编译 example 示例程序 以演示库的用法if(NOT DEFINED COVERITY AND NOT DEFINED UNIT_TEST)分支说明测试模式与示例模式是互斥的。三、独立编译 DBSync 单元测试Linux3.1 构建前置要求运行 DBSync 单元测试必须使用CMake 3.12 或更高版本cmake_minimum_required(VERSION 3.12.4)并确保已按上文方式准备好wazuh/src/external/下的依赖包括 sqlite3、cJSON、OpenSSL、nlohmann/json、googletest 等模块 CMakeLists 中通过include_directories引用了external/sqlite、external/nlohmann、external/cJSON、external/openssl/include。3.2 构建命令原文档给出的步骤为注意原文档写于早期目录布局指向wazuh/src/dbsync/在当前仓库中模块实际位于src/shared_modules/dbsync/下文命令已按现状调整mkdir build cd build cmake -DEXTERNAL_LIB~/path/to/wazuh/src/external/ -DCMAKE_BUILD_TYPEDebug -DUNIT_TESTON .. cmake --build .参数逐一说明参数含义-DEXTERNAL_LIBpath指向 Wazuh 外部依赖目录即wazuh/src/external/的绝对路径构建时会用它定位 sqlite3、cJSON、gtest/gmock 等库-DCMAKE_BUILD_TYPEDebug以 Debug 模式编译保留调试符号便于定位断言失败与覆盖率分析-DUNIT_TESTON开启 DBSync 测试构建分支等价于上一节工程级TEST1在该模块内的具体落地构建成功后产物统一输出到build/bin库输出到build/lib如 模块 CMakeLists 中CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin所定义。3.3 构建脚本层面的测试接线在 tests/CMakeLists.txt 及各子目录 CMakeLists 中每个测试目标都遵循同一模式使用file(GLOB ..._TEST_SRC *.cpp)收集测试源码再显式引入被测实现源码如 sqlite 测试引入src/sqlite/sqlite_wrapper.cppdbengine 测试引入sqlite_dbengine.cpp与sqlite_wrapper.cpp链接gtest、gmock、gtest_main、gmock_main以及sqlite3、cjson、pthread、dl等运行库通过add_test(NAME target COMMAND target)注册到 ctest并set_tests_properties(... PROPERTIES LABELS dbsync)打上标签便于批量筛选执行。四、四个测试目标被测层次与职责下表汇总了当前仓库实际生成的测试二进制及其对应源码位置测试二进制对应目录被测对象说明sqlite_unit_testtests/sqlitesrc/sqlite/sqlite_wrapper.cpp覆盖 SQLite 连接、事务、语句执行等底层封装dbsync_unit_testtests/interfacesrc/*.cpp、src/sqlite/*.cpp覆盖公开句柄、事务、行同步等接口行为dbsyncPipelineFactory_unit_testtests/pipelineFactorysrc/dbsyncPipelineFactory.*及全部实现覆盖多线程同步管线工厂的批量调度dbengine_unit_testtests/dbenginesrc/sqlite/sqlite_dbengine.cpp覆盖数据库引擎层的表管理、快照与删除逻辑原文档示例中提到的string_helper_unit_test对应的是通用工具类测试的命名惯例在本模块中直接对应上述四个二进制即可。测试中大量使用 GoogleMock 桩mocks/sqlitewrapper_mock.h与mocks/sqlitefactory_mock.h用于隔离 SQLite 真实调用mocks/mock_dbsync.hpp用于在接口层测试中模拟 DBSync 句柄从而让测试聚焦业务逻辑而非数据库实现细节。五、运行单元测试5.1 运行全部测试在build目录下可用 ctest 一次性执行本模块全部已注册测试ctest -L dbsync --output-on-failure-L dbsync依据前面打上的 LABELS 精确筛选 DBSync 相关用例--output-on-failure在失败时打印详细日志。5.2 运行指定测试目标原文档强调若只需运行某个特定测试直接进入其所在子目录对应的bin目录像运行普通 Linux 程序一样执行即可测试结果直接输出到控制台cd bin ./sqlite_unit_test ./dbsync_unit_test ./dbsyncPipelineFactory_unit_test ./dbengine_unit_test每个二进制内部也可用 gtest 的过滤参数运行更细粒度的用例例如只执行 SQLite 连接相关测试./sqlite_unit_test --gtest_filterSQLiteTest.Connection*5.3 测试输出示例以 sqlite_test.cpp 为例其测试场景包括ConnectionCtor默认构造与带路径构造的连接对象均能获得有效数据库句柄ConnectionClose关闭后db()返回空指针且再次执行语句会抛出sqlite_errorConnectionExecute合法的BEGIN TRANSACTION/ROLLBACK TRANSACTION不抛异常非法 SQL 抛出sqlite_errorTransactionCtorDtorSuccess/TransactionCommitSuccess通过MOCK_METHOD桩连接验证事务在构造时发出BEGIN TRANSACTION、提交时发出COMMIT、析构未提交时回滚ROLLBACK TRANSACTION。这些用例同时验证了sqlite_wrapper的异常语义db_exception.h中的sqlite_error与事务生命周期是典型的“行为驱动 状态断言”gtest 写法。六、测试数据与纵深验证手段六、接口层测试的真实数据tests/interface/test_inputs.h 内嵌了大量真实进程数据的 JSON 数组如systemd、kthreadd、rcu_gp等 Linux 进程字段pid、ppid、name、state、resident、vm_size……用于模拟 syscollector 上报的进程清单。接口层测试正是把这些 JSON 输入灌入dbsync_create_txn等接口验证插入、修改、删除、快照等同步语义与实际业务场景保持一致。六、2 更广的测试生态除单元测试外同一模块还提供两层验证集成测试integrationTests/fim 下的fimIntegrationTest.cpp面向 FIM文件完整性监控场景做端到端数据库验证同样受UNIT_TEST开关控制冒烟测试smokeTests 通过 DBSync 测试工具testtool驱动整个库的公开 API按InsertionUpdateDeleteSelect、snapshotsUpdate、triggerActions、txnOperation等场景组织 JSON 输入与预期结果用于验证核心链路未回归。下图展示了测试工具的总体架构图片来源 dbsyncTestToolArchDiagram.png测试工具本身位于 testtool由main.cpp、action.h、cmdArgsHelper.h、factoryAction.h、testContext.h及input/下的一系列 JSON 场景文件组成为冒烟测试提供了统一的命令行入口。七、常见问题与排查要点目录路径不一致原文档写的是wazuh/src/dbsync/在当前仓库中应按src/shared_modules/dbsync/执行构建其余步骤不变。make deps资源缺失若RESOURCES_URL指定的本地目录缺少预编译依赖构建会在链接阶段报cannot find -lsqlite3、-lgtest之类的错误请确认external/下依赖完整。CMake 版本过低cmake_minimum_required(VERSION 3.12.4)会直接拒绝低于 3.12 的 CMake请先升级。找不到测试二进制确认-DUNIT_TESTON已传入只有该选项打开时add_subdirectory(tests)才会生效bin目录下才会出现四个测试程序。覆盖率数据Debug 测试模式下已自动附加--coverage可用 gcov/lcov 分析各测试目标对src/sqlite/与src/源码的覆盖情况辅助补充用例。结语DBSync 的单元测试体系以 GoogleTest/GoogleMock 为底座通过工程级TEST1与模块级-DUNIT_TESTON两级开关接入构建形成 sqlite 封装层、接口层、管线工厂、引擎层四个层次的测试目标。掌握本文的编译命令make deps、make TARGETserver|agent TEST1、cmake -DEXTERNAL_LIB... -DUNIT_TESTON、cmake --build .与运行方式ctest -L dbsync、直接执行bin下二进制、--gtest_filter即可对 Wazuh 数据同步核心链路进行系统性的本地验证并可与 FIM 集成测试、冒烟测试配合形成完整的质量保障闭环。【免费下载链接】wazuhWazuh - The Open Source Security Platform. Unified XDR and SIEM protection for endpoints and cloud workloads.项目地址: https://gitcode.com/GitHub_Trending/wa/wazuh创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考