我想使用Ruby's VCR library或Betamax for the JVM令人敬畏的“记录/回放”机制。是否有一个Python库以相同的方式工作?如果没有,您如何测试您的REST客户端调用而不必担心测试缓慢而且不稳定?
答案 0 :(得分:19)
在过去几年中,有一个名为VCR.py的VCR Python端口。
如果您已经知道如何使用VCR并且对此感到满意,您可能还会考虑运行本地ruby代理服务器(使用类似机架之类的东西)并加载VCR。然后,您可以使用任何语言测试代码...只需确保通过本地服务器代理HTTP请求。这是VCR's rack middleware的主要用途之一。我之前用它来测试非ruby代码,它运行得很好。
答案 1 :(得分:2)
我还全心全意地推荐了一个用于python的betamax。
答案 2 :(得分:1)
在其他答案中都建议同时使用betamax和VCR.py。我想指出一种可能会决定您能够使用的差异。
Betamax希望您在进行测试时通过一个预先创建的requests.Session对象。这意味着会话对象必须起源于测试内部,而不是受测代码。从文档中:
with Betamax(self.session) as vcr:
vcr.use_cassette('user')
resp = self.session.get('https://api.github.com/user',
auth=('user', 'pass'))
assert resp.json()['login'] is not None
就我而言,会话对象是在我需要测试的代码内创建的。因此,在这种情况下,betamax毫无疑问。
另一方面,VCR.py在较低级别上修补了Python的HTTP堆栈,因此可以完美地工作:
import requests
import vcr
def my_func():
session = requests.Session()
response = session.get('https://stackoverflow.com/')
print(response.text[:200])
def test_my_func():
with vcr.use_cassette('/tmp/cassette.yaml'):
my_func()