0

데이터베이스를 조롱하여 다음 방법을 테스트하기 위해 단위 테스트 케이스를 작성하려고합니다. 실제 데이터베이스 서버에 실제로 연결하지 않고 데이터베이스 연결을 조롱하는 방법. 나는 샘플 테스트 케이스를 시도했다. 그것이 올바른 방법인지 확실하지 않습니다. 내가 틀렸다면 나를 바로 잡아주세요.어떻게 단위 테스트 파이썬에서 데이터베이스 연결 pymysql?

//MySQL.py 
    class MySQL(): 

     retry_interval = 20000 

     def link(self, server,port): 
      try: 
       return pymysql.connect(server, username='name', passwd='pwd', db='demo', int(port)) 
       sys.stdout.write('Connected to database at {}:{}\n'.format(server,port)) 
      except: 
       sys.stderr.write('Retry database connection in {} ms...\n'.format(self.retry_interval)) 
       sleep(self.retry_interval/1000.0) 
       continue 

//test.py 
from unittest.mock import Mock, MagicMock 
from unittest.mock import patch 
import MySQL 

    @patch('MySQL.pymysql') 
    def testLink(self, mysql_mock): 
     mock_cursor = Mock.MagicMock() 
     mysql_mock.connect.return_value.cursor.return_value.__enter__.return_value = mock_cursor 
+0

한계를 어디에 * 당신 *의 가장자리 코드에 도달했습니다. 귀하의 경우'pymysql.connect'는 unittest의 범위 밖에 있으며 조롱을 받아야합니다. 모의이 제대로 호출되면 테스트해야합니다. –

+0

@KlausD. 괜찮 감사. 시도해 보겠습니다 – Mythri

답변

1

유일한 유용한 것은 당신은뿐만 아니라 직접 그 패치를 할 수 있도록 당신이 정말로 MySQL.pymysql의 테스트는 connect 방법입니다 수 있습니다하십시오 유닛 테스트 끝의

//test.py 
from unittest.mock import Mock, MagicMock 
from unittest.mock import patch, call 
import MySQL 

@patch('MySQL.pymysql.connect') 
def testLink(self, connect_mock): 
    # You can configure a return value for the connection if you need to... 
    connect_mock.return_value = MagicMock(name='connection_return', return_value=...) 

    # You can now test that your connection is being called... 
    self.assertEqual(1, connect_mock.call_count) 

    # You can also check the call parameters... 
    self.assertEqual(connect_mock.call_args_list[0], call(server, username='name', passwd='pwd',...)) 
+0

도와 주셔서 감사합니다. 나는 예제 코드에서와 같은 방법을 시도했다. 그러나 나는 "pymysql.connect"함수 또는 "link"함수를 조롱해야한다면 혼란 스럽다. – Mythri

+0

@patch ('MySQL.pymysql.connect') 사용되지 않은 가져 오기를 제공하고 SyntaxError : 키워드 뒤에 arg가 아닌 키워드 arg – Mythri

+0

안녕하세요. 나는 당신이 준 코드를 테스트하기 위해'link' 함수를 조롱 할 필요가 없다고 생각한다. 'pymysql.connect' 함수를 조롱하면 조롱 된 연결 객체를 반환하는'link' 함수가 _call_ 테스트 될 것입니다. – DatHydroGuy