什么是服务器相当于django.test.client来测试外部URL提取?

时间:2009-09-02 00:12:36

标签: python django testing

我想确保我的测试中的给定视图正确地获取外部URL。它使用urllib2(但这不应该,因为它是黑盒测试)。也许某种临时的本地服务器?是否有应用程序执行此操作? (我的谷歌搜索让我失望了。)

3 个答案:

答案 0 :(得分:3)

您正在测试的模块可能会导入urllib2。您可以对测试工具中的模块进行猴子修补以指向您自己的假urllib2 - 例如,这不一定是一个模块,它可以是一个类实例,它有一个urlopen方法,用于检查是否调用了正确的url返回一个合适的回复。

更新:以下是该方法的框架。我们假设您正在测试的模块名为mymodule。在您的测试模块(或单独的实用程序模块)中,您可以:

import urllib2 # the real urllib2

class Urllib2Simulator: # This is a sort of Mock
    #In practice, you could supply additional parameters to this to tell it
    #how to behave when e.g. urlopen is classed
    def __init__(self):
        self.urls_opened = []

    def urlopen(self, url, data=None): # this method simulates urlopen
        self.urls_opened.append((url, data)) # remember what was opened
        #Now, you can either delegate to the real urllib2 (simplest)
        #Or completely simulate what it does (that's more work)
        #Let's keep it simple for this answer.
        #Our class instance will be acting a bit like a proxy.
        return urllib2.urlopen(url, data)

    #similarly define any other urllib2 functions that mymodule calls

然后,在您的测试代码中:

class MyModuleTest(unittest.TestCase):

    def test_url_retrieval(self): # use whatever name is best
        real_urllib2 = mymodule.urllib2 #remember it so we can restore it
        simulator = Urllib2Simulator()
        mymodule.urllib2 = simulator # the monkey-patch is here
        # here, invoke your mymodule functionality which is supposed to
        # retrieve URLs using urllib2.urlopen
        mymodule.do_something_which_fetches_urls()
        #restore the previous binding to urllib2
        mymodule.urllib2 = real_urllib2 # restored - back to normal
        #Now, check that simulator.urls_opened contains the correct values

我使用这种技术取得了一些成功。 (当您想要模拟时间传递时,它特别有用。)在单元测试场景中,它比设置真实服务器要少。对于集成测试,我可能会使用真正的服务器,正如S. Lott的回答所暗示的那样。但是这种方法允许您轻松模拟不同的条件,而无需基于服务器的整个测试框架(例如,您可以进行设置以使服务器看起来返回特定错误,测试代码如何处理它们,或者可配置)延迟响应,因此您可以测试超时或格式错误的响应等。)

答案 1 :(得分:2)

您可以使用SimpleHTTPServer来装配虚假的Web服务器进行测试。

我们使用WSGI参考实现wsgiref来装配虚假的Web服务器进行测试。我们喜欢wsgiref,因为它是一种创建可扩展模拟Web服务器的非常简洁的方法。此外,我们有状态和关闭WSGI应用程序,我们用它来确保从网站的角度来看一切正常。

答案 2 :(得分:0)

在测试外部网址时,我非常喜欢vcrpyPyPI)。它可以将HTTP交互记录到文件中,并在稍后运行测试时播放它们。使用它的最简单方法是测试功能上的装饰器,盒式磁带(记录的请求/响应)默认为YAML,易于编辑。从他们的自述文件:

  

VCR.py简化并加速了发出HTTP请求的测试。该   第一次运行VCR.py上下文管理器中的代码或   装饰函数,VCR.py记录所有采取的HTTP交互   放置它支持的库并序列化和编写它们   到平面文件(默认为yaml格式)。这个平面文件叫做a   暗盒。当再次执行相关代码时,VCR.py   将读取序列化的请求和响应   上述盒式文件,并拦截它的任何HTTP请求   从原始测试运行中识别并返回响应   符合这些要求。

示例(也来自文档):

@vcr.use_cassette('fixtures/vcr_cassettes/synopsis.yaml')
def test_iana():
    response = urllib2.urlopen('http://www.iana.org/domains/reserved').read()
    assert 'Example domains' in response