前端掌握单元测试-jest(上)

简介: 本文适合对单元测试感兴趣的小伙伴阅读

一、前言


本文基于开源项目:

https://github.com/facebook/jest

https://www.jestjs.cn/

 

对于单元测试,可能小伙伴们的第一反应都是“难”,能不写一般就不去写了。广东靓仔也觉得写单元测试是个有挑战性,且有难度的任务,但广东靓仔觉得大家可以尽量去尝试写一写单元测试,在bug减少的同时,项目的质量也有很大的提升,对个人而言一定能提升我们自己的能力。    本文我们一起来看看Jest,Jest现在已经更新到了28~


二、what Jest


Jest 是一个令人愉快的 JavaScript 测试框架,专注于"简洁明快"。这些项目都在使用 Jest:Babel、 TypeScript、 Node、 React、 Angular、 Vue 等等!


特点:

👩🏻‍💻 零配置:Jest 的目标是在大部分 JavaScript 项目上实现开箱即用, 无需配置。📸快照测试:能够轻松追踪大型对象的测试。快照可以与测试代码放在一起,也可以集成进代码行内。🏃🏽 隔离:测试程序拥有自己独立的进程 以最大限度地提高性能。👩🏻‍💻 优秀的api:从 it 到 expect - Jest 将整个工具包放在同一个 地方。好书写、好维护、非常方便。


三、入门


安装 Jest:npm / yarn

npm install --save-dev jest
# or
yarn add --dev jes


一般在选中哪个版本的时候,广东靓仔建议使用稳定的版本即可,不一定要最新。

(@27版本)初始化【@28可以省略这一步】


npx jest --init


执行完后能看到如下文件(翻译了一下):

export default {
  // 测试中所有导入的模块都应该自动模拟
  // automock: false,
  // `n` 次失败后停止运行测试
  // bail: 0,
  // Jest 应该存储其缓存的依赖信息的目录
  // 每次测试前自动清除模拟调用、实例、上下文和结果
  // 开启覆盖率
  clearMocks: true,
  // 指示是否应在执行测试时收集覆盖率信息
  collectCoverage: true,
  // 一组 glob 模式,指示应为其收集覆盖信息的一组文件
  // collectCoverageFrom: undefined,
  // Jest 应该输出其覆盖文件的目录
  coverageDirectory: "coverage",
  // 用于跳过覆盖收集的正则表达式模式字符串数组
  // coveragePathIgnorePatterns: [
  //   "\\\\node_modules\\\\"
  // ],
  // 指示应使用哪个提供程序来检测代码以进行覆盖
  coverageProvider: "v8",
};


Demo

Tips: 一般单元测试建议写在utils文件夹下。


目录如下:

├── jest.config.js
├── package-lock.json
├── package.json
├── src
│   └── utils
│       └── sum.js
└── liangzai-tests
    └── utils
        └── sum.test.js


 /utils/sum.js

// sum.js
function sum(a, b) {
  return a + b;
}
module.exports = sum;


/liangzai-utils/sum.test.js

const sum = require('../../utils/sum');
test('adds 1 + 2 to equal 3', () => {
  expect(sum(1, 2)).toBe(3);
});


然后执行

npm test


可以看到结果:

image.png


四、转译ts


Jest 本身不做代码转译工作:


安装ts

npm i -D typescript@4.6.3


初始化 TypeScript 的配置

npx tsc --init


执行后会看到tsconfig.json 文件:

{
  "compilerOptions": {
    "types": ["node", "jest"],
    "target": "es2016",                                  
    /* 为发出的 JavaScript 设置 JavaScript 语言版本并包含兼容的库声明 */
    "module": "commonjs",                                
    /* 指定生成什么模块代码. */
   "esModuleInterop": true,                             
   /* 发出额外的 JavaScript 以简化对导入 CommonJS 模块的支持。这将启用 `allowSyntheticDefaultImports` 以实现类型兼容性. */
    "forceConsistentCasingInFileNames": true,            
    /* 确保imports中的大小写正确 . */
    "strict": true,                                      
    /* 启用所有严格的类型检查选项。 */
    "skipLibCheck": true                                 
    /* 跳过类型检查所有 .d.ts 文件. */
  }
}


修改.js为.ts,代码增加类型

