【问题标题】:How do you test a function using which retrieves data by urllib2?如何测试通过 urllib2 检索数据的函数?
【发布时间】:2011-07-15 20:49:38
【问题描述】:

我开始在 python 中进行测试,我问自己如何测试这个方法。

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() 是否返回预期的数据。但不知何故,我觉得,这不是应该做的方式。有什么建议么?我将不胜感激有关如何在发短信的情况下处理此类情况的建议。

【问题讨论】:

  • 首先,定义方法应该遵守的契约。这篇文章概述了测试接受的响应,但现在应该如何处理失败。然而,测试实际的数据听起来更像是一种集成测试。
  • 看看(BSD 许可的)scikit-learn 代码就是这样做的; testcases, mock_urllib2.

标签: python unit-testing urllib2 doctest


【解决方案1】:

这是使用假对象的好例子:

# 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 函数以测试您的代码而不真正访问网络的最粗略的草图。

【讨论】:

    【解决方案2】:

    这是使用模拟测试框架的好机会,例如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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-07
      • 2012-07-17
      • 1970-01-01
      • 2014-06-29
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多