Wazuh DBSync 单元测试编译与运行指南:从零构建并验证 Linux 目标测试
2026/9/15 7:23:33 网站建设 项目流程

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 TEST=1的工程编译开关、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_会先校验pathsql_statement非空,再委托给 C++ 实现层完成初始化。

单元测试正是围绕这套接口及其底层 SQLite 封装(src/sqlite/sqlite_wrapper.cppsrc/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/googletestexternal/googlemock头文件,说明整套单测基于 GoogleTest / GoogleMock 框架编写。

二、前置条件:以 TEST 模式编译 Wazuh

原文档明确指出:要对某个 Wazuh 目标运行单元测试,必须先以TEST选项构建整个工程。命令如下:

make deps RESOURCES_URL=file:///path/to/deps/ make TARGET=server|agent TEST=1
  • make deps RESOURCES_URL=file:///path/to/deps/:拉取/解压第三方依赖资源。RESOURCES_URL指向存放预编译依赖的本地目录(也可为 HTTP(S) 源),是离线构建的常用方式。
  • make TARGET=server|agent TEST=1TARGET决定编译服务端还是 Agent,TEST=1是关键开关——它会让各模块的 CMake 构建脚本进入测试模式。

以 DBSync 模块自身的 CMakeLists.txt 为例,UNIT_TEST打开后会发生三件事:

  1. enable_testing()启用 ctest 测试注册;
  2. add_coverage_libraries(dbsync)并给所有测试可执行文件追加--coverage/-fprofile-arcs编译与链接参数(GCC 与 Clang 均支持),实现代码覆盖率收集;
  3. 追加add_subdirectory(tests)add_subdirectory(integrationTests),把单元测试与集成测试一并纳入构建。

反之,当UNIT_TEST未定义时,构建系统会编译 example 示例程序 以演示库的用法(if(NOT DEFINED COVERITY AND NOT DEFINED UNIT_TEST)分支),说明测试模式与示例模式是互斥的。

三、独立编译 DBSync 单元测试(Linux)

3.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/sqliteexternal/nlohmannexternal/cJSONexternal/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_TYPE=Debug -DUNIT_TEST=ON .. cmake --build .

参数逐一说明:

参数含义
-DEXTERNAL_LIB=<path>指向 Wazuh 外部依赖目录,即wazuh/src/external/的绝对路径,构建时会用它定位 sqlite3、cJSON、gtest/gmock 等库
-DCMAKE_BUILD_TYPE=Debug以 Debug 模式编译,保留调试符号,便于定位断言失败与覆盖率分析
-DUNIT_TEST=ON开启 DBSync 测试构建分支,等价于上一节工程级TEST=1在该模块内的具体落地

构建成功后,产物统一输出到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.cpp,dbengine 测试引入sqlite_dbengine.cppsqlite_wrapper.cpp);
  • 链接gtestgmockgtest_maingmock_main,以及sqlite3cjsonpthreaddl等运行库;
  • 通过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/*.cppsrc/sqlite/*.cpp覆盖公开句柄、事务、行同步等接口行为
dbsyncPipelineFactory_unit_testtests/pipelineFactorysrc/dbsyncPipelineFactory.*及全部实现覆盖多线程同步管线工厂的批量调度
dbengine_unit_testtests/dbenginesrc/sqlite/sqlite_dbengine.cpp覆盖数据库引擎层的表管理、快照与删除逻辑

原文档示例中提到的string_helper_unit_test对应的是通用工具类测试的命名惯例;在本模块中,直接对应上述四个二进制即可。

测试中大量使用 GoogleMock 桩:mocks/sqlitewrapper_mock.hmocks/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_filter=SQLiteTest.Connection*

5.3 测试输出示例

以 sqlite_test.cpp 为例,其测试场景包括:

  • ConnectionCtor:默认构造与带路径构造的连接对象均能获得有效数据库句柄;
  • ConnectionClose:关闭后db()返回空指针,且再次执行语句会抛出sqlite_error
  • ConnectionExecute:合法的BEGIN TRANSACTION/ROLLBACK TRANSACTION不抛异常,非法 SQL 抛出sqlite_error
  • TransactionCtorDtorSuccess/TransactionCommitSuccess:通过MOCK_METHOD桩连接验证事务在构造时发出BEGIN TRANSACTION、提交时发出COMMIT、析构未提交时回滚ROLLBACK TRANSACTION

这些用例同时验证了sqlite_wrapper的异常语义(db_exception.h中的sqlite_error)与事务生命周期,是典型的“行为驱动 + 状态断言”gtest 写法。

六、测试数据与纵深验证手段

六、接口层测试的真实数据

tests/interface/test_inputs.h 内嵌了大量真实进程数据的 JSON 数组(如systemdkthreaddrcu_gp等 Linux 进程字段:pidppidnamestateresidentvm_size……),用于模拟 syscollector 上报的进程清单。接口层测试正是把这些 JSON 输入灌入dbsync_create_txn等接口,验证插入、修改、删除、快照等同步语义,与实际业务场景保持一致。

六、2 更广的测试生态

除单元测试外,同一模块还提供两层验证:

  • 集成测试:integrationTests/fim 下的fimIntegrationTest.cpp面向 FIM(文件完整性监控)场景做端到端数据库验证,同样受UNIT_TEST开关控制;
  • 冒烟测试:smokeTests 通过 DBSync 测试工具(testtool)驱动整个库的公开 API,按InsertionUpdateDeleteSelectsnapshotsUpdatetriggerActionstxnOperation等场景组织 JSON 输入与预期结果,用于验证核心链路未回归。

下图展示了测试工具的总体架构(图片来源 dbsyncTestToolArchDiagram.png):

测试工具本身位于 testtool,由main.cppaction.hcmdArgsHelper.hfactoryAction.htestContext.hinput/下的一系列 JSON 场景文件组成,为冒烟测试提供了统一的命令行入口。

七、常见问题与排查要点

  1. 目录路径不一致:原文档写的是wazuh/src/dbsync/,在当前仓库中应按src/shared_modules/dbsync/执行构建,其余步骤不变。
  2. make deps资源缺失:若RESOURCES_URL指定的本地目录缺少预编译依赖,构建会在链接阶段报cannot find -lsqlite3-lgtest之类的错误,请确认external/下依赖完整。
  3. CMake 版本过低cmake_minimum_required(VERSION 3.12.4)会直接拒绝低于 3.12 的 CMake,请先升级。
  4. 找不到测试二进制:确认-DUNIT_TEST=ON已传入;只有该选项打开时add_subdirectory(tests)才会生效,bin目录下才会出现四个测试程序。
  5. 覆盖率数据:Debug + 测试模式下已自动附加--coverage,可用 gcov/lcov 分析各测试目标对src/sqlite/src/源码的覆盖情况,辅助补充用例。

结语

DBSync 的单元测试体系以 GoogleTest/GoogleMock 为底座,通过工程级TEST=1与模块级-DUNIT_TEST=ON两级开关接入构建,形成 sqlite 封装层、接口层、管线工厂、引擎层四个层次的测试目标。掌握本文的编译命令(make depsmake TARGET=server|agent TEST=1cmake -DEXTERNAL_LIB=... -DUNIT_TEST=ONcmake --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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询