Search code examples
python-3.xpytestf-string

Pytest checking messages returned by errors


Something about the interaction between pytest, str() and python Error types breaks full error testing where we want to confirm the EXACT TEXT returned by the error.

Example below:

def erroring_func(name, required_item_list):
   # skip boring bit. Just throw an error.
   raise KeyError(f'{name} is missing required item(s): {required_item_list')

def test_erroring_func():
    with pytest.raises(KeyError) as err:
        name = 'This dataframe'
        required_item_list = ['a column']
        _ = erroring_func(name, required_item_list)
    assert str(err.value) == f"{name} is missing required item(s): {required_item_list}"

This looks sensible, but will return the error:

assert '"This dataframe is missing required item(s): [\'lat\']"' == "This dataframe is missing required item(s): ['lat']

Somehow, str(err.value) creates single backslashes in the output that are EXTREMELY difficult to recreate in an f-string (actually impossible) or to insert in a string once created.


Solution

  • You can completely solve by matching how KeyError alters text. This can be done with an f-string with single quotes and then double quotes f'"your text {here}"'

    assert str(err.value) == f'"{name} is missing required item(s): {required_item_list}"'
    

    (With thanks to Anthony Sotile)