const sum = (a: number, b: number) => {
  return a + b;
}
export default sum;


安装Jest 类型声明包

npm i -D @types/jest@28.1.2


最后执行 npm run test,测试通过。


小优化


路径使用简写,修改 tsconfig.json 配置:

{
  "compilerOptions": {
    "paths": {
      "@/*": ["src/*"]
    }
  }
}


jest.config.js修改moduleNameMapper

modulex.exports = {
  "moduleNameMapper": {
    "@/(.*)": "<rootDir>/src/$1"
  }
}


五、其他知识点


setupFilesAfterEnv 和 setupFiles


简单来说:

  • setupFiles 是在 引入测试环境(比如下面的 jsdom)之后 执行的代码
  • setupFilesAfterEnv 可以指定一个文件,在每执行一个测试文件前都会跑一遍里面的代码


具体应用场景是:在 setupFiles 可以添加 测试环境 的补充,比如 Mock 全局变量 abcd 等。而在 setupFilesAfterEnv 可以引入和配置 Jest/Jasmine(Jest 内部使用了 Jasmine) 插件。


jsdom 测试环境


jest 提供了 testEnvironment 配置:


module.exports = {
  testEnvironment: "jsdom",
}


jsdom: 这个库用 JS 实现了一套 Node.js 环境下的 Web 标准 API。

添加 jsdom 测试环境后,全局会自动拥有完整的浏览器标准 API,不需要Mock了。


引入react/vue

step1: 安装Webpack 依赖

step2: 安装相应的Loader

step3: 安装React/vue 以及业务

这里列举下webpack.config.js


const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
  mode: 'development',
  entry: {
    index: './src/index.tsx'
  },
  module: {
    rules: [
      // 解析 TypeScript
      {
        test: /\.(tsx?|jsx?)$/,
        use: 'ts-loader',
        exclude: /(node_modules|tests)/
      },
      // 解析 CSS
      {
        test: /\.css$/i,
        use: [
          { loader: 'style-loader' },
          { loader: 'css-loader' },
        ]
      },
      // 解析 Less
      {
        test: /\.less$/i,
        use: [
          { loader: "style-loader" },
          {
            loader: "css-loader",
            options: {
              modules: {
                mode: (resourcePath) => {
                  if (/pure.css$/i.test(resourcePath)) {
                    return "pure";
                  }
                  if (/global.css$/i.test(resourcePath)) {
                    return "global";
                  }
                  return "local";
                },
              }
            }
          },
          { loader: "less-loader" },
        ],
      },
    ],
  },
  resolve: {
    extensions: ['.tsx', '.ts', '.js', '.less', 'css'],
    // 设置别名
    alias: {
      utils: path.join(__dirname, 'src/utils/'),
      components: path.join(__dirname, 'src/components/'),
      apis: path.join(__dirname, 'src/apis/'),
      hooks: path.join(__dirname, 'src/hooks/'),
      store: path.join(__dirname, 'src/store/'),
    }
  },
  devtool: 'inline-source-map',
  // 3000 端口打开网页
  devServer: {
    static: './dist',
    port: 3000,
    hot: true,
  },
  // 默认输出
  output: {
    filename: 'index.js',
    path: path.resolve(__dirname, 'dist'),
    clean: true,
  },
  // 指定模板 html
  plugins: [
    new HtmlWebpackPlugin({
      template: './public/index.html',
    }),
  ],
};


package.json 添加启动命令

{
  "scripts": {
    "start": "webpack serve",
    "test": "jest"
  }
}


配置 tsconfig.json

