How To Test

To test the code we use pytest.

Tests Structure

According to Anatomy of a test we use the Arrange, Act, Assert, (Cleanup) terminology for every test function or method.

Good Example

from pathlib import Path

def test_good() -> None:
    """
    Test something with good style.
    """

    # Arrange
    test_file = Path("testfile.txt")
    test_file.write_text("Hello")
    assert test_file.exists()

    # Act
    my_test_function(testfile)

    # Assert
    text = testfile.read_text()
    assert "Hello" in text

Bad Example

from pathlib import Path

def test_bad() -> None:
    """
    Test something with bad style.
    """
    test_file = Path("testfile.txt")
    test_file.write_text("Hello")
    assert test_file.exists()
    my_test_function(testfile)
    text = testfile.read_text()
    assert "Hello" in text

Static Data

If you need static data for your tests use the directory tests/data. There you can put your data. If you change existing data make sure you do not break other tests. Make sure to not add any kind of productive and sensitive data into this directory as it is pushed to the repository.

Temporary Data

For temporary data use the pytest TempPathFactory. See the following example on how to setup a temporary directory.

from pathlib import Path

import pytest

@pytest.fixture(scope="session")
def session_dir(tmp_path_factory: pytest.TempPathFactory) -> Path:
    """
    Creates and maintains a session temp directory.
    """

    return tmp_path_factory.mktemp("session_")

There is also the same for module or function scope depending on how long you wish your temp directory exists. These fixtures are predefined in tests/conftest.py so you can use it in any test function or method.

Mocking

For mocking we use the pytest predefined monkeypatch fixture.

Good Example

from unittest.mock import Mock

import pytest

def test_something_correct(monkeypatch: pytest.MonkeyPatch):
    """
    This tests something the preferred way.
    """

    monkeypatch.setattr("path.to.your.object", Mock(return_value=None))
    ...

Bad Example

from unittest.mock import Mock, patch

@patch("path.to.your.object", Mock(return_value=None))
def test_something_wrong():
    """
    This tests something the wrong way.
    """

    ...