前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >前端自动化测试

前端自动化测试

作者头像
河马嘴不大
发布于 2022-12-24 04:24:55
发布于 2022-12-24 04:24:55
2.1K00
代码可运行
举报
运行总次数:0
代码可运行

前言

本文主要是介绍基于React+Ant Design(以下用Antd表示Ant Design)的项目,在对于自己封装的,或者基于Antd封装的公共组件的自动化测试技术的选型和实践。

背景

当前前端项目越来越大,业务逻辑日益繁杂,协同开发的同事也越来越多,迭代频繁,许多页面有一些相似的功能,会复用一些组件,这些组件被剥离出来,一般放在component文件夹下,大家共同维护,这时会出现一些常见问题:

  • 保证当前组件的质量,即当前业务的正常使用
  • 在新需求下,旧的组件如果能满足新需求50%以上的功能,应当升级旧组件满足新需求,同时兼容旧业务
  • 除该组件Owner之外第二人,在修改组件的过程中,避免因为对代码的不熟悉,改出BUG
  • 一个组件多个页面复用,修改后的测试回归任务重

技术选型

目前前端整体的测试框架较为常用的有:

Jest

源自Facebook,Jest 的一个理念是提供一套完整集成的 “零配置” 测试体验。

  • 包含单元测试运行器、断言库、Mock库
  • 内置代码覆盖率报告
  • 可以与Typescript一同使用
  • 零配置,开箱即用
Mocha

仅仅是测试运行器,虽然灵活,但需要自己配置很多东西。

React项目测试选型
  • react-addons-test-utils:官方API,有些晦涩
  • Enzyme:源自Airbnb,封装了React官方测试API,类Jquery风格简洁的API, 使得Dom操作变得十分友好

综合目前市面上的轮子,我们技术选型为Jest+Enzyme

实践

例子是一个基于Antd二次封装的单选年的日期选择器,如下演示:

代码结构如下

其中测试相关的文件,在test中,后缀名为xxx.test.js的文件,在运行测试时会自动执行,snapshots为自动生成的页面快照。

这里可以首先简单的看一下,Jest+Enzyme的基本语法:

Jest的API更多着力于定义测试、断言、mock库

定义测试:
  • describe: 定义一个测试套件(test suite)
  • it: 定义一个测试(test)
  • beforeEach: 定义一个回调函数在每个测试之前执行
  • expect: 执行一个断言
  • jest.fn(): 创造一个mock函数
一些用于断言的方法:
  • toEqual: 验证两个值是否相同
  • toBe: 验证两个值是否 === 完全相等
  • toHaveLength:验证长度
  • toBeDefined: 验证一个值是否被定义
  • toContain: 验证一个list中是否包含某一项
  • toBeCalled: 验证一个mock函数是否被调用
  • toBeCalledWith: 验证一个mock函数是否被传入指定的参数被调用
一些用于mock的方法:
  • mockImplementation: 提供mock函数的执行
  • mockReturnValue: mock函数被调用返回一个值

Enzyme的API更多着重于渲染react组件和从dom树种检索指定的节点

下面是三种渲染组件的方法:
  • shallow: 会渲染至虚拟dom,不会返回真实的dom节点,大幅提升测试性能
  • mount: 实现Full Rendering 比如说当我们需要对DOM API交互或者你需要测试组件的整个生命周期的时候,需要使用这个方法。
  • render: 渲染出最终的html,然后利用这个html结构来进行分析处理
一些被渲染的组件检索节点的方法:
  • find: 通过匹配选择器来检索节点
  • some: 当至少有一个节点匹配选择器是返回true
  • first: 返回集合的第一个节点
  • at: 返回集合的第n个节点
  • html: 获取节点的HTML结构
  • text: 获取节点的文本
一些用于组件交互的方法:
  • simulate: 模拟一个事件
  • setProps: 设置props
  • setState: 设置state
  • props(key): 用于检索组件的props
  • state(key): 用于检索组件的state

具体的写法,index.test.js文件内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React, { PureComponent } from 'react';
import { mount, ReactWrapper, render } from 'enzyme';
import YearPicker from '..';

import moment from 'moment';

class YearPickerDemo extends React.Component {
  state = {
    cleared: false,
    value: moment().format('YYYY'),
  };

  render() {
    return (
      <YearPicker
        showTime
        format="YYYY"
        onChange={this.onChange}
        defaultValue={moment('2015/01/01', 'YYYY')}
      />
    );
  }
}

