我想确保我的测试中的给定视图正确地获取外部URL。它使用urllib2(但这不应该,因为它是黑盒测试)。也许某种临时的本地服务器?是否有应用程序执行此操作? (我的谷歌搜索让我失望了。)
答案 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)
在测试外部网址时,我非常喜欢vcrpy(PyPI)。它可以将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