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

封装一个自己的前端脚手架cli工具(一) 封装一个自己的前端脚手架cli工具。 阅读详情

添加测试框架

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

  • 参考:https://blog.youkuaiyun.com/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
    > jest
    
    PASS  __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 module
    
          at 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
    > jest
    
    FAIL  __tests__/cli.test.js
      ✓ run error command (2 ms)
      ✕ run cli (165 ms)
    
      ● run cli
    
        Command failed with exit code 1: /Users/Wang/Desktop/DD/abc-cli/packages/cli/bin/cli.js
        abc.com success log test version 0.0.0
        Usage: abc-cli <command> [options]
    
        Options:
          -V, --version          output the version number
          -d, --debug            是否开启调试模式 (default: false)
          -h, --help             display help for command
    
        Commands:
          init [options] [name]  init project
          help [command]         display help for command
    
          at 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
    > jest
    
      console.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
    > jest
    
    PASS  __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

Cypress端到端测试框架:从架构原理到工程实践 自动化测试是现代Web开发中保障应用质量的核心环节,其原理在于通过脚本模拟用户操作,验证应用功能的正确性。传统基于WebDriver的测试框架存在异步等待、配置复杂等痛点,而Cypress通过创新的架构设计,将测试运行器直接注入浏览器,实现了与应用的同步执行和完整上下文访问。这一技术突破带来了显著的工程价值:开发者可以编写更稳定、易维护的测试代码,并内置了实时调试、网络请求拦截等强大功能。在实际应用场景中,Cypress特别适合单页应用(SPA)的端到端测试,能够轻松处理复杂交互和异步流程。本文以Cypre 阅读详情

相关推荐

用Python实现四叉树(quad tree)

import numpy as np #正方形类 class square: #lx、ly为左上角坐标(x对应行号,y对应列号),rx、ry为右下角坐标 def __init__(self,lx,ly,rx,ry): self.lx=lx self.ly=ly self.rx=rx self.ry=ry #检查该矩阵中是否满足条件 #参数:原矩阵,阈值 #返回值:布尔类型 def check(s

weixin_44164489的博客 5868

前端架构: 脚手架通用框架封装之脚手架注册和命令注册开发(教程二)

接上文,仍旧在 abc-cli 项目中,参考:https://blog.youkuaiyun.com/Tyro_java/article/details/136381086,之前初始化的时候,使用的是 yargs, 现在我们想要使用 commander

Wang的专栏 1416

从Bit到MCS:深度解析Xilinx FPGA程序固化流程与文件选型

本文深度解析Xilinx FPGA程序从调试到量产的固化流程,重点对比BIT、BIN、MCS和ELF四种文件格式的特性与适用场景。针对工业级应用,详细讲解MCS文件的生成优化、Flash烧录避坑指南及三级验证流程,并分享多镜像管理、加密安全等高级技巧,帮助开发者提升FPGA量产可靠性。

weixin_30924239的博客 325

开发脚手架及封装自动化构建工作流

一、工程化的定义和主要解决的问题 1、工程化的定义和主要解决的问题 前端工程化:全副武装:通过工程化提升“战斗力” 面临的问题 想使用ES6+ 新特性,但是兼容有问题 想要用 Less/Sass/PostCSS增强CSS的编程性,但是运行环境不能直接支持 想要用模块化的方式提高项目的可维护性,但运行环境不能直接支持 部署上线前需要手动压缩代码及资源文件,部署过程需要手动上传代码到服务器 多人协作开发,无法硬性统一大家的代码风格,从仓库pull回来的代码质量无法保证 部分功能开发时需要等待后端服务接口提前完

weixin_44581964的博客 392

保姆级教程:用NFS把群晖NAS的文件夹挂到Ubuntu 22.04上,实现文件无缝共享

本文提供了一份详细的教程,指导用户如何通过NFS协议将群晖NAS的文件夹挂载到Ubuntu 22.04系统上,实现文件的无缝共享。文章对比了NFS与SMB协议的性能差异,并提供了群晖端和Ubuntu端的配置指南、高级参数优化、自动挂载方案以及生产环境中的实战技巧,帮助用户提升文件共享效率和系统稳定性。

weixin_29213827的博客 407

Modkit

Nmod- 通过过滤器分类为具有指定碱基修饰的残基的调用数量。Ncanonical- 通过过滤器分类为未修饰的碱基的调用数量。确切的碱基必须通过修饰代码推断。例如,如果修饰代码是m(5mC),则未修饰的碱基是胞嘧啶。如果修饰代码是a,则未修饰的碱基是腺苷。Nother mod- 通过过滤器分类为修饰的调用数量,但修饰不同于列出的碱基(且相应的未修饰碱基相同)。例如,对于给定的胞嘧啶,可能有 3 个读取带有h调用,1 个带有未修饰调用,2 个带有m调用。在h的 bedMethyl 行中,N。

生物信息学 1265

自定义脚手架封装

确定命令行交互方式选用合适的命令行工具库,如。安装它。在index.js中引入commander,并定义脚手架的命令和参数。例如,若脚手架用于创建项目,可定义create命令,像program.command('create <project - name>').description('Create a new project').action((projectName) => { /* 执行创建项目的逻辑 */ });功能逻辑设计若涉及模板渲染,考虑使用模板引擎库,如ejs在index.js。

2401_89097888的博客 723

IMU660RA姿态解算实战:从传感器滤波到欧拉角输出的完整实现

