前端自动化UI测试的完整方案

简介: 前端自动化UI测试的完整方案

背景

开发公共平台项目,测试资源相对比较少,因此对开发者自身而言,为了维护项目的稳定性,需要对平台做各类测试,即使有测试环境,但是也很容易缺乏测试场景导致带着bug上线的情况。

因此我们需要做完整自动化测试方案,来避免这类常规错误,提高平台的可用性和稳定性。

这里先简单描述自动化测试的分类:

  • 单元测试,验证独立的单元模块代码或函数是否正常工作
  • 集成测试,验证多个单元模块间的协同工作
  • UI 测试,只针对前端UI部分测试,后端数据采用mock方式
  • 端到端测试,从用户的角度,通过机器来模仿用户在真实浏览器中验证应用交互
  • 快照测试,验证程序的UI变化

接下来我们将根据这些测试类如何在项目中落地完整方案。

单元测试

前端项目主要用的单元测试框架为JestMocha,下面就Jest框架如何实现一个单元测试。

实现步骤

  1. 安装依赖
npm i jest --save-dev
# 如果是typescript还需要安装 ts
npm i ts-jest babel-jest --save-dev
# 安装类型
npm i @types/jest --save-dev
  1. 新增测试命令,在package.jsonscripts新增代码
{
    ...
    "scripts": {
        "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
  },
}
  1. 新增配置文件jest.config.js,参考配置如下:
module.exports = {
    "testEnvironment": "node",
    testMatch: [ //匹配测试用例的文件
        '<rootDir>/test/**/*.test.ts'
    ],
    transform: {
        '^.+\\.js$': '<rootDir>/node_modules/babel-jest', // babel编译
        '^.+\\.ts$': '<rootDir>/node_modules/ts-jest', // typescript编译
    },
    "collectCoverage": true
}
  1. 编写单元测试代码,在根目录下新建测试文件test/sum.test.js,标识对a.ts文件做测试,代码如下:
//sum.ts
export const sum = (a, b) => {
    return a + b;
}
//sum.test.ts
import { sum } from '../src/sum'
test("test two num sum", async () => {
    const res = sum(5, 6);
    expect(typeof res).toBe("number")
    expect(res).toBe(11)
})
  1. 开始自动化测试yarn test或者npm run test,然后会出现如下:
PASS  ./sum.test.ts
----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |     100 |      100 |     100 |     100 |                   
 sum.ts   |     100 |      100 |     100 |     100 |                   
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        1.394 s, estimated 3 s

简单说明一下上面的表格几个字段作用:

  • File,标识当前测试的文件
  • Stmts,语句覆盖率(statement coverage):是不是每个语句都执行了
  • Branch,分支覆盖率(branch coverage):是不是每个if代码块都执行了
  • Funcs,函数覆盖率(function coverage):是不是每个函数都调用了
  • Lines,行覆盖率(line coverage):是不是每一行都执行了

怎么提高单元测试覆盖率

分为两个部分:

  • 提高代码质量,减少代码块的大小,减少各类复杂逻辑判断,不去测试有依赖性函数,如:需接口、数据库等
  • 提高开发意愿,一自动化生成单元测试,二采用设置覆盖率指标,三是确定单元测试规范(哪些模块需要写,哪些不需要写)

集成测试

集成测试主要是测试当单元模块组合到一起之后是否功能正常。

相比较单元测试只是针对某个函数或方案做单一功能测试,集成测试是针对某个功能模块做完整的测试,因此在测试粒度上的选择,需要开发自己去衡量,但是一般的选择如下几种:

  • 如果有UI展示的,一般通过router分割页面粒度去进行测试,尽可能的少mock依赖,尽量的渲染全子组件
  • 如果是库不含JS的,则以功能模块为粒度进行测试,测试数据尽量丰富且贴近真实数据

具体实现步骤其实和单元测试一样,只是所写的测试功能比单元测试范围要大且完整。

UI 测试

相比较后面端到端测试,UI测试只是对于前端的测试,是脱离真实后端环境的,仅仅只是将前端放在真实环境中运行,而后端和数据都应该使用 Mock 的。

UI 测试在前端上,也可以叫组件测试 那么如何实现UI测试,其实依旧可以使用JestEnzymeseleniumVitest等框架,目前都支持将VueReact等组件进行模拟渲染完成。

利用Jest实现对React UI组件测试,代码如下:

