简介
betamax 1会记录你的HTTP操作,可以让你在测试的时候不必重复进行真实的请求。
动机
如果你的代码需要和外部资源一起运作,那么测试这段代码的方法就叫做集成测试。
但是,其实你并没有办法确保外部资源总是如你所愿,因为它并不在你的控制之下。而你的测试,其实只需要针对你处理这个资源的部分代码就好了。
一般测试外部的HTTP API有两个办法:
- 每次运行测试,都去请求这个资源。因为资源不在你的控制之下,访问外部资源有很多异常情况,而且访问很多接口会让你的测试运行非常的慢!
- 使用mock手段。mock是一个好办法,但是编写mock代码是非常啰嗦的。
为什么我们不能记录下第一次访问资源时的response,之后就使用这个response来测试就好了。
已经有人做过这件事了,就是Ruby的VCR2库。
作用
记录下第一次请求返回的response,保存到文件中。之后的请求,都会直接返回这个response的值。
这个方式可以极大的加速测试案例的运行速度。
并且,这个库还提供了pytest 插件等方便的功能.
但是,这个库只支持requests ,如果你要记录其它的HTTP Client,请使用vcrpy 3
用法
from betamax import Betamax
from requests import Session
from unittest import TestCase
# 全局配置, 加入response记录的存放文件夹
with Betamax.configure() as config:
config.cassette_library_dir = 'tests/fixtures/cassettes'
class TestGitHubAPI(TestCase):
def setUp(self):
self.session = Session()
self.headers.update(...)
# 可以通过Betamax instance的上下文管理器
# 使用`.user_cassette()`方法来设置存放数据的名称
def test_user(self):
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
# `.user_cassette()` 本身,也支持上下文管理器协议
def test_repo(self):
with Betamax(self.session).use_cassette('repo'):
resp = self.session.get(
'https://api.github.com/repos/sigmavirus24/github3.py'
)
assert resp.json()['owner'] != {}
个人评分
类型 |
评分 |
实用性 |
⭐️⭐️⭐️⭐️ |
易用性 |
⭐️⭐️⭐️ |
有趣性 |
⭐️⭐️⭐️⭐️ |
|
请发表评论