파이썬 Mock 이란
TDD 에서 구현할 수 없는 데이터나 그 외 실제로 반영이 되면 안되는 것들을
가짜로 생성하여 테스트를 진행하는 것 입니다.
예를 들어 os.remove로 파일삭제하는 테스트를 구현했다고 하였을 때
따로 TastCase의 SetUp, tearDown 사용하지 않을 시 실제 파일이 삭제된다고 가정을 해보겠습니다.
테스트를 배포할 때 마다 진행하는데 첫 번째 테스트 때 A라는 파일이 삭제되었고,
그 이후에 진행되는 테스트에서는 A라는 파일이 없기 때문에 테스트 결과가 제대로 나오지 않을 것 입니다.
아래 코드를 보면 알 수 있듯이 Car 클래스의 name 은 'i30'이 리턴되어야 하지만
mock의 MagicMock을 사용할 경우 내가 원하는 데이터를 지정(return_value='K5') 하였기 때문에
함수를 찍어보면 반환되는 데이터가 변경된 것을 확인할 수 있다.
from unittest.mock import MagicMock
class Car:
def name(self):
return 'i30'
c = Car()
c.name()
'i30'
c.name = MagicMock(return_value='k5')
c.name()
'k5'
@mock.patch('module path')
[!] 모듈이 A라는 모듈이 B에서 import 되어 사용되고 있다면 B의 path를 입력하여 가져와야 합니다.
@mock.patch('app.SendEmail.send')
def mail_send(self, mock_email):
mock_email.retrun_value(True)
app.SendEmail.send의 return을 이 테스트코드 안에서는 True로 명시하고 싶을 때 사용한다.
import os
def rm(filename):
os.remove(filename)
=======================================================
from mymodule import rm
import mock
import unittest
class RmTestCase(unittest.TestCase):
@mock.patch('mymodule.os')
def test_rm(self, mock_os):
rm("any path")
# test that rm called os.remove with the right parameters
mock_os.remove.assert_called_with("any path")
참조
https://www.toptal.com/python/an-introduction-to-mocking-in-python
'Language > Python' 카테고리의 다른 글
Python 비동기 - Celery, Dramatiq (0) | 2020.03.05 |
---|---|
swagger @method_decorator, @swagger_auto_schema (0) | 2020.02.25 |
F(name), annotate(), TruncMonth() , Counter().most_common(), isinstance(objects, class) (0) | 2020.02.10 |
쿠키 / 세션이란 (0) | 2020.01.31 |
Python - Dict student['Key'] vs student.get('Key') (0) | 2020.01.11 |
댓글