如何对多个相互依赖的机器进行系统测试

67次阅读
没有评论

问题描述

正在寻找一种平台,可以对多个紧密耦合的系统进行测试。他们使用SaltStack将不同的产品部署到Red Hat系列的机器上,例如Rocky Linux、CentOS、Fedora和RHEL。目前,他们使用SaltStack在空白的虚拟机上进行回归测试,但是随着系统变得越来越复杂,他们需要进行更多的测试。用户希望能够测试整个集群,而不仅仅是单个系统。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

使用Testinfra和pytest测试框架,可以与远程主机进行交互并运行测试。
以下是一个简单的测试套件示例:

def test_mariadb_query(host):
    '''Connect to a remote host, run a SQL query using the `mariadb`
    CLI, record the result, and verify it matches our expectations.
    '''
    expected = "count\n15\n"
    res = host.run(
        '''mariadb example -e "select count from widgets where name='doodad'"'''
    )
    assert res.rc == 0
    assert res.stdout == expected

上述示例将在命令行上指定的任何主机上运行test_mariadb_query测试,例如:

pytest --hosts=ssh://root@node1

您还可以在测试文件中指定主机列表,而不是在命令行上指定:

import pytest
import testinfra

testinfra_hosts = ["ssh://root@node1"]

def test_mariadb_query(host):
    expected = "count\n15\n"
    res = host.run(
        '''mariadb example -e "select count from widgets where name='doodad'"'''
    )
    assert res.rc == 0
    assert res.stdout == expected

使用这种方法,您只需运行pytest命令,它将按照您的预期进行测试。

如果您有与特定主机交互的测试,可以为这些主机创建pytest fixtures:

import pytest
import testinfra

@pytest.fixture
def node1():
    return testinfra.get_host("ssh://root@node1")

def test_kernel_version(host):
    res = host.run("uname -r")
    assert res.stdout.startswith("5.17")

def test_mariadb_query(node1):
    expected = "count\n15\n"
    res = node1.run(
        '''mariadb example -e "select count from widgets where name='doodad'"'''
    )
    assert res.rc == 0
    assert res.stdout == expected

上述示例将在命令行上指定的所有主机上运行test_kernel_version测试,但是test_mariadb_query测试将仅针对主机node1运行,而不管命令行上的主机如何。

这种解决方案的缺点是它是建立在一个单元测试框架之上的;由于测试应该是独立的,所以没有内置的机制来按特定顺序运行它们。然而,有一些插件试图解决这个问题,例如pytest-order

如果您的顺序要求可以编写为设置/拆卸任务,那么pytest fixtures可能是一个可行的解决方案。

方案2

您可以使用Ansible本身来运行测试,这样您就可以完全控制执行顺序,但通常会“失败快”而不是“失败最后”(执行会在第一个失败时停止,而不是继续并显示所有测试失败)。

以上是两种解决方案,您可以根据自己的需求选择适合您的方法。

希望对您有所帮助!

正文完