Soma

pytest.fixture를 이용한 테스트

nagrang 2024. 6. 14. 11:33

클래스내에 있는 함수를 테스트하기로 했다. 이때 고민된 것은 테스트 함수를 실행할 때마다 클래스 인스턴스를 만드는 것이었다.

테스트 하려는 클래스는 생성자될 때 파싱해야 할 노드를 인자로 받는다. 그러면 매 테스트마다 다른 노드를 인자로 클래스를 만들어야 했다

 

이때 `fixture`를 사용하면 중복 코드를 줄이고 원하는 객체를 제공할 수 있다. 'pytest.fixture' 데코레이터를 작성하면 매 테스트 함수 호출 때마다 데코레이터를 붙인 함수를 실행한다. 이때 DB와 같은 클래스를 정의하거나 사전 준비 코드를 작성하면 테스트 함수마다 작성해야하는 코드 중복을 줄일 수 있다. 

@pytest.fixture
def call_parser(elem_manager):
    # CallParser 인스턴스를 생성하는 함수를 반환
    def _create_parser(node):
        return CallParser(node, elem_manager)
    return _create_parser

 

해당 데코레이레이터를 붙은 함수를 호출하는 방법은 테스트하려는 함수의 인자로 넣어주는 것이다. 테스트 함수인 test_get_func_name에서 call_parser를 인자로 받으면, pytest는 call_parser fixture를 호출하여 CallParser 인스턴스를 생성하는 함수를 반환한다. 이를 통해 테스트 함수내에서 call_parser를 호출하여 필요한 CallPaser 인스턴스를 생성할 수 있다.

def test_get_func_name(call_parser, node, expect):
    """
    ast.Call 노드가 주어졌을 때 함수 아이디를 제대로 가져오는지 테스트
    :param node: ast.Call 노드
    :param expect: 예상되는 함수 아이디
    :return: None
    """
    parser = call_parser(node)
    result = parser._CallParser__get_func_name()
    assert result == expect

 

 

 

이렇게 fixture를 사용하면, 각 테스트 케이스마다 새로운 CallParser 인스턴스를 생성할 수 있으므로, 테스트 간의 상호작용을 방지하고 각 테스트의 독립성을 보장할 수 있다.