{
  "compilerOptions": {
    "jsx": "react",
    "esModuleInterop": true,
    "baseUrl": "./",
    "paths": {
      "utils/*": ["src/utils/*"],
      "components/*": ["src/components/*"],
      "apis/*": ["src/apis/*"],
      "hooks/*": ["src/hooks/*"],
      "store/*": ["src/store/*"]
    } 
  }
}
相关文章
|
4月前
|
JavaScript 前端开发 测试技术
jest测试核心
jest测试核心
24 2
|
4月前
|
资源调度 前端开发 JavaScript
React的测试:使用Jest和React Testing Library进行深入探索
【4月更文挑战第25天】本文探讨了使用Jest和React Testing Library进行React测试的方法。Jest是Facebook推出的JavaScript测试框架,适合React测试,提供全面的API和功能。React Testing Library侧重于组件行为,提倡按用户交互方式测试。安装这两个工具后,可通过编写测试用例(如模拟点击事件)来验证组件功能。运行Jest可执行测试并显示结果。此外,还介绍了高级测试技巧和模拟功能,强调了它们对于确保组件正确性、提升开发效率的重要性。
|
3月前
|
JavaScript 前端开发 安全
在众多的测试工具中,Cypress以其强大的端到端测试能力和与TypeScript的完美结合,成为了前端开发者的首选
【6月更文挑战第11天】Cypress结合TypeScript,打造前端测试新体验。TypeScript增强代码可读性和稳定性,Cypress提供强大端到端测试,二者结合提升测试准确性和可靠性。通过类型定义、自定义命令和断言,优化测试代码;Cypress模拟真实用户操作、时间旅行功能及内置调试工具,确保应用功能性能。推荐前端开发者使用TypeScript+Cypress进行端到端测试。
57 2
|
19天前
|
前端开发 JavaScript 测试技术
React 与前端自动化测试也太重要啦!各种测试框架助力确保应用质量,快来开启优质开发之旅!
【8月更文挑战第31天】随着前端技术的发展,React 成为了构建用户界面的热门选择。然而,随着应用复杂性的增加,确保应用质量变得至关重要。本文介绍了前端自动化测试的重要性,并详细综述了常用的测试框架如 Jest、Enzyme 和 Cypress,以及如何通过它们进行高效的 React 组件测试。通过遵循最佳实践,如编写可维护的测试用例、覆盖关键场景、集成 CI/CD 流程和进行性能测试,可以显著提高应用的稳定性和可靠性。
26 0
|
2月前
|
前端开发 数据管理 测试技术
前端自动化测试
前端自动化测试
|
3月前
|
前端开发 JavaScript 测试技术
Jest与React Testing Library:前端测试的最佳实践
Jest和React Testing Library是React应用测试的核心工具。安装相关依赖后,在`jest.config.js`中配置Jest。测试时,编写描述性测试用例,使用`render`、`fireEvent`和`screen`来检查组件行为。Jest提供模拟功能,如模拟API调用。测试组件交互性时,模拟用户行为并验证状态变化。确保覆盖边缘情况,使用代码覆盖率报告评估测试完整性,并将测试集成到CI流程中。
52 1
|
2月前
|
JavaScript 前端开发
测试框架 Jest 实用教程
测试框架 Jest 实用教程
22 0
|
4月前
|
前端开发 测试技术
前端自动化测试中的快照测试原理
快照测试用于前端自动化测试,通过比较当前应用状态与预存预期快照来检测UI变化。流程包括设置测试环境、捕获屏幕快照、保存预期快照、比较快照及处理差异。当快照比较出现差异时,测试工程师审查判断是否为预期变化或错误,确保应用一致性。这种方法在重构、样式更改和跨浏览器测试时提供有效回归测试,减少手动验证工作。
|
4月前
|
数据采集 监控 前端开发
前端自动化测试
前端自动化测试通过脚本和工具提升开发效率,确保应用在不同环境的品质和一致性。关键方面包括单元测试(如Jest、Mocha)、集成测试(Selenium、Puppeteer)、UI测试、快照测试及持续集成工具(Jenkins、Travis CI)。遵循确定测试范围、编写可维护代码、频繁运行测试和监控结果的最佳实践,可增强代码质量,减少错误。
|
4月前
|
缓存 监控 前端开发
【Flutter前端技术开发专栏】Flutter应用的性能调优与测试
【4月更文挑战第30天】本文探讨了Flutter应用的性能调优策略和测试方法。性能调优对提升用户体验、降低能耗和增强稳定性至关重要。优化布局(避免复杂嵌套,使用`const`构造函数)、管理内存、优化动画、实现懒加载和按需加载,以及利用Flutter的性能工具(如DevTools)都是有效的调优手段。性能测试包括基准测试、性能分析、压力测试和电池效率测试。文中还以ListView为例,展示了如何实践这些优化技巧。持续的性能调优是提升Flutter应用质量的关键。
86 0
【Flutter前端技术开发专栏】Flutter应用的性能调优与测试