使用Jest快照测试api
你知道什么很烦人吗?API不匹配。 有一天,后台开发人员在没有通知前端开发人员的情况下更改了其中一个api。“我们认为dateCreated这个名字比created_at更好,”他们说。“我们昨天在单口相声会上不是告诉过你吗?” 然后,一切都崩溃了。 有涵盖UI代码的单元测试。有涵盖后端代码的单元测试。所有这些都已经过去了。然而,这个应用程序已经坏了。 在这篇文章中,我们将介绍如何使用Jest编写API测试,使用很少的代码,从而避免这种混乱。 没有端到端测试 缺少的是一组检查前端和后端是否正确集成的测试。 这些被称为端到端测试或验收测试,它们通常在浏览器级别上完成。像Selenium、Nightwatch或Capybara这样的工具可以驱动一个无头浏览器来登录、点击、填写表单,并确保一切正常运行。 但是,端到端(E2E)测试存在一些问题——它们速度慢、容易出错和脆弱。编写好selenium样式的浏览器自动化是需要技巧的。狡猾的计时错误可能会潜入,导致测试间歇失败。 如果测试显示: 加载用户配置文件页面并断言标记具有文本用户配置文件 如果你把它改成an,测试就会失败。 因此,在编写这样的测试时需要一种很好的平衡——您需要足够好的断言来验证功能,但又不需要太过具体,当您引入额外的命令时它们就会崩溃。什么的。 一个折衷方案:快照API测试 Facebook的Jest工具支持一种称为快照测试的测试方式,基本上: 您可以手动验证代码是否正常工作。编写一个快照测试并运行它。它保存了事物的文本表示。将快照签入源代码控制。之后,每次运行测试时,都会根据磁盘上的旧快照验证结果。如果它们不匹配,测试就会失败。 这通常应用于React组件(您可以在这里读到关于快照测试React组件的内容),但是可以获取任何内容的快照。任何JS对象都可以快照。 也就是说,你可以: 为结果做一个API调用快照,知道如果API快照通过,你的UI和后端是一致的 注意事项 如果您以前编写过单元测试,那么您可能已经模拟了API,使其不进行任何调用。在这些测试中,我们将其颠倒过来。我们希望对真实的服务器进行真实的API调用。 这意味着您需要运行一个后端服务器来运行这些测试。这有点复杂,但在贸易中,你会更有信心。 您还需要了解测试数据库,并确保在执行类似“创建3个事务,并验证GET /transactions返回3个事务”这样的操作之前,将其重置为一个已知的状态。在不清理数据库的情况下运行两次,测试将失败。 我不会在这里深入讨论如何设置所有这些,因为它将在很大程度上依赖于您自己的后端设置、CI设置等。 如果您决定尝试这种方法,请从简单的开始:针对“登录”或“创建”之类的内容编写测试,这些内容将对脏数据库具有弹性。如果您喜欢这种方法,那么您可以考虑解决数据库/CI/等问题。 例子 测试登录 这里有一些测试的理论“登录”服务: 隐藏,收缩,复制Code
import * as API from 'api';
test('failed login (bad password)', async () => {
let data;
try {
data = await API.login('me@example.com', 'wrong_password');
fail();
} catch(e) {
expect(e.response.data.error).toMatchSnapshot();
}
});
test('failed login (bad username)', async () => {
let data;
try {
data = await API.login('not-a-real-account@example.com', 'password');
fail();
} catch(e) {
expect(e.response.data.error).toMatchSnapshot();
}
});
test('good login', async () => {
try {
const response = await API.login('test-account@example.com', 'supersecret!');
expect(response).toMatchSnapshot();
} catch(e) {
fail();
}
});
这些测试利用异步/等待使代码读取更像同步代码。 这里并没有发生太多奇妙的事情:每个测试都进行一个API调用,并断言结果(或错误)与快照匹配。 请记住,在第一次运行快照测试之前,必须验证API调用是否在工作。它们通常会与测试JS文件一起保存在其余的snapshots__文件夹中,所以你也可以检查它们的正确性(你也应该这样做)。 测试变化的事物 有时API响应可能包含一个自动递增的ID或时间戳。这些事情将导致快照测试每次都失败。 为了解决这个问题,下面是一个sanitize函数的示例,该函数接受一个对象和一个要进行sanitize的键数组。因为它使用了lodash的set函数,所以键可以引用“深层”属性,比如user.orders[0]。created_at如果必要的话。 隐藏,复制Code
import * as _ from 'lodash';
import * as API from 'api'; function sanitize(data, keys) {
return keys.reduce((result, key) => {
const val = _.get(result, key);
if(!val || _.isArray(val) || _.isObject(val)) {
return result;
} else {
return _.set(_.cloneDeep(result), key, '[SANITIZED]');
}
}, data);
} test('createOrder', async () => {
let order = await API.createOrder('Camera', 47, 19.84);
order = sanitize(order, ['id', 'created_at']);
expect(order).toMatchSnapshot();
});
</code>
试试 我只是刚刚开始在我自己的项目中实现这种测试方法,但到目前为止它似乎很有前途。试一试吧,如果你这么做了,请留下评论。:) Jest快照测试api最初由Dave Ceddia于2017年9月18日在Dave Ceddia上发布。 CodeProject上 本文转载于:http://www.diyabc.com/frontweb/news29970.html
使用Jest快照测试api的更多相关文章
- 搭建 Jest+ Enzyme 测试环境
1.为什么要使用单元测试工具? 因为代码之间的相互调用关系,又希望测试过程单元相互独立,又能正常运行,这就需要我们对被测函数的依赖函数和环境进行mock,在测试数据输入.测试执行和测试结果检查方面存在 ...
- 直接用postman测试api ,服务器端没提供跨域也可以访问。
1. 直接用postman测试api ,服务器端没提供跨域也可以访问. 但是,如果用本地的 sever 搭的server, 然后去访问api的话,浏览器会提示 跨域错误.
- SpringBoot整合Swagger测试api构建
@Author:SimpleWu 什么是Swagger? Swagger是什么:THE WORLD'S MOST POPULAR API TOOLING 根据官网的介绍: Swagger Inspec ...
- 抓包和测试Api类工具
1.PostMan 测试api 2.Fiddler4抓包工具使用教程一
- 【postman】postman测试API报错如下:TypeError: Failed to execute 'fetch' on 'Window': Invalid value 对中文支持不好
使用postman测试APi的时候,因为系统需要在header部带上登录用户的信息,所以 如下: 然后测试报错如下:TypeError: Failed to execute 'fetch' on 'W ...
- API Studio 5.1.2 版本更新:加入全局搜索、支持批量测试API测试用例、读取代码注解生成文档支持Github与码云等
最近在EOLINKER的开发任务繁重,许久在博客园没有更新产品动态了,经过这些日子,EOLINKER又有了长足的进步,增加了更多易用的功能,比如加入全局搜索.支持批量测试API测试用例.读取代码注解生 ...
- 微服务网关从零搭建——(一)创建测试api以及api自动注入consul
本系列编写目的纯属个人开发记录 以下代码均为demo级 如有需要 请自行优化 代码完整包由于公司电脑加密 无法上传整包的demo文件 consul 开发环境简易处理 consul 下载地址 : ht ...
- Top11 构建和测试API的工具
立刻像专业人士一样构建API 组织正在改变他们已经在软件应用项目中成功的微服务架构模型,这就是大多数微服务项目使用API(应用程序接口)的原因. 我们要为微服务喝彩,因为它相对于其他的模型有各种先进的 ...
- jest 事件测试
概述 最近玩 Jest,测试 Vue 组件上的事件,有一些心得,记录下来供以后开发时参考,相信对其他人也有用. 事件测试 对于 Vue 组件上的事件,分为 2 种,一种是子组件 Emit 的事件,另一 ...
随机推荐
- Linux 基础指令2
管道符| 先执行第一个命令后执行第二个 eg:查看文件中间几行: head -n1 文件名| tail -n2 :先查看文件前n1行,然后在n1行中的后n2行 tail -n1 文件名| head - ...
- java实现zip文件的解压
使用到的包 org.apache.commons 下载文件 url:文件所在地址需要是http:// filePath:将下载的文件保存的路径 public static void getDownlo ...
- SpringMVC-整合SSM
整合SSM 目录 整合SSM 1. 设计流程 2. 创建一个数据库表 3. 配置依赖 4. 准备项目框架 5. Mybatis层 1. 编写实体类 2. 编写Mapper接口和xml 1. Mappi ...
- ICARUS主题美化
Icarus用户指南 - 主题美化 Icarus的主题样式编码文件为themes/icarus/layout/layout.jsx. 此文件定义了站点全局的样式设置.本文详细介绍了本主题针对文章分类的 ...
- linux(centos)下密码有效期和密码复杂度设置
1.密码有效期 方法一: chage -l 用户名 查看用户的过期时间 chage -M 99999 用户名 用命令修改过期时间为永久 chage -M 90 用户名 设置密码有效期为90天 chag ...
- Python 3 列表
列表:是可变的序列,也是一种可以存储各种数据类型的集合,用中括号([])表示列表的开始和结束,元素之间用逗号(,)分隔.列表中每个元素提供一个对应的下标. 1.列表的基本格式表示: 2.列表的不同数据 ...
- Unit1:Android
unit1 1.安卓版本 最新数据访问维基百科 2008年,android1.0 2011年,android3.0,平板失败 同年10月,android4.0,无差别使用 2014年,android5 ...
- Oracle闪回flashback
参考资料:Using Oracle Flashback Technology Oracle 11g的新特性闪回操作 闪回查询 闪回查询 闪回版本查询 闪回事务查询 闪回数据 闪回表 闪回删除 闪回数据 ...
- [LeetCode]1084. 销售分析III(Mysql,having+聚合函数)
题目 Table: Product +--------------+---------+ | Column Name | Type | +--------------+---------+ | pro ...
- [计算机网络]图解HTTP阅读笔记
总述 书的定位:一本十分浅显的HTTP书籍,主要介绍了HTTP与HTTPS.适合入门了解,很多地方都是蜻蜓点水,但稍微深入的地方能让人了解重点在哪,后面应该有针对性地阅读深入书籍. 主要内容:介绍了T ...