// React Home.jsx
const Home = ()=>{
    return (
        <div>
            <h1>Home</h1>
        </div>
    )
};
// home.test.js
import React from "react";
import { createRoot } from "react-dom/client"; // createRoot 是React18 新出的特性
import { act } from "react-dom/test-utils"; // react支持测试动作
import Home from "../src/pages/home";
global.IS_REACT_ACT_ENVIRONMENT = true
let root = null;
let container = null;
beforeEach(() => {
    // 创建一个 DOM 元素作为渲染目标
    container = document.createElement("div");
    document.body.appendChild(container);
    root = createRoot(container)
});
afterEach(() => {
    // 退出时进行清理
    // root.unmount(container);
    container.remove();
    container = null;
});
it("渲染有或无名称", () => {
    act(() => {
        root.render(<Home />);
    });
    expect(container.textContent).toBe("Home");
});

当然你依然可以使用Jest去做Vue UI 测试,但是Vitest实现在vite项目中更加好用,代码如下:

// Home.vue
<script setup lang="ts">
defineProps<{ msg: string }>()
</script>
<template>
  <h1>{{ msg }}</h1>
</template>
//home.test.js
import { mount } from '@vue/test-utils'
import Home from '../src/components/Home.vue'
test('mount component', async () => {
    expect(Home).toBeTruthy()
    const wrapper = mount(Home, {
        props: {
            msg: 'Home',
        },
      })
    expect(wrapper.html()).toContain('Home')
})

快照测试

快照测试是属于UI测试的一种分类,主要用于区分同样的数据下,页面UI展示是否发生变化,如果不一样则比较测试结果失败,有异常或者功能迭代。针对快照测试详细说明如下:

快照测试类似于“找不同”游戏。快照测试会给运行中的应用程序拍一张图片,并将其与以前保存的图片进行比较。如果图像不同,则测试失败。这种测试方法对确保应用程序代码变更后是否仍然可以正确渲染很有帮助。

当然,在前端中,其实并不是比较图片,而是比较前后生成的html结构,本质上是一个字符串的比较。

同理,如果一个功能模块,针对同样的输入,得出的结果是不一样,那么也是一种快照测试。

利用Jest实现快照测试代码如下(基本和UI测试一样):

// home.test.js
import React from "react";
import { createRoot } from "react-dom/client";
import { act } from "react-dom/test-utils";
import pretty from "pretty";
import Home from "../src/pages/home";
global.IS_REACT_ACT_ENVIRONMENT = true
let root = null;
let container = null;
beforeEach(() => {
    // 创建一个 DOM 元素作为渲染目标
    container = document.createElement("div");
    document.body.appendChild(container);
    root = createRoot(container)
});
afterEach(() => {
    // 退出时进行清理
    // root.unmount(container);
    container.remove();
    container = null;
});
it("渲染有或无名称", () => {
    act(() => {
        root.render(<Home />);
    });
    expect(container.textContent).toBe("Home");
    // 快照对比 这里你可以先把html结构存储一份,然后再拿出来对比
    expect(
        pretty(container.innerHTML)).
        toMatchInlineSnapshot(`
"<div>
  <h1>Home1</h1>
</div>"
`);
});

E2E测试

E2E测试,也叫端到端测试,就是模拟真实环境下,用户不同操作行为的测试。

目前主要进行E2E测试框架有如下几种:

  • puppeteer 一个 Node 库,它提供了一个高级 API 来通过 DevTools 协议控制 Chromium 或 Chrome
  • cypress 现代网络构建的下一代前端测试工具, 编写更快、更容易和更可靠的测试
  • Selenium 是开源的自动化测试工具,它主要是用于Web 应用程序的自动化测试,不只局限于此,同时支持所有基于web 的管理任务自动化
  • NightWatch 是一个用于web应用和网站上执行自动化端到端(end-to-end)测试的集成框架,用于主流浏览器中,简化编写和执行多种类型地测试程序

这几者的区别后面会有专门文章去描述,现在我们先利用cypress实现E2E测试代码, 以Vue项目为主,如下: 步骤一,安装依赖

yarn add cypress -D

步骤二,新增脚本,package.json

{
    "scripts": {
        "cypress": "cypress open"
    }
}

步骤三,后面按照其提示去添加测试文件,比如:index.cy.ts,然后修改代码如下:

describe('template spec', () => {
  it('has home text', () => {
    // 访问首页
    cy.visit('http://localhost:5173/')
    // 断言是否有 Home 文字
    cy.contains('Home')
  })
})

具体效果如下图:

image.png

当然E2E没有这么简单,还有一些点击、输入等事件,甚至可以模拟登录等,这些详细操作放在后面cypress实战篇去讲解。

