2012-11-04 3 views
2

인증 된 RESTful API를위한 Python 래퍼를 작성하고 있습니다. 나는 지금 시험 스위트를 작성하고 있는데 (처음 테스트 작가이기도 함) 약간의 질문이있다.유닛 API 래퍼 테스트

1.a) 어떻게 전화를 걸 수 있겠지만 시험에 자격 증명을 하드 코딩 할 필요는 없다. 나는 기스 웁에 던질거야?

1.b) 나는 조롱에 대해 알고 있지만 그것에 대해 어떻게 생각하는지 모른다. 그러면 실제 서비스를 호출 할 필요가 없습니까? 이것에 대해 가장 좋은 방법은 무엇입니까?

2) 내가 뭘 테스트 할 것인가? 나의 방법이 사전에 특정 항목을 전달하고 있는지 확인하기 만하면 되는가?

3) 여기를 따라야하는 모범 사례가 있습니까?

답변

4

Hey TJ 내가 작성한 한 가지 기능 (테스트 코드가 아닌 테스트중인 코드)을 보여줄 수 있다면 예제 테스트를 제공 할 수 있습니다. 일반적으로 생각

:

1.A 당신은 외부 API에 대한 호출을 조롱 것입니다, 당신은 자신의 인증 메커니즘, 또는 인터넷에 연결되어 있는지 여부를 테스트하려고하지 않습니다. 당신은 올바른 서명으로 API를 호출하고 있는지 테스트하려고합니다.

1.b 파이썬에서의 조롱은 비교적 간단합니다. 나는 일반적으로 mocking library written by Michael Foord을 사용합니다. pip install mock이 시작됩니다. 그럼 당신은이 예에서

import unittest 
from mock import call, patch 
from my_module import wrapper_func 

class ExternalApiTest(unittest.TestCase): 

    @patch('my_module.api_func') 
    def test_external_api_call(self, mocked_api_func): 

     response = wrapper_func('user', 'pass') 

     self.assertTrue(mocked_api_func.called) 
     self.assertEqual(
      mocked_api_func.call_args_list, 
      [call('user', 'pass')] 
     ) 
     self.assertEqual(mocked_api_func.return_value, response) 

우리가 모의 객체 my_module 내부의 api_func를 교체하는 등의 작업을 수행 할 수 있습니다. mock 객체는 수행 된 작업을 기록합니다. 을 기억하는 것이 중요합니다. 패치 할 곳은입니다. 개체를 가져온 위치를 패치하지 않습니다. 그것을 사용할 위치에서 패치합니다.

  1. 코드가 주어진 입력으로 올바른 작업을 수행하는지 테스트합니다. 순수 함수를 테스트하는 것은 매우 간단합니다. 주어진 a가 주어 졌다고 가정하면,이 함수는 b를 리턴합니다. 함수에 많은 부작용이있을 때 좀 더 까다로워집니다.

  2. 특정 기능을 테스트하기가 너무 어렵거나 복잡하면 코드 작성이 잘못되었다는 것을 의미 할 수 있습니다. 이를 테스트 가능한 덩어리로 분해하여 객체를 함수로 전달하지 않고 가능하면 원시를 전달하려고합니다.