注意

本文档适用于 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_testadd_ceph_unittest CMake 函数来声明单元测试。add_ceph_testadd_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 checkcram 测试也可以使用 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 3mypy 环境。

可以使用以下命令检索环境列表

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 的行末尾。

单元测试注意事项

  1. 与各种 Ceph 守护进程和 ceph-fuse 不同,单元测试链接到默认内存分配器 (glibc),除非它们被明确链接到其他东西。这使得像 valgrind 这样的工具可以在测试中使用。

  2. Google Test 单元测试库会隐藏 shell 中的客户端输出。为了在设置所需的调试级别(例如 ceph config set client debug_rbd 20)后调试客户端,调试日志文件可以在 build/out/client.admin.<pid>.log 找到。这在检查 teuthology 失败的单元测试作业时也很有用,作业的调试级别可以在相关的 yaml 文件中设置。

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入