简介

betamax1会记录你的HTTP操作,可以让你在测试的时候不必重复进行真实的请求。

动机

如果你的代码需要和外部资源一起运作,那么测试这段代码的方法就叫做集成测试

但是,其实你并没有办法确保外部资源总是如你所愿,因为它并不在你的控制之下。而你的测试,其实只需要针对你处理这个资源的部分代码就好了。

一般测试外部的HTTP API有两个办法:

  1. 每次运行测试,都去请求这个资源。因为资源不在你的控制之下,访问外部资源有很多异常情况,而且访问很多接口会让你的测试运行非常的慢!
  2. 使用mock手段。mock是一个好办法,但是编写mock代码是非常啰嗦的。

为什么我们不能记录下第一次访问资源时的response,之后就使用这个response来测试就好了。

已经有人做过这件事了,就是Ruby的VCR2库。

作用

记录下第一次请求返回的response,保存到文件中。之后的请求,都会直接返回这个response的值。

这个方式可以极大的加速测试案例的运行速度。

并且,这个库还提供了pytest插件等方便的功能.

但是,这个库只支持requests,如果你要记录其它的HTTP Client,请使用vcrpy3

用法

  1. from betamax import Betamax
  2. from requests import Session
  3. from unittest import TestCase
  4. # 全局配置, 加入response记录的存放文件夹
  5. with Betamax.configure() as config:
  6. config.cassette_library_dir = 'tests/fixtures/cassettes'
  7. class TestGitHubAPI(TestCase):
  8. def setUp(self):
  9. self.session = Session()
  10. self.headers.update(...)
  11. # 可以通过Betamax instance的上下文管理器
  12. # 使用`.user_cassette()`方法来设置存放数据的名称
  13. def test_user(self):
  14. with Betamax(self.session) as vcr:
  15. vcr.use_cassette('user')
  16. resp = self.session.get('https://api.github.com/user',
  17. auth=('user', 'pass'))
  18. assert resp.json()['login'] is not None
  19. # `.user_cassette()` 本身,也支持上下文管理器协议
  20. def test_repo(self):
  21. with Betamax(self.session).use_cassette('repo'):
  22. resp = self.session.get(
  23. 'https://api.github.com/repos/sigmavirus24/github3.py'
  24. )
  25. assert resp.json()['owner'] != {}

个人评分

类型 评分
实用性 ⭐️⭐️⭐️⭐️
易用性 ⭐️⭐️⭐️
有趣性 ⭐️⭐️⭐️⭐️

