2011-07-15 3 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()にテストURLといくつかのテストパラメータを渡すことを考えました。これは現実世界に存在し、response.read()が期待されるデータを返すかどうかをチェックするものです。しかし、どういうわけか、私はそれが行われるべき方法ではない、と感じます。助言がありますか?私は、テキストメッセージのコンテキストでそのようなケースを処理する方法の提案を感謝します。

+0

まず、メソッドが従うべき契約を定義します。この記事は、受け入れられたレスポンス*をテストしていますが、ここでどのように失敗を処理するべきかを概説しています。しかし、実際の* data *をテストすることは、より多くの統合テストのように思えます。 –

+2

これを正確に行う(BSDライセンスを取得した)scikit-learnコードを見てみましょう。 [テストケース](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形式で、テスト対象の関数のdocstringに埋め込まれていることに注意してください。

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スケッチですウェブ。

関連する問題