本文详细介绍了IMU660RA姿态解算的完整实现过程,从传感器滤波到欧拉角输出。通过实战案例和代码示例,展示了如何有效处理陀螺仪和加速度计的噪声问题,并选择合适的算法进行数据融合和姿态解算。特别强调了欧拉角输出中的坐标系对齐和动态补偿技巧,帮助工程师快速掌握IMU660RA的应用。

weixin_42524762的博客 388

Jest测试框架-让Jest支持ES6语法

Jest测试框架-让Jest支持ES6语法安装babel,自动装换commonjs Jest测试框架-让Jest支持ES6语法 这是之前的代码: // 存放业务文件 function web1(money){ return money>=200?"vip":"menber" } function web2(money){ return money>=1000?"svip":"glodvip" } module.exports={ web1,web2 }

测试工程师 1888

7.29华为OD机试真题 新系统 - 能量对撞 (Java/Py/C/C++/Js/Go)

7.29华为OD机试真题 新系统 - 能量对撞 (Java/Py/C/C++/Js/Go)

算法大师! 1326

Debezium 性能调优实战:吞吐量、延迟与资源平衡

摘要: 本文分享了团队如何通过系统性调优将Debezium从初始3,200 TPS/2.8秒延迟提升至15,200 TPS/210ms延迟的实战经验。优化涵盖四个层面:1)Debezium连接器配置(批处理、快照并行、消息精简);2)Kafka分区策略与Avro序列化缓存;3)JVM改用ZGC及OS参数调优;4)MySQL的binlog与I/O优化。关键发现包括分区数黄金公式、sync_binlog调整带来56%的I/O负载下降,以及避免盲目增大队列内存等陷阱。最终实现吞吐量提升4.75倍,并强调性能调优需

爱丹丹的博客 358

前端自动化测试 —— Jest 测试框架应用

在软件测试中,自动化测试指的是使用独立于待测软件的其他软件来自动执行测试、比较实际结果与预期并生成测试报告这一过程。在测试流程已经确定后,测试自动化可以自动执行的一些重复但必要的测试工作。也可以完成手动测试几乎不可能完成的测试。对于持续交付和持续集成的开发方式而言,测试自动化是至关重要的。——来自 WiKi 百科。

m0_68271787的博客 1855

Android 蓝牙——概述(一)

Profiles (蓝牙应用规范),它从应用场景的角度为蓝牙技术的使用制定了不同的规范。这也是和大众日常生活接触最多的一部分。蓝牙支持很多Profiles:MAP:(MessageAccessProfile),短信访问协议,允许设备间的信息交换,短信。使用场景:智能车载中同步短信等信息。HFP:(Hands-free Profile),电话免提协议,让蓝牙设备(如蓝牙耳机/车机)可以控制电话,如接听、挂断、拒接等。

小旭的专栏 3492

e2e测试框架之Cypress

本文介绍了新兴的前端测试框架Cypress的特点及优势。相比传统Selenium,Cypress作为端到端测试框架,具有启动速度快(2秒内完成测试)、定位元素以CSS为主、自带丰富示例和视频教程等优势。文章详细说明了Cypress的安装步骤和简单测试脚本编写方法,通过百度搜索案例展示了其高效性。虽然Cypress在整合能力和JavaScript门槛上仍有不足,但作者认为它代表了前端测试的未来方向。最后提供了相关学习资源获取方式,帮助测试人员掌握这一新兴技术。

nhb687095的博客 847

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

搭建基于Vue的前端架构,总结15点经验

搭建基于Vue的前端架构,总结15点经验1.分解需求技术栈建立脚手架开发规范2.样式CSS 预处理器的选择局部样式与全局样式局部样式全局样式体验优化页面载入进度条静态资源加载页面移动端 100vh 问题3.组件库覆盖 Ant Design Vue 样式1.使用 .less 文件2.使用 JavaScript 对象干掉无用的图标如何知道你要加载的图标在什么路径下?解决 Moment 多国语部分组件需要在页面内引用4.静态资源与图标静态资源自动注册 Svg 图标5.异步请求封装 Axios跨域问题Mock 数

zhangshuishui77的博客 371

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

e2e 测试框架之 Cypress

这几天我在搭建 UI 自动化测试框架,顺便封装了一些元素定位,随着对前端技术的了解,我几乎将所有元素定位都换成了 CSS,配合 JS 处理一些 Selenium 很难操作的元素,确实效率提高了很多,页面元素也没那么难操作了,包括学了点 Jenkins 的配置,当然,这个话题会放到下一次来分享。也许,这是未来前端测试的方向,至少对于前端人员来说,快速验证界面功能,我想不到有什么理由不选择它,而是 Selenium。当然,对于测试人员,脚本的可维护性,报告的生成,以及与持续集成的结合都有一整套成熟的方案。

weixin_40646872的博客 152

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【前端进阶之旅】前端脚手架:从入门到精通,让你告别重复造轮子!

每天重复创建项目结构?配置Webpack到怀疑人生?是时候掌握前端脚手架,把时间留给真正的开发了!脚手架不是万能的,但没有脚手架是万万不能的。它就像前端开发者的"瑞士军刀"——不一定每天用所有功能,但关键时刻能大幅提升效率。

程序员林北北的博客 608
上一篇: 前端架构: 脚手架通用框架封装之CommonJS和ESM混合开发兼容解决(教程五)
下一篇: Go微服务:基于net/rpc模块实现微服务远程调用
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值