Python - unittest Mock
Language/Python

Python - unittest Mock

뉴비뉴 2020. 2. 20.

파이썬 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

댓글

💲 추천 글