注意

本文档适用于 Ceph 开发版本。

测试 - 单元测试

Ceph GitHub 存储库有两种类型的测试:单元测试(也称为make check测试)和集成测试。严格来说,集成测试并不是“单元测试”,而是编译 Ceph 源代码后可以在单个构建机器上轻松运行的测试,而集成测试需要安装软件包和多机集群才能运行。make check tests are not “unit tests”, but rather tests that can be run easily on a single build machine after compiling Ceph from source, whereas integration tests require package installation and multi-machine clusters to run.

“make check” 是什么意思?

编译 Ceph 后,代码可以通过一系列测试运行。由于历史原因,这通常被称为make check,尽管实际用于运行测试的命令现在是ctest。要包含在这组测试中,测试必须:

  • 绑定与其他测试不冲突的端口

  • 不需要 root 权限

  • 不需要一台以上的机器来运行

  • 几分钟内完成

为了简单起见,这类测试被称为“make check 测试”或“单元测试”。这是为了区别于通过teuthology 框架运行的更复杂的“集成测试”.

虽然可以直接运行ctest,但正确设置环境可能很棘手。幸运的是,有一个脚本可以轻松地在你的代码上运行单元测试。该脚本可以通过在 Ceph 源代码树的顶层目录中调用以下命令来运行:

./run-make-check.sh

要成功完成此命令,在 x86_64 架构上,您至少需要 8GB 的 RAM 和 32GB 的可用磁盘空间;其他架构可能有不同的要求。根据您的硬件配置,完成时间可能从二十分钟到三小时不等。

如何声明单元测试

单元测试在CMakeLists.txt文件中声明,该文件位于./src目录中添加一个 Ceph 条目。可以使用add_ceph_testadd_ceph_unittestCMakeadd_ceph_testadd_ceph_unittest它们本身在./cmake/modules/AddCephTest.cmake.

中定义。

  • add_ceph_testfunction - 用于声明单元测试脚本

  • add_ceph_unittestfunction - 用于单元测试二进制文件

命令行工具的单元测试

一些命令行工具使用以.t扩展名结尾的特殊文件进行测试,这些文件存储在./src/test/cli下。这些测试使用名为cram via a shell script called ./src/test/run-cli-tests. cram不适合make check的测试也可以通过cram 任务使用 teuthology 运行。.

基于 Tox 的 Python 模块测试

Ceph 中的一些 Python 模块使用tox来运行它们的单元测试。

这些 Python 模块大多位于./src/pybind/.

目录中。tox:

  • Cephadm (./src/cephadm/tox.ini)

  • Ceph 管理器 Python API (./src/pybind/mgr)

    • ./src/pybind/mgr/tox.ini

    • ./src/pybind/mgr/dashboard/tox.ini

    • ./src/pybind/tox.ini

  • 仪表板 (./src/pybind/mgr/dashboard)

  • Python 常用 (./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。如果您未指定任何环境(例如,tox.ini的目录中执行-e $env1,$env2),则tox将运行所有环境。Jenkins 将通过执行tox这里有一些来自 Ceph 仪表板的示例,展示了如何指定不同的环境和运行选项:./src/script/run_tox.sh.

运行

## 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

管理器核心单元测试

目前只运行doctests inside mgr_util.py

要在管理器核心中添加更多要测试的文件,请打开tox.ini文件,并将要测试的文件添加到包含mgr_util.py.

单元测试注意事项

  1. 与各种 Ceph 守护进程和ceph-fuse不同,除非明确链接到其他内容,否则单元测试会链接到默认的内存分配器(glibc)。这使工具如valgrind能够在测试中使用。

  2. Google Test 单元测试库会隐藏客户端输出。为了在设置所需的调试级别(例如ceph config set client debug_rbd 20)后调试客户端,调试日志文件可以在build/out/client.admin.<pid>.log找到。

由 Ceph 基金会带给您

Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.