Jest如何有序地执行测试
项目场景:
node环境下编写js库,处于规范性考虑,需要做单元测试,我选择了Jest
问题描述
我的js库需要访问数据库,因此操作都是异步的,而且各个测试单元有严格的先后执行顺序(比如,建表 > 插 > 改 > 删),而Jest的每个单元是独立的,并且默认下并行执行测试。
为此,我查询了解决方案,官方手册和一些博文帖子都告诉我,在jest配置文件中(jest.config.js),设置testSequencer属性,对应的是一个自定义的js模块,它导出了一个按照路径字母的排序算法,如下:
官方手册给出的custom-sequencer.js
const Sequencer = require('@jest/test-sequencer').default;
class CustomSequencer extends Sequencer {
sort(tests) {
// Test structure information
// https://github.com/facebook/jest/blob/6b8b1404a1d9254e7d5d90a8934087a9c9899dab/packages/jest-runner/src/types.ts#L17-L21
const copyTests = Array.from(tests);
return copyTests.sort((testA, testB) => (testA.path > testB.path ? 1 : -1));
}
}
module.exports = CustomSequencer;
相应的jest.config.js配置
/** @type {import('jest').Config} */
const config = {
testSequencer: 'path/to/custom-sequencer.js',
};
module. Exports = config;
我照做了,但我的单元依然随机地并行执行,或只是最初加载时在表面上排好了队,即便我设置maxConcurrency为1(A number limiting the number of tests that are allowed to run at the same time when using test.concurrent. Any test above this limit will be queued and executed once a slot is released.)。在有一些帖子的回答中,有人则认为,Jest难以支持指定顺序,或者要额外写不少代码才能实现Jest有序测试。
解决方案:
仅仅为jest指定排序算法是不够的,因为默认运行模式就是并行执行!
同时,应该将jest设置为串行运行,这样测试单元才会按照预期的顺序执行
你可以在运行时加上runInBand参数:npm test -- --runInBand

