注意
本文档适用于 Ceph 的开发版本。
测试 - 单元测试
Ceph GitHub 存储库有两种类型的测试:单元测试(也称为 make check 测试)和集成测试。严格来说,make check 测试不是“单元测试”,而是在从源代码编译 Ceph 后,可以在单个构建机器上轻松运行的测试,而集成测试需要包安装和多机器集群才能运行。
“make check” 是什么意思?
编译 Ceph 后,代码可以通过一系列测试运行。出于历史原因,这通常被称为 make check,尽管现在用于运行测试的实际命令是 ctest。要包含在这组测试中,测试必须
绑定与其他测试不冲突的端口
不需要 root 访问权限
不需要多于一台机器运行
在几分钟内完成
为简单起见,这类测试被称为“make check tests”或“单元测试”。这是为了将这些测试与通过 teuthology 框架运行的更复杂的“集成测试”区分开来。
虽然可以直接运行 ctest,但正确设置环境可能会很棘手。幸运的是,有一个脚本可以让你轻松地对代码运行单元测试。通过在 Ceph 源代码树的顶层目录中调用以下命令即可运行此脚本
./run-make-check.sh
在 x86_64 架构上,此命令需要至少 8GB RAM 和 32GB 可用驱动器空间才能成功完成;其他架构可能有不同的要求。根据你的硬件,可能需要二十分钟到三个小时才能完成。
单元测试如何声明
单元测试在 CMakeLists.txt 文件中声明,该文件位于 ./src 目录中。使用 add_ceph_test 和 add_ceph_unittest CMake 函数来声明单元测试。add_ceph_test 和 add_ceph_unittest 本身定义在 ./cmake/modules/AddCephTest.cmake 中。
有些单元测试是脚本,其他单元测试是在构建过程中编译的二进制文件。
add_ceph_test函数 - 用于声明单元测试脚本add_ceph_unittest函数 - 用于单元测试二进制文件
CLI 工具的单元测试
一些 CLI 工具使用以扩展名 .t 结尾并存储在 ./src/test/cli 下的特殊文件进行测试。这些测试使用一个名为 cram 的工具,通过一个名为 ./src/test/run-cli-tests 的 shell 脚本运行。不适合 make check 的 cram 测试也可以使用 cram 任务通过 teuthology 运行。
基于 Tox 的 Python 模块测试
Ceph 中的一些 Python 模块使用 tox 来运行它们的单元测试。
这些 Python 模块中的大多数可以在 ./src/pybind/ 目录中找到。
目前(2020 年 12 月)以下模块使用 tox
Cephadm (
./src/cephadm/tox.ini)Ceph Manager Python API (
./src/pybind/mgr)./src/pybind/mgr/tox.ini./src/pybind/mgr/dashboard/tox.ini./src/pybind/tox.ini
Dashboard (
./src/pybind/mgr/dashboard)Python common (
./src/python-common/tox.ini)CephFS (
./src/tools/cephfs/tox.ini)ceph-volume
./src/ceph-volume/tox.ini./src/ceph-volume/plugin/zfs/tox.ini./src/ceph-volume/ceph_volume/tests/functional/batch/tox.ini./src/ceph-volume/ceph_volume/tests/functional/simple/tox.ini./src/ceph-volume/ceph_volume/tests/functional/lvm/tox.ini
配置 Tox 环境和任务
大多数 tox 配置支持多个环境和任务。
支持的环境和任务列表位于 tox.ini 文件中,在 envlist 下。例如,以下是 ./src/cephadm/tox.ini 的前三行
[tox]
envlist = py3, mypy
skipsdist=true
在此示例中,指定了 Python 3 和 mypy 环境。
可以使用以下命令检索环境列表
tox --list
或者
tox -l
运行 Tox
要运行 tox,只需在包含 tox.ini 的目录中执行 tox。如果你没有指定任何环境(例如 -e $env1,$env2),则 tox 将运行所有环境。Jenkins 将通过执行 ./src/script/run_tox.sh 来运行 tox。
以下是一些来自 Ceph Dashboard 的示例,展示了如何指定不同的环境和运行选项
## Run Python 2+3 tests+lint commands:
$ tox -e py27,py3,lint,check
## Run Python 3 tests+lint commands:
$ tox -e py3,lint,check
## To run it as Jenkins would:
$ ../../../script/run_tox.sh --tox-env py3,lint,check
Manager core 单元测试
目前仅运行 mgr_util.py 中的 doctests。
要在 manager core 中添加更多文件进行测试,请打开 tox.ini 文件并将要测试的文件添加到包含 mgr_util.py 的行末尾。
单元测试注意事项
与各种 Ceph 守护进程和
ceph-fuse不同,单元测试链接到默认内存分配器 (glibc),除非它们被明确链接到其他东西。这使得像 valgrind 这样的工具可以在测试中使用。Google Test 单元测试库会隐藏 shell 中的客户端输出。为了在设置所需的调试级别(例如
ceph config set client debug_rbd 20)后调试客户端,调试日志文件可以在build/out/client.admin.<pid>.log找到。这在检查 teuthology 失败的单元测试作业时也很有用,作业的调试级别可以在相关的 yaml 文件中设置。