2011-07-15 19 views
7

Python'da testlere giriyorum ve kendime bu yöntemi nasıl test edeceğimi sordum.Verileri, urllib2 tarafından hangi verileri almayı test ediyorsunuz?

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 veya unittest, bu nasıl iyi sağlanır mu kullanıyorsunuz? get_response()'u bir test url'sini ve gerçek dünyada var olan bazı test parametrelerini geçirmeyi ve response.read()'un beklenen verileri döndürüp döndürmediğini kontrol etmeyi düşündüm. Ama bir şekilde hissediyorum, bu yapılması gereken bir şey değil. Baska öneri? Bu tür davaları mesajlaşma bağlamında nasıl ele alacağına dair önerileri takdir ediyorum.

+0

İlk olarak, yöntemin uyması gereken sözleşmeyi tanımlayın. Post * kabul edilen yanıtı * test ederek özetliyor, ancak şimdi başarısızlıkların nasıl ele alınması gerektiği. Ancak, gerçek * verileri * test etmek, daha fazla bir entegrasyon testi gibi görünür. –

+2

Tam olarak bunu yapan (BSD lisanslı) scikit-öğrenme kodunu inceleyin; [testisler] (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). –

cevap

3

Bu, minimock gibi bir sahte sınama çerçevesi kullanmak için iyi bir fırsattır.

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 

birim doctest biçiminde, test altındaki fonksiyon için docstringe gömülü olduğuna dikkat etmeyin.

5

Bu sahte nesneleri kullanarak için iyi bir durumdur:

# 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" 

Bu gerçekten vurmadan kodunuzu test için kendi sahte uygulaması ile gerçek urllib2.urlopen işlevi geçersiz nasıl sadece sketchiest kroki olduğunu ağ.