可以看到,对于我的四个测试文件,.1.dbIns.tes.js等等,从1-4执行了
你也可以在package.json中为npm脚本添加这个参数:
"scripts": {
"test": "jest",
"test-inline": "jest \"--runInBand\"", //注意是 "--runInBand" 而不是 -- --runInBand,而且一定要转义双引号
"babel-build": "babel lib/sql.js -d dist"
},
或者在package.json中,设置maxWorkers为1:
( 官方手册:Specifies the maximum number of workers the worker-pool will spawn for running tests. In single run mode, this defaults to the number of the cores available on your machine minus one for the main thread)
简而言之,你可以认为maxWorkers=1时Jest为单线程
const config = {
reporters: [~
"default",
"jest-allure"
],
setupFilesAfterEnv: ["jest-allure/dist/setup"],
testRunner: "jest-jasmine2",
testSequencer: './jest.sequencer.js',
maxWorkers: 1,
};
module.exports = config;
官方给出的排序法,是按文件路径字母排的序,我个人不喜欢用a,b,aa,ab为文件当作前缀,看着很难受,没有数字来的直观,如果你和我一样,可以使用我改写的排序模块:
此外,你的测试文件需要按照上图我那样子命名:.1.xxx.test.js
const Sequencer = require('@jest/test-sequencer').default;
class CustomSequencer extends Sequencer {
/**
* Sort test to determine order of execution
* Sorting is applied after sharding
*/
sort(tests) {
// Test structure information
// https://github.com/facebook/jest/blob/6b8b1404a1d9254e7d5d90a8934087a9c9899dab/packages/jest-runner/src/types.ts#L17-L21
const copyTests = Array.from(tests);
return copyTests.sort((testA, testB) => (parseInt(testA.path.split('.').reverse()[3]) > parseInt(testB.path.split('.').reverse()[3]) ? 1 : -1));
}
}
module.exports = CustomSequencer;
题外话
写完这篇文后,我在stackoverflow上看到了相同的诉求,并且有人给出了正确的解答。那叫一个后悔啊,我怎么没早点看到
Jest如何有序地执行测试的更多相关文章
- 使用postman发送数据并构建collections执行测试
1.安装 下载地址:https://www.getpostman.com/.直接安装,成功后在chorme的应用程序中会多出一个Postman.如果无法在google store上直接安装,可以下载. ...
- 解决Selenium Webdriver执行测试时,每个测试方法都打开一个浏览器窗口的问题
虽然把WebDriver定义为一个静态变量了,但是每次执行测试都要打开多个窗口,挺浪费时间的. 找了很多中方法,比如使用setUpClass, BeforeSuite都没有完全解决问题.后来无意间发现 ...
- Selenium执行测试脚本稳定性的一些经验分享交流
Selenium执行测试脚本稳定性的一些经验分享交流 公司的自动化WEB测试框架IATA已上线运行了一段时间,期间发现一些脚本稳定性的问题,与大家分享一下. CASE执行游览器:ie firefox ...
- 用非GUI模式执行测试,jp@gc - PerfMon Metrics Collector会出现无法获取正确数据的解决办法
用非GUI模式执行测试,jp@gc - PerfMon Metrics Collector会出现无法获取正确数据(实际显示的是Response Times Over Time),解决办法:在GUI模式 ...
- 用PyCharm执行测试成功但无法生成HTMLTestRunner报告
问题:代码写的没问题,执行也成功了,但就是无法生成HTMLTestRunner的报告 其实这是编辑器搞得鬼,编辑器为了方便用户执行测试,都有一项功能,可以用编辑器来调用unittest或者nose来执 ...
- Robot Framework源码解析(2) - 执行测试的入口点
我们再来看 src/robot/run.py 的工作原理.摘录部分代码: from robot.conf import RobotSettings from robot.model import Mo ...
- Selenium HTMLTestRunner 执行测试成功但无法生成报告
为什么用PyCharm或者Eclipse执行测试成功但无法生成HTMLTestRunner报告 最近遇到一些人问这样的问题: 他们的代码写的没问题,执行也成功了,但就是无法生成HTMLTestRunn ...
- jmeter 非GUI执行测试,导入jtl文件没有响应数据出来办法
jemter 官方也一直强调要在非GUI下执行 Run your JMeter test in command-line non-GUI mode as 在linux下执行jmeter压力测试,生成j ...
- Selenium_python自动化跨浏览器执行测试(简单多线程案例)
发生背景: 跨浏览器测试是功能测试的一个分支,用以验证web应用在不同浏览器上的正常工作,通常情况下,我们都期望web类应用能够被我们的用户在任何浏览器上使用,例如有的人喜欢IE浏览器上使用,有的人喜 ...
- Java+Selenium 3.x 实现Web自动化 - Maven打包TestNG,利用jenkins执行测试
1. Jenkins本地执行测试 or 服务器端执行测试 测试代码计划通过jenkins执行时,通过网上查询各种教程,大多数为本地执行测试,由此可见,本地执行是大多数人的选择. 经过探讨,最终决定采用 ...
随机推荐
- 齐博x1非正常修改后台入口admin.php导致的问题
如果你不是从后台基础设置修改后台入口admin.php文件名的话,也即强行通过FTP修改admin.php文件的名的话,就会导致网站会运行异常 比如会出现不能上传文件之类的.如下图所示
- Linux进程间通信(一)
进程间通信 概念:进程是一个独立的资源分配单位,不同进程之间有关联,不能在一个进程中直接访问另一个进程的资源. 进程和进程之间的资源是相互独立的,一个进程不能直接访问另外一个进程的资源,但是进程和进程 ...
- 我终于会写 Java 的定时任务了!
前言 学过定时任务,但是我忘了,忘得一干二净,害怕,一直听别人说: 你写一个定时任务就好了. 写个定时任务让他去爬取就行了. 我不会,所以现在得补回来了,欠下的终究要还的,/(ㄒoㄒ)/~~ 定时任务 ...
- Vue中常用的几种传值方式
Vue中常用的几种传值方式 1. 父传子 父传子的实现方式就是通过props属性,子组件通过props属性接收从父组件传过来的值,而父组件传值的时候使用 v-bind 将子组件中预留的变量名绑定为da ...
- 论文笔记 - PRISM: A Rich Class of Parameterized Submodular Information Measures for Guided Subset Selection
Motivation 与 Active Learning 类似,Target Learning 致力于 挑选外卖更"感兴趣"的数据,即人为为更重要的数据添加 bias.例如我们当前 ...
- 「浙江理工大学ACM入队200题系列」问题 H: 零基础学C/C++18——三位数反转
本题是浙江理工大学ACM入队200题第二套中的H题 我们先来看一下这题的题面. 由于是比较靠前的题目,这里插一句.各位新ACMer朋友们,请一定要养成仔细耐心看题的习惯,尤其是要利用好输入和输出样例. ...
- 前端常见loading动画
loading动画是前端页面加载时必不可少的元素,好看合适的加载动画会极大的提升用户体验与系统的交互效果.下面为大家提供几种简单的加载动画效果,如果帮助到你了请点赞评论. 1.无限循环的圆圈 < ...
- .NET7 gRPC JSON转码+OpenAPI
gRPC JSON转码 gRPC JSON 转码允许浏览器应用调用 gRPC 服务,就像它们是使用 JSON 的 RESTful API 一样. 浏览器应用不需要生成 gRPC 客户端或了解 gRPC ...
- 状态机的技术选型,yyds!
前言 今天跟大家分享一个关于"状态机"的话题.状态属性在我们的现实生活中无处不在.比如电商场景会有一系列的订单状态(待支付.待发货.已发货.超时.关闭):员工提交请假申请会有申请状 ...
- .NET MAUI 安卓应用开发初体验
一..NET MAUI开发环境搭建&安卓SDK和安卓模拟器安装提示网络连接失败问题解决 引言 本节目标是帮助第一次搭建.NET MAUI开发环境,在下载安卓SDK和安卓模拟器过程中一直提示网络 ...