【AMAD】betamax -- 一个ruby-VCR的模仿品,只支持requests的更多相关文章

  1. 分享一个ruby网站 | 菜鸟教程

    http://www.runoob.com/ruby/ruby-tutorial.html 分享一个ruby网站.

  2. 第一个ruby程序

    老实说不是很喜欢去讨论ruby和python的对比,似乎总是把两个语言放在对立的位置上,我觉得没有必要,同样是动态语言,同样是解释型脚本语言,很多特性都是互相影响的,语言本身也在不断进化,我们更应该关 ...

  3. 35.按要求编写Java程序: (1)编写一个接口:InterfaceA,只含有一个方法int method(int n); (2)编写一个类:ClassA来实现接口InterfaceA,实现int method(int n)接口方 法时,要求计算1到n的和; (3)编写另一个类:ClassB来实现接口InterfaceA,实现int method(int n)接口 方法时,要求计算n的阶乘(n

      35.按要求编写Java程序: (1)编写一个接口:InterfaceA,只含有一个方法int method(int n): (2)编写一个类:ClassA来实现接口InterfaceA,实现in ...

  4. 运行第一个ruby程序

    0x00 安装 首先需要安装一个ruby的环境,ruby分为win.linux.macOS版本.不用系统安装方法略有差异,不在这进行讲解. 0x01 运行第一个ruby程序 我这里是win环境,打开命 ...

  5. 使用python开发一个能够计算带括号的复杂表达式的计算器(只支持加减乘除)

    使用到了模块re,正则,字典等 # 实现简单的加减乘除括号等运算 # Calculator def calculator(expression): print(expression) import r ...

  6. C# ArcgisEngine开发中,对一个图层进行过滤,只显示符合条件的要素

    转自原文 C# ArcgisEngine开发中,对一个图层进行过滤,只显示符合条件的要素 有时候,我们要对图层上的地物进行有选择性的显示,以此来满足实际的功能要求. 按下面介绍的方法可轻松实现图层属性 ...

  7. js进阶正则表达式10-分组-多行匹配-正则对象的属性(小括号作用:分组,将小括号里面的东西看成一个整体,因为量词只对前一个字符有效)(多行匹配:m)(属性使用:reg.global)

    js进阶正则表达式10-分组-多行匹配-正则对象的属性(小括号作用:分组,将小括号里面的东西看成一个整体,因为量词只对前一个字符有效)(多行匹配:m)(属性使用:reg.global) 一.总结 1. ...

  8. js实现弹窗一个ip在24小时只弹出一次的代码

    function cookieGO(name) { var today = new Date(); var expires = new Date(); expires.setTime(today.ge ...

  9. NGUI 屏幕自适应(初始设定宽高800x480只支持比其大的屏幕)

    自适应讲解部分可以参考以下网址:http://www.xuanyusong.com/archives/2536,下面代码中提到的AdaptiveManualHeight()函数就是参考该文章的. 下面 ...

随机推荐

  1. 将 对象序列化与反序化 (json格式)

    实体类 package com.nf.redisDemo1.entity; public class News { private long id; private String title; pri ...

  2. hive元数据

    本文介绍Hive元数据库中一些重要的表结构及用途,方便Impala.SparkSQL.Hive等组件访问元数据库的理解. 1.存储Hive版本的元数据表(VERSION) 该表比较简单,但很重要. V ...

  3. java学习记录--ThreadLocal使用案例(转)

    本文借由并发环境下使用线程不安全的SimpleDateFormat优化案例,帮助大家理解ThreadLocal. 最近整理公司项目,发现不少写的比较糟糕的地方,比如下面这个: public class ...

  4. app 移动支付

    1.微信 多个端单独对用appid  多个appid  对应到一个商户  先创建appid  然后再关联商户 2.支付宝 多个aliPrivateKey,这个可以生成pkcs8,是用在java里面.非 ...

  5. Twilio收发短信笔记

    twlio基本使用 Twilio是一个做成开放插件的电话跟踪服务(call-tracking service),可用来进行短信,图片等信息的集中于转发,貌似只支持北美地区的电话. 现有一个需求是:客户 ...

  6. LCA离线Tarjan,树上倍增入门题

    离线Tarjian,来个JVxie大佬博客最近公共祖先LCA(Tarjan算法)的思考和算法实现,还有zhouzhendong大佬的LCA算法解析-Tarjan&倍增&RMQ(其实你们 ...

  7. Qbxt 模拟赛&&day-8

    /* 今天的题目还是比较不错的. 今天考的很烂还是依旧的弱. 快考试了加油吧. Bless all. */ 注:所有题目的时间限制均为 1s,内存限制均为 256MB. 1.第K小数 (number. ...

  8. 使用fiddler实现手机抓包

    手机上无法直接查看网络请求数据,需要使用抓包工具.Fiddler是一个免费的web调试代理,可以用它实现记录.查看和调试手机终端和远程服务器之间的http/https通信. fiddler没有手机客户 ...

  9. Android有进度条异步任务下载图片

    首先在AndroidMainifest中添加上网权限 ? 1 <uses-permission android:name="android.permission.INTERNET&qu ...

  10. Spring Boot教程(三十七)整合MyBatis

    Spring中整合MyBatis就不多说了,最近大量使用Spring Boot,因此整理一下Spring Boot中整合MyBatis的步骤.搜了一下Spring Boot整合MyBatis的文章,方 ...