前端架构: 脚手架通用框架封装之添加测试框架(教程六)

添加测试框架

  • 接上文,仍旧在 abc-cli 项目中

  • 参考:https://blog.csdn.net/Tyro_java/article/details/136438882

  • 现在要在脚手架项目中安装测试工具,选择 jest

  • 文档:https://www.npmjs.com/package/jest

  • 数据:Weekly Downloads 19,759,155 (动态)

  • 可见是一个比较流行的测试库,现在安装它

  • $ npm i jest execa -D -w packages/cli

  • 注意,这里的 -D 它是开发依赖,用于测试

  • 之后,在 abc-cli/packages/cli/package.json 中的 scripts 进行修改

    {"scripts": {"test": "jest"}
    }
    
  • 在 abc-cli/packages/cli/tests/cli.test.js 中编写

    test('run error command', () => {expect(1 + 1).toBe(2);
    })
    
  • 进入 abc-cli/packages/cli 目录下,执行 $ npm run test, 查看输出

    $ npm run test> @abc.com/cli@0.0.0 test
    > jestPASS  __tests__/cli.test.js✓ run error command (2 ms)Test Suites: 1 passed, 1 total
    Tests:       1 passed, 1 total
    Snapshots:   0 total
    Time:        0.329 s
    Ran all test suites.
    
  • 好,看起来一切正常,现在我们来测试CLI内部的一些API

    import path from 'node:path';
    import { execa } from 'execa';const CLI = path.join(__dirname, '../bin/cli.js');
    const bin = () => () => execa(CLI);test('run error command', () => {expect(1 + 1).toBe(2);
    })test('run cli', async () => {const ret = await bin()();console.log(ret);
    })
    
  • 这里拿到 cli 中的api,进行执行测试,但是发现报错了

    Details:/Users/xx/abc-cli/packages/cli/__tests__/cli.test.js:1({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,jest){import path from 'node:path';^^^^^^SyntaxError: Cannot use import statement outside a moduleat Runtime.createScriptFromCode (../../node_modules/jest-runtime/build/index.js:1505:14)
    
  • 可以看到,它这里把整个代码当做 commonjs 来运行, jest本身提供的就是 commonjs 的方式,这里涉及到了如何让 jest 支持 esm

  • jest 默认集成了 babel, 我们利用这个特性,创建 babel 的配置文件,新建 abc-cli/packages/cli/babel.config.cjs

  • 安装 babel, 在 abc-cli 目录中,$ npm i @babel/core @babel/preset-env -D -w packages/cli

  • 编辑 babel.config.cjs, 注意,这里是 cjs 代表在ESM中使用commonjs规则

    module.exports = {presets: [['@babel/preset-env']]
    }
    
  • 之后,在同级目录添加 jest.config.cjs

    module.exports = {transformIgnorePatterns: []
    }
    
  • 再次在 abc-cli/packages/cli 目录下,执行 $ npm run test, 查看输出

  • 虽然看似报错,但是是这个命令的执行结果

    > @abc.com/cli@0.0.0 test
    > jestFAIL  __tests__/cli.test.js✓ run error command (2 ms)✕ run cli (165 ms)● run cliCommand failed with exit code 1: /Users/Wang/Desktop/DD/abc-cli/packages/cli/bin/cli.jsabc.com success log test version 0.0.0Usage: abc-cli <command> [options]Options:-V, --version          output the version number-d, --debug            是否开启调试模式 (default: false)-h, --help             display help for commandCommands:init [options] [name]  init projecthelp [command]         display help for commandat makeError (node_modules/execa/lib/error.js:60:11)at _callee$ (node_modules/execa/index.js:124:35)at call (node_modules/execa/index.js:2:1)at Generator.tryCatch (node_modules/execa/index.js:2:1)at Generator._invoke [as next] (node_modules/execa/index.js:2:1)at asyncGeneratorStep (node_modules/execa/index.js:2:1)at asyncGeneratorStep (node_modules/execa/index.js:2:1)Test Suites: 1 failed, 1 total
    Tests:       1 failed, 1 passed, 2 total
    Snapshots:   0 total
    Time:        0.792 s, estimated 2 s
    Ran all test suites.
    
  • 现在就可以继续完善了,修改 abc-cli/packages/cli/tests/cli.test.js

    import path from 'node:path';
    import { execa } from 'execa';const CLI = path.join(__dirname, '../bin/cli.js');
    const bin = () => (...args) => execa(CLI, args);test('run error command', () => {expect(1 + 1).toBe(2);
    })test('run cli', async () => {const ret = await bin()(iii);console.log(ret);
    })
    
  • 执行 $ npm run test, 查看输出

    > @abc.com/cli@0.0.0 test
    > jestconsole.log{command: '/Users/Wang/Desktop/DD/abc-cli/packages/cli/bin/cli.js iii',escapedCommand: '"/Users/Wang/Desktop/DD/abc-cli/packages/cli/bin/cli.js" iii',exitCode: 0,stdout: '',stderr: 'abc.com success log test version 0.0.0\nabc.com ERR! 未知的命令:iii ',all: undefined,failed: false,timedOut: false,isCanceled: false,killed: false}at log (__tests__/cli.test.js:13:10)PASS  __tests__/cli.test.js✓ run error command (2 ms)✓ run cli (141 ms)Test Suites: 1 passed, 1 total
    Tests:       2 passed, 2 total
    Snapshots:   0 total
    Time:        0.744 s, estimated 1 s
    Ran all test suites.
    
  • 这样,看到用例都通过了,但是这是一个没有注册的命令

  • 继续优化, 编写 abc-cli/packages/cli/tests/cli.test.js 如下

    import path from 'node:path';
    import { execa } from 'execa';const CLI = path.join(__dirname, '../bin/cli.js');
    const bin = () => (...args) => execa(CLI, args);// 正常测试
    test('run normal test', () => {expect(1 + 1).toBe(2);
    })// 测试 cli 未注册命令
    test('run cli', async () => {const { stderr } = await bin()('iii');expect(stderr).toContain('未知的命令:iii')
    })// 测试 --help
    test('test --help', async () => {let error = null;try {await bin()('--help');} catch(e) {error = e;}expect(error).toBe(null);
    })// 测试 -V
    test('test --version', async () => {const { stderr } = await bin()('-V');expect(stderr).toContain(require('../package.json').version)
    })// 测试是否开启 debug 模式
    test('test --debug', async () => {let error = null;try {await bin()('-d');} catch(e) {error = e;}expect(error.message).toContain('launch debug mode');
    })
    
  • 运行 $ npm run test 查看输出结果

    > @abc.com/cli@0.0.0 test
    > jestPASS  __tests__/cli.test.js✓ run normal test (2 ms)✓ run cli (148 ms)test --help (140 ms)test --version (131 ms)test --debug (142 ms)Test Suites: 1 passed, 1 total
    Tests:       5 passed, 5 total
    Snapshots:   0 total
    Time:        1.218 s
    Ran all test suites
    
  • 通过以上,我们把整个测试框架和一些基础用例编写完成,在实际场景中可以继续挖掘出更多用法

  • 相关代码参考:v_test

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/729101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

maven项目引入私有jar,并打包到java.jar中

私有jar存放位置 maven依赖 <dependency><groupId>com.hikvision.ga</groupId><artifactId>artemis-http-client</artifactId><version>1.1.10</version><scope>system</scope><systemPath>${project.basedir}/s…

Tomcat常见配置(基础功能、虚拟主机、搭建博客)

目录 一、Tomcat基础功能 1、自动解压war包 2、Tomcat工具界面 2.1 Server Status (服务器状态) 2.1.1 本地登录状态页 2.1.2 远程登录状态页 2.2 Manager App (管理应用程序) 2.3 Host Manager (主机管理器) 3、Context 配置 二、配置虚拟主机 三、搭建 JPress 博客…

支持AUTOSAR Classic以及Adaptive平台的DEXT诊断数据库

一 DEXT、DCM、DEM和FIM的概述 DEXT&#xff08;Diagnostic Extract Template&#xff09;是AUTOSAR定义的诊断提取模板&#xff0c;用于DCM&#xff08;Diagnostics Communication Manager&#xff09;、DEM&#xff08;Diagnostics Event Manager&#xff09;和FIM&#xff…

从新能源汽车行业自动驾驶技术去看AI的发展未来趋势

自动驾驶汽车关键技术主要包括环境感知、精准定位、决策与规划、控制与执行、高精地图与车联网V2X以及自动驾驶汽车测试与验证技术等。 &#x1f413; 自动驾驶技术 这是AI在汽车行业中应用最广泛的领域之一。自动驾驶技术利用AI算法和传感器来感知环境、识别障碍物&#xff0c…

各大厂商常用的弱口令集合

Oms呼叫中心 KXTsoft2010 Glodon控制台 admin TRENDnet趋势网络摄像头 admin/admin MOBOTIX-视频监控 admin/meinsm 思科Cisco 没有原始密码, 第一次登录时需要创建 DRS admin/1234 Honeywell admin/1234 安迅士Axis root/pass, 新安迅士摄像头在用户第一登录时要求创建…

springboot文件上传修改临时文件路径

1、配置&#xff1a;spring.servlet.multipart.location/data/tmp 2、代码 Configuration public class MultipartConfig {Value("${spring.servlet.multipart.location}")private String tmpLocation;Beanpublic MultipartConfigElement multipartConfigElement()…

Spring反序列化失败 Type definition error: [simple type, class xxx.xxx.xxx]

也许更好的阅读体验 Type definition error: [simple type, class com.elm.po.CommonResult]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.elm.po.CommonResult (no Creators, like default const…

【开源】JAVA+Vue.js实现农家乐订餐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户2.2 管理员 三、系统展示四、核心代码4.1 查询菜品类型4.2 查询菜品4.3 加购菜品4.4 新增菜品收藏4.5 新增菜品留言 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的农家乐订餐系统&#xff0c…

函数柯里化(function currying)及部分求值

函数柯里化&#xff08;function currying&#xff09; currying又称部分求值。一个currying的函数首先会接受一些参数&#xff0c;接受了这些参数之后&#xff0c;该函数并不会立即求值&#xff0c;而是继续返回另外一个函数&#xff0c;刚才传入的参数在函数形成的闭包中被保…

通信原理 | 功率谱密度PSD | 估计 | 周期图谱法 | Scipy.singal 中periodogram的用法

文章目录 功能主要参数返回值使用示例使用matplotlib等库来绘制功率谱密度图表解释scipy的 periodogram函数是 scipy.signal模块中的一个功能,用于估计一个信号的功率谱密度(Power Spectral Density,PSD)。这是一种分析信号频率成分的方法,特别适用于处理和分析时间序列…

0基础学习VR全景平台篇第143篇:限定访问功能

大家好&#xff0c;欢迎观看蛙色VR官方——后台使用系列课程&#xff01;这期&#xff0c;我们将为大家介绍如何使用限定访问功能。 一.什么是限定访问功能&#xff1f; 限定访问&#xff0c;就是可以在编辑后台设置可以访问作品的用户的类型&#xff0c;还有可以访问作品的IP…

【leetcode热题】环形链表

难度&#xff1a; 简单通过率&#xff1a; 34.9%题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个链表&#xff0c;判断链表中是否有环。 为了表示给定链表中的环&#xff0c;我们使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;索…

【CSS】简单的抽屉面板展开收起自然过渡效果的css

目录 效果展示css固定梯形按钮至抽屉面板中间梯形按钮css过渡动画 效果展示 1.收起时点击蓝色梯形按钮展开 2. 展开时点击蓝色按钮收起 3.展开收起时需要过渡自然&#xff0c;有抽屉推拉效果 css 固定梯形按钮至抽屉面板中间 .toggle{ position: absolute;left:-21px;top…

pdf文件超出上传大小怎么压缩?值得学习的几个方法

平时我们在使用pdf文件的时候&#xff0c;不管是上传还是进行存储&#xff0c;都会面临pdf太大的情况&#xff0c;尤其是当我们需要把pdf文件上传到一些平台上去的时候&#xff0c;那么pdf怎么压缩的小一点呢&#xff1f;为了解决这个问题&#xff0c;可以通过一些软件将pdf压缩…

关于并发编程和并行

目录 前言: 并发编程: 1.并发编程的定义: 2. 并发编程的目的 2.1提高性能&#xff1a; 2.2增强响应性&#xff1a; 2.3资源利用&#xff1a; 3. 并发编程的实现方式 3.1多线程&#xff1a; 3.2多进程&#xff1a; 3.3异步编程&#xff1a; 3.4协程&#xff1a; 4. …

【JAVA/Web】数组转对象

一. 需求 数组转对象 数组结构 List:[{id:1,code:phone,value:10101001},{id:2,code:name,value:admin},{id:3,code:address,value:XXXXXX} ]二. 数组转对象&#xff08;键值对映射关系&#xff09; 对象结构 object:{phone:10101001,name:admin,address:XXXXXX }2.1 Java…

每日一练:LeeCode-977、有序数组的平方【双指针法】

本文是力扣 每日一练&#xff1a;每日一练&#xff1a;LeeCode-977、有序数组的平方【双指针法】 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐 LeeCode-977、有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums&#xf…

vue element plus Transfer 穿梭框

基础用法# Transfer 的数据通过 data 属性传入。 数据需要是一个对象数组&#xff0c;每个对象有以下属性&#xff1a;key 为数据的唯一性标识&#xff0c;label 为显示文本&#xff0c;disabled 表示该项数据是否禁止被操作。 目标列表中的数据项会同步到绑定至 v-model 的变量…

桌搭和DIY,或许攒机才能满足宅男们的情绪价值

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩北京录音间 最近几年&#xff0c;人们突然对品牌机没有那么感兴趣了&#xff0c;反而重新开始热衷于自己动手攒机。这…

Android14音频进阶:AudioTrack如何拿到AudioFlinger创建的匿名共享内存(六十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…