测试覆盖率

了解自动化测试后,我们还需要对测试覆盖率进行一个完整的了解。

测试覆盖率(test coverage)是衡量软件测试完整性的一个重要指标。掌握测试覆盖率数据,有利于客观认识软件质量,正确了解测试状态,有效改进测试工作。

其实上面提到单元测试的时候已经有讲过一些,这里再做一个完整都介绍。

覆盖率主要分为以下几种:

  • 代码覆盖率, 如上述所说分为几种,如:行覆盖率、函数覆盖率等
  • 需求覆盖率,测试所覆盖的需求数量与总需求数量的比值

总结

自动化测试在前端开发是必不可少的一个环节,因为前端是直接面向用户的,即使有测试团队支持,也难免会出现测试遗漏的场景,或者加大测试人力成本。

当然不同项目的自动化测试所需要的环节是不一样的,根据个人经验,建议不同场景采用自动化测试如下:

  • 开发纯函数库,建议写更多的单元测试 + 少量的集成测试
  • 开发组件库,建议写更多的单元测试、为每个组件编写快照测试、写少量的集成测试 + 端到端测试
  • 开发业务系统,建议写更多的集成测试、为工具类库、算法写单元测试、写少量的端到端测试
  • 开发公共平台项目,建议写更多的集成测试和完整的端到端测试

相关资料

参考资料

目录
相关文章
|
1月前
|
前端开发 JavaScript 测试技术
前端测试技术中,如何提高集成测试的效率?
前端测试技术中,如何提高集成测试的效率?
|
11天前
|
监控 测试技术 定位技术
HTTP代理IP响应速度测试方案设计与指标体系
随着数字化发展,网络安全、隐私保护及内容访问自由成为核心需求。HTTP代理因其技术优势成为热门选择。本文介绍HTTP代理IP响应速度测试方案,包括基础性能、稳定性、地理位置、实际应用、安全性测试及监控指标,推荐测试工具,并提供测试结果评估标准。
25 2
|
22天前
|
前端开发 JavaScript 测试技术
前端自动化测试
前端自动化测试是通过使用工具和脚本自动执行测试用例的过程,旨在提高测试效率、减少人为错误,并确保Web应用的功能在不同环境和设备上的一致性与稳定性。
|
1月前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
97 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
20天前
|
敏捷开发 测试技术 持续交付
自动化测试之美:从零开始搭建你的Python测试框架
在软件开发的马拉松赛道上,自动化测试是那个能让你保持节奏、避免跌宕起伏的神奇小助手。本文将带你走进自动化测试的世界,用Python这把钥匙,解锁高效、可靠的测试框架之门。你将学会如何步步为营,构建属于自己的测试庇护所,让代码质量成为晨跑时清新的空气,而不是雾霾中的忧虑。让我们一起摆脱手动测试的繁琐枷锁,拥抱自动化带来的自由吧!
|
28天前
|
机器学习/深度学习 SQL 安全
如何确保自动化安全测试的全面性和准确性
确保自动化安全测试的全面性和准确性,需集成多种工具(如SAST、DAST、IAST、SCA),编写自动化测试脚本,融入CI/CD流程,定期更新测试用例和工具,使用真实数据,持续维护代码,模拟攻击场景,运用机器学习,采用智能测试平台,并结合手动测试。这些策略有助于及时发现并修复安全问题,提升软件安全性。
|
27天前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法。本文介绍 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,同时提供 Python 实现示例,强调其在确保项目性能和用户体验方面的关键作用。
29 6
|
1月前
|
安全 前端开发 测试技术
如何选择合适的自动化安全测试工具
选择合适的自动化安全测试工具需考虑多个因素,包括项目需求、测试目标、系统类型和技术栈,工具的功能特性、市场评价、成本和许可,以及集成性、误报率、社区支持、易用性和安全性。综合评估这些因素,可确保所选工具满足项目需求和团队能力。
|
1月前
|
机器学习/深度学习 SQL 安全
如何确保自动化安全测试的全面性和准确性?
如何确保自动化安全测试的全面性和准确性?
|
1月前
|
前端开发 数据可视化 搜索推荐
深入剖析极态云优雅的前端框架设计方案(上)
最近在体验极态云,这款低代码软件开发产品,发现其前端框架设计方案很优雅很强大! 在接下来的学习过程中,我将持续输出自己对极态云前端框架设计方案的深入理解,包括具体的使用技巧、优势分析以及可能的应用场景等方面的内容,希望能为大家提供有价值的参考。