Pytest Testing Idioms: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
Line 49: Line 49:
     """setup any state tied to the execution of the given function.
     """setup any state tied to the execution of the given function.
     Invoked for every test function in the module.
     Invoked for every test function in the module.
    'function' is optional.
     """
     """
     Path(Path(__file__).parent, './data/tmp').mkdir()
     Path(Path(__file__).parent, './data/tmp').mkdir()
Line 56: Line 58:
     """teardown any state that was previously setup with a setup_function
     """teardown any state that was previously setup with a setup_function
     call.
     call.
    'function' is optional.
     """
     """
     shutil.rmtree(str(Path(Path(__file__).parent, './data/tmp/')))
     shutil.rmtree(str(Path(Path(__file__).parent, './data/tmp/')))
</syntaxhighlight>
</syntaxhighlight>

Revision as of 23:33, 19 July 2022

External

Internal

Overview

Test files start with test_ (?) A function that starts with test is automatically considered a test to be executed. A function that does NOT start with test is ignored as test, so if one tries to specifically execute it, they get:

ERROR: not found: /Users/ovidiu/src/.../test_template.py::null_template_variables

A test function can be injected with a test fixture: Available fixtures: cache, capfd, capfdbinary, caplog, capsys, capsysbinary, doctest_namespace, monkeypatch, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory.

Tested Code is Supposed to Throw Exception

import pytest

def test_something_that_should_throw_exception():
    with pytest.raises(Exception) as info:
        my_method()

If the tested code raises a more specific exception, you can use that instead:

def test_something_that_should_throw_exception():
    with pytest.raises(ValueError) as info:
        my_method()

This tests the exception arguments. ⚠️ In this case, it is very import to place the assert statements outside the with block, otherwise they will be silently ignored.

def test_something_that_should_throw_exception():
    with pytest.raises(ValueError) as info:
        my_method()
    # important: interaction with 'info' must take place outside the with block
    assert info.value.args[0] == "some message"
    assert "some message" in str(info.value)

Also see:

Python Language | Exceptions

xunit-Style Setup

https://docs.pytest.org/en/7.1.x/how-to/xunit_setup.html
def setup_function(function):
    """setup any state tied to the execution of the given function.
    Invoked for every test function in the module.

    'function' is optional.
    """
    Path(Path(__file__).parent, './data/tmp').mkdir()


def teardown_function(function):
    """teardown any state that was previously setup with a setup_function
    call.

    'function' is optional.
    """
    shutil.rmtree(str(Path(Path(__file__).parent, './data/tmp/')))