我有需要很長的時間(分鐘)幾個單元測試,因爲調用外部服務(推特,臉譜,Klout的,等等)如何在Python單元測試中模擬外部服務器?
我想緩存來自這些服務的結果,並透明地爲他們提供服務的,只需對我目前的測試進行微小的更改。緩存鍵取決於URL,查詢參數,標題等,因此它非常複雜。
這樣做的最好方法是什麼?
我有需要很長的時間(分鐘)幾個單元測試,因爲調用外部服務(推特,臉譜,Klout的,等等)如何在Python單元測試中模擬外部服務器?
我想緩存來自這些服務的結果,並透明地爲他們提供服務的,只需對我目前的測試進行微小的更改。緩存鍵取決於URL,查詢參數,標題等,因此它非常複雜。
這樣做的最好方法是什麼?
你會(應該)通常使用某種適配器連接到這些外部服務模塊。這些是您與外部世界的接口,可以根據情景創建和僞造響應。
我已經試驗了一些嘲諷庫,最後發現Mock是最適合我的一個。
從技術上講,如果它使用外部服務,它不是一個單元測試,而是一個集成測試。對於單元測試並加快你的測試代碼使用模擬對象。你可以在這裏找到有關python模擬對象的詳細信息:
http://python-mock.sourceforge.net/
繼承人的代碼,我們使用請求庫來調用外部API的。所以我們用模擬請求對象創建上下文處理器。
所以,如果我們在測試的GET_DATA功能,這將是我們如何嘲笑請求外部API:
import requests
import mock
import unittest
def get_data(url):
resp = requests.get(url)
return resp
class GetDataTest(unittest.TestCase):
def test_get_data(self):
with mock.patch.object(requests, 'get') as get_mock:
get_mock.return_value = mock_response = mock.Mock()
mock_response.status_code = 200
mock_response.content = {'twitter_handle': '@twitter'}
resp = get_data("http://this_address_does_not_exist.com")
self.assertEqual(resp.status_code, 200)
self.assertEqual(resp.content['twitter_handle'], '@twitter')
+1模擬。我也認爲這是我嘗試過的最好的。 – user37078 2011-04-06 13:28:01