简介
betamax
会记录你的HTTP操作,可以让你在测试的时候不必重复进行真实的请求。
动机
如果你的代码需要和外部资源一起运作,那么测试这段代码的方法就叫做集成测试。
但是,其实你并没有办法确保外部资源总是如你所愿,因为它并不在你的控制之下。而你的测试,其实只需要针对你处理这个资源的部分代码就好了。
一般测试外部的HTTP API有两个办法:
- 每次运行测试,都去请求这个资源。因为资源不在你的控制之下,访问外部资源有很多异常情况,而且访问很多接口会让你的测试运行非常的慢!
- 使用mock手段。mock是一个好办法,但是编写mock代码是非常啰嗦的。
为什么我们不能记录下第一次访问资源时的response,之后就使用这个response来测试就好了。
已经有人做过这件事了,就是Ruby的VCR库。
作用
记录下第一次请求返回的response,保存到文件中。之后的请求,都会直接返回这个response的值。
这个方式可以极大的加速测试案例的运行速度。
并且,这个库还提供了pytest
插件等方便的功能.
但是,这个库只支持requests
,如果你要记录其它的HTTP Client,请使用vcrpy
用法
from betamax import Betamaxfrom requests import Sessionfrom 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'] != {}
个人评分
类型 | 评分 |
---|---|
实用性 | ⭐️⭐️⭐️⭐️ |
易用性 | ⭐️⭐️⭐️ |
有趣性 | ⭐️⭐️⭐️⭐️ |