使用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 的事件,另一 ...
随机推荐
- Webpack 入门指迷
大概算是一份教程吧, 只不过效果肯定不如视频演示之类的好..Webpack 最近在英文社区上经常看到, 留了心, 但进一步了解是通过下边的视频:视频: How Instagram.com Works, ...
- JDK15就要来了,你却还不知道JDK8的新特性!
微信搜「烟雨星空」,白嫖更多好文. 现在 Oracle 官方每隔半年就会出一个 JDK 新版本.按时间来算的话,这个月就要出 JDK15 了.然而,大部分公司还是在使用 JDK7 和 8 . 之前去我 ...
- 【IDEA】【SpringBoot】基于idea对springboot程序远程调试
一.开启远程调试前提:本地代码与服务器代码一致(实测:不关键的代码稍微有点不一样好像也不会有多大问题). 二.开启远程调试步骤 1.开发工具配置 idea端打开Edit configurations, ...
- 关于input框仿百度/google自动提示的方法
引入jquery-autocomplete文件 链接:https://pan.baidu.com/s/1hW0XBYH8ZgJgMSY1Ce6Pig 密码:tv5b $(function() { $( ...
- NetCore微服务实战体系:日志管理
一. 起始 进入NetCore时代,日志的使用有了很大的变化,因为跨平台以及虚拟化技术的使用,日志不能够再像Framework的方式直接记录在文本,文本其实也可以,但是日志的管理以及查看都不太方便.L ...
- SpringCloud系列之Nacos+Dubbo+Seata应用篇
目录 前言 项目版本 项目说明 Nacos服务 Seata服务 订单模块 支付模块 参考资料 系列文章 前言 本文接上篇文章<SpringCloud系列之Nacos+Dubbo应用篇>继续 ...
- 简单地 Makefile 书写
注意事项 每个标签分支前都不能用空格,必须用tab 标签外调用bash命令用 $(shell -),标签内可以正常使用 标签后可以指定其他标签,执行顺序是先执行其他标签,而后在执行自己 比如 all: ...
- 解决IDEA打包出现中文乱码的问题
这主要是maven编译时编码问题导致的. 解决办法: 1.在IDEA的File里面打开Settings. 2.找到Runner,在VM Options输入-DarchetypeCatalog=inte ...
- Redis集群模式(Cluster)部署
1. 安装依赖包 注意:本节需要使用root用户操作 1.1 安装ruby yum install ruby -y yum install ruby-devel.x86_64 -y 1.2 安装rub ...
- Spring注解不生效原因总结
在Spring的注解学习中发现使用(@Resource.@PostConstruct. @PreDestroy)这三个注解时不生效.使用@Resource发生空指针异常,说 明被注解对象没有被成功注入 ...