跳转到主要内容

用于编写pytest多主机测试的实用工具

项目描述

pytest插件,用于多主机测试。

下载

发行版归档文件将通过Pagure发行版提供下载

https://pagure.io/releases/python-pytest-multihost/

目标是将其项目包含在Fedora仓库中。在此之前,您可以使用COPR的测试构建 – 请参阅下面的“开发人员链接”。

您也可以使用pip进行安装

https://pypi.python.org/pypi/pytest-multihost

用法

此插件接受您的基础设施描述,并通过一个 fixture 提供 Host 对象,可以在其上调用命令。

它旨在作为框架的通用基础;任何使用它的项目都需要根据其自身需求进行扩展。

提供给测试的对象是一个 Config 对象,它具有(包括其他)以下属性

test_dir – directory to store test-specific data in,
           defaults to /root/multihost_tests
ipv6 – true if connecting via IPv6

domains – the list of domains

要运行的宿主机按域排列,域具有

name – the DNS name of the domain
type – a string specifying the type of the domain ('default' by default)

config – the Config this domain is part of
hosts – list of hosts in this domain

并且宿主机有

role – type of this host; should encode the OS and installed packages
hostname – fully qualified hostname, usually reachable from other hosts
shortname – first component of hostname
external_hostname – hostname used to connect to this host
ip – IP address

domain – the Domain this host is part of

transport – allows operations like uploading and downloading files
run_command() – runs the given command on the host

对于每个对象——配置、域、主机——都可以提供子类来修改行为(例如,FreeIPA会添加主机方法来运行LDAP查询或安装IPA服务器)。每个对象都有from_dict和to_dict方法,可以添加额外的属性——例如,Config.ntp_server。

要在测试中使用多主机插件,创建一个列出域和所需主机角色的数量列表的测试用例。

import pytest
from pytest_multihost import make_multihost_fixture

@pytest.fixture(scope='class')
def multihost(request):
    mh = make_multihost_fixture(
        request,
        descriptions=[
            {
                'type': 'ipa',
                'hosts': {
                    'master': 1,
                    'replica': 2,
                },
            },
        ],
    )
    return mh

如果可用的主机不足,将跳过使用测试用例的所有测试。

从make_multihost_fixture返回的对象只有“config”属性。预期用户添加方便的属性。例如,FreeIPA通常使用一个域名,一个主服务器,几个副本和一些客户端,会这样做:

from pytest_multihost import make_multihost_fixture

@pytest.fixture(scope='class')
def multihost(request):
    mh = make_multihost_fixture(request, descriptions=[
            {
                'type': 'ipa',
                'hosts': {
                    'master': 1,
                    'replica': 1,
                    'client': 1,
                },
            },
        ],
    )

    # Set convenience attributes
    mh.domain = mh.config.domains[0]
    [mh.master] = mh.domain.hosts_by_role('master')
    mh.replicas = mh.domain.hosts_by_role('replica')
    mh.clients = mh.domain.hosts_by_role('client')

    # IPA-specific initialization/teardown of the hosts
    request.cls().install(mh)
    request.addfinalizer(lambda: request.cls().uninstall(mh))

    # Return the fixture
    return mh

与任何pytest测试用例一样,这可以通过将函数参数来使用。以下是一个简化的示例,FreeIPA的使用可能如下所示:

class TestMultihost(object):
    def install(self, multihost):
        multihost.master.run_command(['ipa-server-install'])

    def uninstall(self, multihost):
        multihost.master.run_command(['ipa-server-install', '--uninstall'])

    def test_installed(self, multihost):
        multihost.master.run_command(['ipa', 'ping'])

基础设施的描述由JSON或YAML文件提供,该文件在pytest命令行上命名。例如:

ssh_key_filename: ~/.ssh/id_rsa
domains:
  - name: adomain.test
    type: test-a
    hosts:
      - name: master
        ip: 192.0.2.1
        role: master
      - name: replica1
        ip: 192.0.2.2
        role: replica
      - name: replica2
        ip: 192.0.2.3
        role: replica
        external_hostname: r2.adomain.test
      - name: client1
        ip: 192.0.2.4
        role: client
      - name: extra
        ip: 192.0.2.6
        role: extrarole
  - name: bdomain.test
    type: test-b
    hosts:
      - name: master.bdomain.test
        ip='192.0.2.65
        role: master

$ py.test –multihost-config=/path/to/configfile.yaml

要使用YAML文件,需要PyYAML包。没有它,只能使用JSON文件。

编码和字节/文本

在写入文件或发出命令时,字节字符串会保持不变,而文本字符串(Python 2中的unicode)将使用可配置的编码(默认为utf-8)进行编码。

在读取文件时,默认返回字节字符串,但可以给出编码以获取测试字符串。

对于命令输出,提供了独立的stdout_bytes和stdout_text属性。后者使用可配置的编码(默认为utf-8)。

贡献

项目乐于接受补丁!请将任何补丁作为项目Pagure仓库的拉取请求。所有开发讨论应在Pagure拉取请求和问题中进行。

项目详细信息


下载文件

下载适合您的平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

pytest-multihost-3.4.tar.gz (18.3 kB 查看散列)

上传时间 源代码

支持