[파이썬] pytest monkeypatch 활용하기

In the world of Python, testing is an essential part of the development process. With pytest, a popular testing framework, you can write clean and organized tests for your code. One powerful pytest feature is the monkeypatch module. It allows you to modify or “patch” objects or behaviors during test execution, making it easier to test edge cases or simulate different scenarios.

Installation

To use pytest monkeypatch, you first need to install pytest. You can use pip to install it:

$ pip install pytest

Basic Usage

The basic usage of pytest monkeypatch involves monkeypatching attributes and functions. Let’s look at both cases.

Monkeypatching Attributes

Suppose we have a class called Calculator and we want to test a method that depends on an external API response. We can use monkeypatch to replace the result of the API call with a known value.

class Calculator:
    def add(self, a, b):
        # ...
        result = get_api_result()  # Assume this method makes an API call
        # ...

def test_calculator_add(monkeypatch):
    calculator = Calculator()

    def mock_get_api_result():
        return 10

    monkeypatch.setattr(calculator, "get_api_result", mock_get_api_result)

    assert calculator.add(5, 5) == 10

In this example, we define a mock_get_api_result function that returns a fixed value of 10 (instead of calling the actual API). Then, we use the setattr method from the monkeypatch object to replace the get_api_result method in the Calculator class with our mock function. Finally, we can test the add method of the Calculator class, knowing that it will use our mocked API response.

Monkeypatching Functions

Sometimes, we may need to monkeypatch external functions used by our code. The process is quite similar:

def external_function(a, b):
    # ...
    return result

def test_my_function(monkeypatch):
    def mock_external_function(a, b):
        return a + b

    monkeypatch.setattr("package.module.external_function", mock_external_function)

    assert my_function(2, 3) == 5

In this example, we have an external function external_function that our my_function relies on. By using monkeypatch, we can replace the implementation of external_function with our own mock_external_function, which simply adds the two arguments. We can then test my_function and assert that it works as expected.

Conclusion

Pytest monkeypatch is a powerful tool that allows you to modify objects and behaviors during runtime, enabling you to write more comprehensive tests. It helps simulate different scenarios, handle external dependencies, and test edge cases with ease. By incorporating monkeypatch into your pytest tests, you can improve the quality and reliability of your code.

Note: When using monkeypatch, make sure to use it responsibly and only when necessary. Overuse or misuse of monkeypatching can lead to fragile and confusing tests.