본문 바로가기
Python

Python - Mocking/단위 테스트(Unit Test) 과 Django 활용

by 올엠 2024. 3. 25.
반응형

Mocking?

개발한 코드는 실제 서비스를 제공하기 전에 정상적으로 동작하는지 테스트가 필요하다.

또 서비스중인 시스템에 추가적인 기능 개발이 들어간다면, 테스트를 진행해야 하는데, 실제 서비스를 진행하고 있을 때 테스트를 한다거나, 환경이 다른 네트워크 데이터 베이스 유저등을 수정해야한다면, 개발한 내용에 대한 테스트가 어려울 수 있다.

이렇게 다양한 환경이나 서비스등의 영향이 발생할 수 있는 상황에서 개발된 기능을 테스트하는데 어려움이 있을 수 있기 때문에 이를 돕기 위해 등장한 개념이 바로 가짜 객체(Mock Object)를 만들어 테스트하는 것을 Mocking라 할 수 있다.

단위 테스트 출처: 전자 정부

 

Mocking은 다음과 같은 문제에 도움을 준다.

Mocking이 필요한 경우 위험요소나 복잡도가 높은 경우 매우 효과적이다.
-환경적 문제 해결: 구성해야하는 데이터베이스, 네트워크등 환경이 많은 경우
-의존성 문제 해결: 라이브러리, API등 데이터 사용및 수정이 어려운 경우
-시간적 문제 해결: 테스트 시간이 오래걸리는 경우
 
예를 들어 만약 본인이 사용자에게 가입시 추가 액션을 진행하는 기능을 개발했다면 단위 테스트를 하기 위해 실제 사용자를 사용할 수 는 없기 때문에 Mock Object를 통해 쉽게 가짜 데이터로 테스트를 할 수 있다.
 
단 Mocking를 사용할 때 유념해야 할 부분은 Mock가 꼭 필요한지 체크하자. Mock 역시 하나의 환경을 구성하는 것이기 때문에 이 역시 하나의 작업을 늘어날 수 있다. 특히 Mock로 테스트하였다고 하더라도 올바른 결과을 구성하기 위해서는 Mocking를 잘 구성해야 하기 때문에 난이도가 높아질 수 있다.
 
그리고 Mocking은 가짜 데이터 이기 때문에 오류가 발생할 수 있는 예외 상황이 있을 수 있다는 점도 유념하도록 하자.

Python기준의 Mocking 활용

Python 기준으로 아래와 같은 라이브러리로 Mocking 테스트를 진행할 수 있다.
unittest.mock
django.test

 

 
여기에서는 django 기준으로 test 방안에 대해서 설명해보도록 하겠다.
먼저 django.test 라이브러리를 사용하기 위해서는 아래 조건을 기억하는 것이 좋다.

1. 파일로 생성한다면, tests.py 여러 파일로 나누어서 테스트가 필요한 경우 tests 폴더명으로 생성한다.

(폴더를 생성했다면, init.py 파일도 필요함)
 

2 .django에서 테스트를 진행하기 위해서는 파일이름이나 테스트 함수 이름이 test로 시작해야 한다.

예제 코드는 다음과 같다.
#sum.py 에 생성된 함수
def sum():
return 1+2


#tests.py에 생성된 테스트 코드
from django.test import SimpleTestCase
import sum

class SumTests(SimpleTestCase):

    def test_sum(self):
        res = sum.sum()
        
        self.assertEqual(res, 3)
test 모듈을 통해 테스트 해야하는 함수를 호출하고 결과가 맞는지, 이때 assertEqual 를 사용한다. 
 
 
마치며
 
Mocking과 함께 위험요소나 복잡도가 낮추는 방법도 고민하기 바란다.
반응형