测试¶
实际的测试是用 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 包含有关正在执行测试的节点的几个有用信息,这些信息在测试运行前被捕获一次
address:eth1接口的 IP 地址subnet:address所属的子网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¶
testinfra 和 py.test 提供了许多其他 fixture。 testinfra fixture 的完整列表可在 testinfra_fixtures 中找到
py.test 内置 fixture 可以使用 pytest -q --fixtures 列出,并在 pytest builtin fixtures 中进行了描述