Pytest smoke testing
Contents
It’s a good practice to test that some prerequisites are met before going further. This practice is sometimes called Smoke testing. When you have to setup an infrastructure either on a host or in docker images. In this case Pytest + testinfra is a terrific combo to perform this kind of testing.
A simple example
In a few lines of code you can easily test that some commands are working.
import logging
import pytest
from testinfra import host
logger = logging.getLogger(__name__)
cases = [
("Dumb", "echo 'dumb'"),
("Golang", "go version"),
("Python", "python --version"),
("Node", "node --version"),
("Failed", "Failed")
]
@pytest.mark.parametrize("name,command", cases, ids=[case[0] for case in cases])
def test_command(host, name, command):
out = host.check_output(command)
# Can use out to print the result of the command or to make something more clever
logger.info(f"{name} [ OK ]")
Running this test will check that the commands run successfully.
$ pytest smoke_tests.py
=========== short test summary info ===========
FAILED smoke_tests.py::test_command[local-Failed] - AssertionError: Unexpected exit code 127 for CommandResult(command=b'Failed', exit_status=127, stdout=None, stderr=b'/bin/sh: Failed: command not found\n')
PASSED smoke_tests.py::test_command[local-Dumb]
PASSED smoke_tests.py::test_command[local-Golang]
PASSED smoke_tests.py::test_command[local-Python]
PASSED smoke_tests.py::test_command[local-Node]
=========== 1 failed, 4 passed in 0.22s ===========
Going further
It’s only a simple example however it is interesting since it’s reproducible and will do the tedious work for you. Beyond this simple example this smoke test can