测试

实际的测试是用 Python 方法编写的,这些方法接受可选的 fixture(夹具)。这些 fixture 附带了有趣的属性,有助于进行远程断言。

Conventions 中所述,测试需要放入 tests/functional/tests/ 中。这些测试会被收集并映射到特定的节点类型,或者映射为在所有节点上运行。

使用简单的 Python 断言(这些测试不需要遵循 Python unittest.TestCase 基类),这使得更容易理解故障和错误。

测试运行由 py.test 以及 testinfra 处理,用于处理远程执行。

测试文件

测试 Fixture

测试 fixture 是 py.test 的一个强大功能,大多数测试都依赖它来进行远程节点断言。要在测试方法中请求它们,只需将其作为参数即可。

Fixture 是按名称检测的,因此只要使用的参数名称相同,fixture 就会被传入(有关更深入的示例,请参阅 pytest fixtures)。接下来的代码展示了一个将使用 node fixture 的测试方法,该 fixture 包含有关 Ceph 集群中节点的有用信息

def test_ceph_conf(self, node):
    assert node['conf_path'] == "/etc/ceph/ceph.conf"

该测试很简单(配置路径可能在远程不存在),但它解释了“请求”fixture 是多么简单。

对于远程执行,我们可以进一步依赖其他 fixture(测试可以根据需要拥有任意数量的 fixture),例如 File

def test_ceph_config_has_inital_members_line(self, node, File):
    assert File(node["conf_path"]).contains("^mon initial members = .*$")

node fixture

node fixture 包含有关正在执行测试的节点的几个有用信息,这些信息在测试运行前被捕获一次

  • addresseth1 接口的 IP 地址

  • subnetaddress 所属的子网

  • vars:为当前运行设置的所有 Ansible 变量

  • osd_ids:所有 OSD ID 的列表

  • num_mons:当前环境的监视器总数

  • num_devices:当前节点的设备数量

  • num_osd_hosts:OSD 主机总数

  • total_osds:当前节点上的 OSD 总数

  • cluster_name:Ceph 集群的名称(默认为 'ceph')

  • conf_path:由于集群名称可以更改 Ceph 配置的文件路径,因此它会根据集群名称进行设置。

  • cluster_address:用于集群通信的地址。所有环境都设置了 2 个接口,其中 1 个专用于集群

  • docker:一个布尔值,用于标识 Ceph Docker 集群

  • osds:OSD ID 列表,除非是 Docker 集群,它会获取设备的名称(例如 sda1

其他 Fixture

testinfrapy.test 提供了许多其他 fixture。 testinfra fixture 的完整列表可在 testinfra_fixtures 中找到

py.test 内置 fixture 可以使用 pytest -q --fixtures 列出,并在 pytest builtin fixtures 中进行了描述