2011-07-15 41 views
7

我正在進入python測試,我問自己如何測試這種方法。如何測試使用哪個函數通過urllib2檢索數據?

def get_response(self, url, params): 
    encoded_params = urllib.urlencode(params) 
    request = urllib2.Request(BASE_URL, headers=HEADERS) 
    response = urllib2.urlopen(request, encoded_params) 
    return response 

使用doctest或unittest,如何最好地實現?我想通過get_response()測試網址和一些測試參數,它存在於現實世界中,並檢查response.read()是否返回預期數據。但不知何故,我覺得,這不是它應該完成的方式。有什麼建議麼?我會很感激在發短信的情況下如何處理這種情況的建議。

+0

首先,定義方法應遵守的合同。該文章概述了測試*接受的響應*,但現在應該如何處理失敗。然而,測試實際的* data *聽起來更像是一個集成測試。 – 2011-07-15 21:06:38

+2

看看(BSD許可的)scikit-learn代碼,完全可以做到這一點; [testcases](https://github.com/scikit-learn/scikit-learn/blob/master/scikits/learn/datasets/tests/test_mldata.py),['mock_urllib2'](https://github.com /scikit-learn/scikit-learn/blob/master/scikits/learn/utils/testing.py#L55)。 –

回答

3

這是使用模擬測試框架的好機會,如minimock

BASE_URL='http://google.com' 
HEADERS = {"accept-language":"klingon"} 
import urllib, urllib2 
def get_response(self, url, params): 
    r""" 
    >>> from minimock import Mock 
    >>> urllib2.Request = Mock('urllib2.Request') 
    >>> urllib2.urlopen = Mock('urllib2.urlopen') 
    >>> get_response(None, 'http://google.com', {'foo':'bar'}) 
    Called urllib2.Request(
     'http://google.com', 
     headers={'accept-language': 'klingon'}) 
    Called urllib2.urlopen(None, 'foo=bar') 
    >>> 
    """ 
    encoded_params = urllib.urlencode(params) 
    request = urllib2.Request(BASE_URL, headers=HEADERS) 
    response = urllib2.urlopen(request, encoded_params) 
    return response 

請注意,單位嵌入在測試功能的文檔字符串中,格式爲doctest

5

這是使用假對象一個很好的例子:

# my_module 
get_url = urllib2.urlopen 

def get_response(self, url, params): 
    encoded_params = urllib.urlencode(params) 
    request = urllib2.Request(BASE_URL, headers=HEADERS) 
    response = get_url(request, encoded_params) 
    return response 

# test_my_module  
def fake_get_url(request, params): 
    assert request == "the url I expect" 
    assert params == ['the', 'params', 'i', 'expect'] 
    return SomeFakeResponse("OK") 

my_module.get_url = fake_get_url 
assert my_module.get_response("blah", "blah").content == "OK" 

這只是你如何能超越現實urllib2.urlopen功能,用自己的假執行沒有真正擊中測試代碼的sketchiest草圖網絡。

相關問題