[파이썬] unittest side_effect 사용법

When writing unit tests in Python, the unittest module provides a powerful tool called side_effect which allows you to define custom behaviors for your test cases. This can be particularly useful when you need to simulate certain conditions or control the return value of a function during testing. In this blog post, we will explore how to use side_effect in Python’s unittest framework.

The side_effect attribute

The side_effect attribute is a special attribute that can be assigned to a test case or a test method. It allows you to define a callable or an iterable object which replaces the original behavior of a function or method under test.

Example Usage

Let’s consider a simple example to demonstrate how side_effect can be used. Suppose we have a class Calculator with a method add that adds two numbers and returns the result. We want to test a scenario where the add method should raise an exception when one of the arguments is a string.

class Calculator:
    def add(self, a, b):
        if isinstance(a, str) or isinstance(b, str):
            raise ValueError("Invalid operands")
        return a + b

To test this behavior, we can use side_effect in our unit test. Here’s an example:

import unittest

class CalculatorTestCase(unittest.TestCase):
    def test_add_with_string_operand(self):
        calculator = Calculator()
        calculator.add = unittest.mock.Mock(side_effect=ValueError("Invalid operands"))
        
        with self.assertRaises(ValueError):
            calculator.add(10, "5")

In this example, we override the add method of the Calculator class by creating a unittest.mock.Mock object with side_effect assigned to it. We pass the ValueError("Invalid operands") object as the side effect. This means that whenever the add method is called with a string operand, it will raise a ValueError with the message “Invalid operands”.

The assertRaises context manager is used to verify that the ValueError exception is raised when calling calculator.add(10, "5").

Conclusion

The side_effect attribute in Python’s unittest framework provides a powerful way to customize the behavior of functions and methods during unit testing. By using side_effect, you can simulate specific conditions, control return values, and raise exceptions as needed. This can greatly enhance the flexibility and effectiveness of your test cases.

In this blog post, we explored an example of how to use side_effect to test a scenario where an exception is raised. However, there are many other use cases for side_effect, such as mocking external dependencies or handling complex test scenarios.

Remember to use side_effect responsibly and only when necessary, as it can make your tests more complex and harder to maintain. Nonetheless, when used correctly, side_effect can be a valuable tool in your unit testing arsenal.