问题描述
正在寻找一种平台,可以对多个紧密耦合的系统进行测试。他们使用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本身来运行测试,这样您就可以完全控制执行顺序,但通常会“失败快”而不是“失败最后”(执行会在第一个失败时停止,而不是继续并显示所有测试失败)。
以上是两种解决方案,您可以根据自己的需求选择适合您的方法。
希望对您有所帮助!