describe('DatePicker', () => {
  it('default value', () => {
    const wrapper = mount(<YearPickerDemo/>);
    expect(wrapper.find('.ant-calendar-picker-input').getDOMNode().value).toBe('2015');
  });

  it('clear value', () => {
    const wrapper = mount(<YearPickerDemo/>);
    wrapper.find('.ant-calendar-picker-clear').hostNodes().simulate('click');
    expect(wrapper.find('.ant-calendar-picker-input').getDOMNode().value).toBe('');
  });

  it('set value in calendar', () => {
    const wrapper = mount(<YearPickerDemo/>);
    wrapper.find('.ant-calendar-picker-input').simulate('click');
    const triggerWrapper = mount(wrapper.find('Trigger').instance().getComponent());
    triggerWrapper.find('[title="2018"]').simulate('click');
    expect(wrapper.find('.ant-calendar-picker-input').getDOMNode().value).toBe('2018');
  });
});

这里定义了3个测试内容

  • 测试默认值,即检查输入框的值是否为默认值
  • 测试清除按钮是否可用,通过模拟点击清除按钮,测试是否能按照预期清除输入框内填充的默认值
  • 测试设置值,点击输入框,弹出选择框,选择值,检查输入框中的值是否为选择的值
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-09-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
原创干货:前端单元测试Jest零基础入门教学
其实单元测试,就是先编写单元测试代码,然后使用单元测试框架,去模拟环境(例如浏览器),然后运行你的代码,看代码是否按预期运行
Peter谭金杰
2020/05/09
1.2K0
原创干货:前端单元测试Jest零基础入门教学
为什么需要前端自动化测试呢?
原文为:https://www.wolai.com/4RCFtUJ1gqnP5eTNCkxCkB
winty
2021/11/26
1.4K0
前端单元测试那些事
Jest 是 Facebook 开源的一款 JS 单元测试框架,它也是 React 目前使用的单元测试框架,目前vue官方也把它当作为单元测试框架官方推荐 。 目前除了 Facebook 外,Twitter、Airbnb 也在使用 Jest。Jest 除了基本的断言和 Mock 功能外,还有快照测试、实时监控模式、覆盖度报告等实用功能。 同时 Jest 几乎不需要做任何配置便可使用。
树酱
2020/07/03
4.7K0
前端单元测试那些事
实例入门 Vue.js 单元测试
作为一个以 文档丰富 而广为人知的前端开发框架, Vue.js 的官方文档中分别在《教程-工具-单元测试》、《Cookbook-Vue组件的单元测试》里对 Vue 组件的单元测试方法做出了介绍,并提供了官方的单元测试实用工具库 Vue Test Utils;甚至在状态管理工具 Vuex 的文档里也不忘留出《测试》一章。
江米小枣
2020/06/15
3.1K0
从echarts-for-react源码中学习如何写单元测试
如果你熟悉React和Echarts的话,应该有用到过 echarts-for-react(虽然它现在没有维护了),本文就通过它写的测试用例来学习下如何写单元测试
进击的小进进
2020/07/27
6.4K1
Vue-Test-Utils + Jest 单元测试入门与实践
vs code打开项目你会发现根目录下有一目录test/unit,里面就有一个已经生成的测试用例。
用户6094182
2020/03/20
2.7K0
如何自动化测试 React Native 项目 (下篇) - 单元测试
接着上篇的内容, 这篇文章会详细的介绍在 Glow 我们如何写单元测试, 以及在 React Native 中各个模块单元测试的详细实现方式。
Java帮帮
2019/05/17
3.5K0
如何自动化测试 React Native 项目 (下篇) - 单元测试
使用Enzyme测试React(Native)组件|洞见
组件化与UI测试 在组件化出现之前,我们不谈UI的单元测试,哪怕是对于UI页面进行测试都是一件非常困难的事情。其实组件化并不完全是为了复用,很多情况下也恰恰是为了分治,使得我们可以分组件对UI页面进行
ThoughtWorks
2018/04/17
2.6K0
使用Enzyme测试React(Native)组件|洞见
你不知道的 Vue 单元测试(6000字实战单元测试)
Vue-Test-Utils 是 Vue.js 官方的单元测试实用工具库,它提供了一系列的 API 来使得我们可以很便捷的去写 Vue 应用中的单元测试。
一只图雀
2020/10/26
11.7K0
你不知道的 Vue 单元测试(6000字实战单元测试)
写代码无BUG,网易云前端单元测试方案总结
单元测试的技术方案很多,不同工具之间有互相协同,也存在功能重合,给我们搭配测试方案带来不小的困难,而且随着 ES6, TypeScript 的出现,单元测试又增加了很多其他步骤,完整配置起来往往需要很大的时间成本。我希望通过对这些工具的各自作用的掌握,了解完整的前端测试技术方案。前端单元测试的领域也很多,这里主要讲对于前端组件如何进行单元测试,最后会主要介绍下对于 React 组件的一些测试方法总结。
秋风的笔记
2021/03/12
10K0
写代码无BUG,网易云前端单元测试方案总结
React + Redux Testing Library 单元测试
谈任何东西都一定要有个上下文。你的论述不能是「因为单元测试有这些好处,所以我们要做单元测试」,而应该是「不做单元测试我们会遇到什么问题」,这样才能回答「为什么要写单元测试」的问题。那么我们谈论单元测试的上下文是什么呢?不做单元测试我们会遇到什么问题呢?上图为一个产品从 idea 分析、设计、开发、测试到交付并获取市场反馈的过程。
JimmyLv_吕靖
2021/03/03
2.5K0
React + Redux Testing Library 单元测试
【React总结(三)】React 组件自动化测试与持续集成指北(1)
在多人协作的项目中,特别是项目团队中,会有多个技术选型类似的项目,例如是都是通过 React 全家桶搭建的项目。随着项目的业务逻辑逐渐增加,我们都会抽取其中一些公共的代码,特别是一些与业务没有强耦合的组件,组成一个基础公共组件库,提供给各个项目使用。听起来很美好,但是在实际工程实践方面,会产生一些问题:
志航
2019/03/23
2.5K0
年轻时,我不写单元测试
当我们被提出这些bug的时候,我们是二脸懵逼的,因为这不符合一个程序员的预期!!! 那么我们如何能够避免以上的问题,从而将经历投入到更多的开发(写bug)中去呢? 笔者在这里试着归纳了一下解决问题的办法
2014v
2019/11/20
9600
【架构师(第三十篇)】Vue-Test-Utils 全局组件和第三方库 vuex | vue-router
此时会出现类似于 Failed to resolve component: a-button 的报错
一尾流莺
2022/12/10
2.3K0
【架构师(第三十篇)】Vue-Test-Utils 全局组件和第三方库 vuex | vue-router
前端自动化测试实践04—jest-vue项目之TDD&BDD
本节将以 TDD 的方式来搭建一个 TodoList 的 vue 项目。如何搭建包含 jest 的 vue 项目已经在第一节 jest-vue前端自动化测试实践01 中已经进行过介绍,其中,在 jest 的配置文件 jest.config.js 中,需要注意 testMatch 配置项,它指定了测试用例文件的路径,这里我们习惯性设置为 __tests__ 文件夹下的以 .test 加多种后缀结尾的文件。
CS逍遥剑仙
2019/10/31
2.2K0
前端单测,为什么不要测 “实现细节”?
相信不少同学在写单测的时候,最大的困扰不是如何写测试代码,而是:“应该测什么?”,“要测多深入”,“哪些不该测”。
写代码的海怪
2022/03/30
1K0
[译] Vue Router 之单元测试
原文:https://github.com/tonylua/vue-testing-handbook/blob/master/src/zh-CN/vue-router.md
江米小枣
2020/06/15
2.1K0
那些年错过的React组件单元测试(上)
关于前端单元测试,其实两年前我就已经关注了,但那时候只是简单的知道断言,想着也不是太难的东西,项目中也没有用到,然后就想当然的认为自己就会了。
前端森林
2021/04/12
5.4K0
【架构师(第二十九篇)】Vue-Test-Utils 触发事件和异步请求
---- 知识点 将 mock 对象断言为特定类型 使用 jest.Mocked<T> 使用 it.only 来指定测试的 case 使用 skip 跳过指定测试的 case 测试内容 触发事件 trigger 方法 测试界面是否更新 特别注意 DOM 更新是个异步的过程 使用 async await 更新表单 setValue 方法 验证事件是否发送 emitted 方法 测试异步请求 模拟第三方库实现 测试准备和结束 可以使用内置的一些钩子来简化一些通用的逻辑,以下钩子用于一次性完成测试准备。 b
一尾流莺
2022/12/10
9800
【架构师(第二十九篇)】Vue-Test-Utils 触发事件和异步请求
87.HarmonyOS NEXT 单元测试与自动化测试指南:构建可靠的测试体系
通过建立完善的测试体系,可以有效保证应用的质量和稳定性。在实际开发中,要根据项目特点选择合适的测试策略,并持续优化测试流程。
全栈若城
2025/03/16
910
推荐阅读
相关推荐
原创干货:前端单元测试Jest零基础入门教学
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验