探索前端测试框架:全面认知与实践指南-认知篇

进入正文之前,我们首先需要思考几个问题:

  • 为什么需要测试?
  • 测试有哪几个阶段?
  • TDD和BDD项目驱动模式
  • 单元测试对于前端的重要性
  • 软件开发模型和自动化测试
  • 前端测试框架

为什么需要测试

  • 保证产品质量、及时解决bug
    • 前端代码与用户直接进行交互,任何逻辑错误或者界面错误都会造成用户体检的下降。提前对软件进行测试,不但可以发现并修复问题缺陷、性能瓶颈和UX/UI问题,保证了参与的稳定性和体验感
  • 预防回归错误
    • 在软件测试领域,回归错误(regression bug或 regression fault)是指在解决一个bug之后,原本没正常的功能出现了问题或者bug。通过进行测试,可以在修改代码后立即运行这些测试来验证现有功能是否仍然正常工作,防止回归错误的发生。
  • 提高跨平台兼容性
    • 前端代码需要在不同浏览器、环境和操作系统下保持一致的行为,通过自动化测试,可以方便跨浏览器和设备测试,确保代码在不同平台上运行的稳定性和一致性
  • 降低维护成本
    • 软件维护成本是需要进行测试的一个重要因素,如果软件存在缺陷和问题,如果软件在上线后才发现问题并去修复,整个维护成本将会变得非常高。一般来说,一个项目越到后期,修复一个bug的成本越高,因此通过测试可以帮助开发团队在软件上线前及时发现和修复bug,从而减低维护成本。

测试有哪几个阶段

  • 静态测试
  • 单元测试
  • 集成测试
  • E2E测试
    前端测试各个阶段

静态测试

  • 前端的静态测试不会设计到代码的运行,他是在代码编写过程对代码进行检查和分析,捕获编写代码中可能出现的语法错误或错别字,常用的工具有Typescript和Eslint静态测试。他们两个都可以在编写代码过程中检查编程语句的语法错误或拼写错误,给出错误提示。
// 使用 ESLint 的 for-direction 规则能让你更早的发现问题
for (var i = 0; i < 10; i--) {
  console.log(i)
}

const two = "2";
// 使用 typescript 的静态检查功能也是能够提前发现问题
const result = add(1, two);

单元测试

  • 单元测试往往是为了检验某一单独部分能否正常工作,是测试过程中的最小测试单元(通常是一个方法或者函数),所以单元测试顾名思义就是通过测试示例检验某个函数或者方法的可行性,能够通过单元测试,说明方法的可行性和稳定性。
// 这是一个函数,该函数是对传入的两个参数做相加操作
function calculateSum(a, b) {
  return a + b;
}

// 接下来我们要对上面的函数进行一个测试
describe("calculateSum", function() {
  // 这个就是一个测试用例
  it("should add two numbers correctly", function() {
    expect(calculateSum(1, 2)).toEqual(3); // 期望传入 1,2 的时候得到的值为 3 
    expect(calculateSum(3, 4)).toEqual(7); // 期望传入 3,4 的时候得到的值为 7
  });
});
  • 因为单元测试往往是针对一个方法或者函数进行测试,且方法之间是相互独立的,因此在进行单元测试是往往需要屏蔽网络请求,连接数据库等通信功能,而使用Mock来模拟通信来完成单元测试

集成测试

  • 集成测试就是将之前检验完备的单元组合在一起集中检测,主要是观察各个单元组合之后能否正常工作。集成测试的主要目的是为了确保系统之间各个单元连接起来之后能够正常工作。
  • 不同单元测试,由于单元之间相互关联,因此在集成测试的时候会发送真实的网络请求,确保各个单元通信、协作时能够工作正常
// Express 里面的一个集成测试的示例
const request = require("supertest");
const app = require("./app");

describe("User API", function() {
  let userId;
	// 测试用例
  // 测试添加新的用户,测试的是一个功能,涉及到发送真实的请求
  it("should add a new user", function(done) {
    request(app)
      .post("/users")
      .send({ name: "Alice", email: "alice@example.com" })
      .expect(201)
      .end(function(err, res) {
        if (err) return done(err);
        userId = res.body.id;
        done();
      });
  });
	// ...
});

E2E测试

  • End to End 测试用称之为端到端测试,这种测试是为了测试整个软件系统各个功能的完整性,该测试会模拟用户行为和软件进行交互。相较于集成测试,E2E测试会测试更加完整的功能,更加像一个真实用户一样和软件进行交互。

下面时一个E2E测试示例:

import {generate} from 'todo-test-utils'

describe('todo app', () => {
  it('should work for a typical user', () => {
    const user = generate.user()
    const todo = generate.todo()
    cy.visitApp()
    cy.findByText(/register/i).click()
    cy.findByLabelText(/username/i).type(user.username)
    cy.findByLabelText(/password/i).type(user.password)
    cy.findByText(/login/i).click()
    cy.findByLabelText(/add todo/i)
      .type(todo.description)
      .type('{enter}')
    cy.findByTestId('todo-0').should('have.value', todo.description)
    cy.findByLabelText('complete').click()
    cy.findByTestId('todo-0').should('have.class', 'complete')
  })
})

上述代买完整的描述了一个用户方位app、注册身份信息、登录、创建待办事项、完成代办事项、最后验证应用程序的完整状态。这是一个典型的E2E测试用例,它会验证整个应用程序的功能和用户体验

TDD和BDD开发模式的区别

  • TDD:Test-Driven Development,测试驱动开发,TDD模式是一种以测试为中心的开发模式,强调在编写代码之前先编写测试用例,然后运行测试用例,测试用例跑通之后才开始正是的业务代码编写。
    1. 编写测试用例
const sum = require('../sum');

// 测试用例
test('adds 1 + 2 to equal 3', () => {
  expect(sum(1, 2)).toBe(3); // 期望传递 1,2 的时候得到 3
});

// 测试用例
test('adds 0 + 0 to equal 0', () => {
  expect(sum(0, 0)).toBe(0); // 期望传递 0,0 的时候得到 0
});

// 测试用例
test('adds -1 + 1 to equal 0', () => {
  expect(sum(-1, 1)).toBe(0); // 期望传递 -1, 1 的时候得到 0
});
2. 运行测试用例,如果测试用例无法跑通说明代码设计有问题,值得注意的是此时真实的代码并未开始编写,而是其他手段使用mock模拟去模拟函数实现或者模块实现。
3. 编写业务代码,通过编写实际的代码替换上一部分使用mock模拟的函数和实现。
  • BDD:Behavior-Driven Development,行为驱动开发,该开发模式通过用户行为来驱动软件开发,也就是说BDD关注的焦点不是技术上的细节而是用户行为和业务,更加注重协作和沟通。BDD用例一般会通过自然语言来编写,以便业务人员和QA也能够轻松读懂测试示例。
  • BDD测试用例一般采用Given-When-Then来描述测试用例。下面是一个基于Given-When-Then模式的测试用例。假设目前需要测试一个登录界面,登录界面包括用户名和密码输入框以及登录按钮
    • Given:用户打开登录界面,并且并没有输入任何内容
    • When: 用户输入错误的用户名和密码,然后点击登录
    • Then:页面显示错误提示信息"用户名或者密码错误"
      这是一种常见的模式,许多中小型企业在没有自动化测试框架的背景下,往往通过这种方式来测试软件

单元测试对于前端的重要性

不同的测试在这样形成一个测试金字塔测试金字塔
通常来说,软件开发过程中单元测试是做的最多的
从测试金字塔来看,越往上测试的成本越高,因为越到后期才发现的bug,程序员修复该bug所需的时间和精力是越大的,另外测试的运行速度是逐渐降低的。
相较于其他测试,单元测试有以下几个特点:
- 编写最容易
- 运行速度最快
- 反馈效果最好
所以我们写的最多的就是单元测试案例,身为前端开发,平时面对最多的就是组件开发,而组件又可以将其看作是最最基的测试单元,我们需要保证组件功能的完整性。

软件开发模型和自动化测试

事实上,软件开发模型就是软件开发流程的演变,经过多年的发展,演变出三个出色的软件开发模型:
- 瀑布开发模型
- 敏捷开发模型
- DevOps开发模型

瀑布开发模型

这是最早期的开发模型,整个瀑布模型由以下几个阶段组成:
瀑布模型的各个阶段

  • 需求分析: 在进行软件开发时,第一步要做的就是需求分析,明确软件开发有哪些需求,最终形成需求文档
  • 设计:需求分析完成之后就到设计阶段了,设计阶段又分为几个方面:
    • UI设计:UI设计师根据需求文档设计软件界面
    • 程序设计:程序员根据需求文档进行模块划分,有哪些接口,基本业务的处理流程划分
  • 编码和实现:根据设计好的方案编写代码
  • 测试: 根据书写的代码进行上线测试
  • 发布和维护:将测试好的代码发布线上,并根据具体的用户需求不断完善软件功能,提高软件稳定性
    瀑布开发模型作为最早期的开发模型,为后来的其他模型的发展提供了思路。

敏捷开发模型

敏捷开发模型是应对快速变化的需求环境和快速开发的应用场景基于瀑布模型所衍生出来的开发模型
下图是瀑布模型和敏捷模型的区别:
瀑布模型和敏捷模型的对比
在敏捷开发模型中,软件开发会被分解为一系列短周期的迭代,每个迭代都包括需求分析、设计、编码实现、测试和发布维护,这一系列流程,开发团队在迭代过程中不断与客户进行沟通和交流,随时根据客户的反馈进行方案的调整,确保软件开发方向的正确性。

DevOps开发模型

DevOps英文全称是:Development Operations(开发运维)
在DevOps模型中,我们需要做的只是通过自动化来实现软件的交付流程,让整体的构建、测试、发布更加快速和便捷
在这里插入图片描述

  • 持续开发:软件不断开发的阶段,整个软件交付的结果会被拆分成多个短周期的任务,每个任务完成后马上进行交付
  • 持续测试:这里采用自动化测试工具,对上一个步骤所交付的代码进行测试,自动跑一边测试用例
  • 持续集成:测试通过后,将新的代码集成到现有的软件上面
  • 持续部署:新的代码集成之后,接下来就是将新集成的代码进行部署,部署到各个系统环境中。
  • 持续监控:部署上线之后,对部署的代码进行持续的监控,以避免新部署代码出现任何问题

自动化测试

了解上述介绍的软件开发模型之后,那么自动化测试的概念就相当好理解了。自动化测试是DevOps开发模型的一个阶段,主要是指对新的代码通过一些自动化测试工具或框架进行一个全自动的测试操作 ,测试通过就进入下一个阶段。

前端测试框架

前面我们介绍了不同的测试 类型,不同的测试框架有不同的 测试重点。

  • jest: 是一个由FaceBook开发的JavaScript测试框架,它可以用来测试react应用程序,也可以用来测试其他类型的JavaScript应用程序。它具有简单易用、快速执行、自动断言等特点
  • Mocha:是一个强大的JavaScript测试框架,它可以测试任何类型的JavaScript应用程序,并且支持多种测试风格(TDD和BDD),具有丰富的插件和扩展功能。
  • Jasmine: 是一个行为驱动(BDD)测试框架,提供了一个便于阅读和编写测试的语法,可以运行在node和浏览器环境中,具有自动断言和Spy等特点
  • Cypress:是一个自动化的测试工具,专注于端到端(E2E)的功能测试,它具有简单易用、快速执行、可靠性高、可视化测试等特点,支持多个浏览器(Chrome/Firefox/Edge)
  • Puppeteer:是一个由Google开发的nodejs库,Puppeteer基于Chrome DevTools协议开发,可以完全控制Chrome和Chromium浏览器,包括页面的加载、截图、交互等操作。Puppeteer提供了一套稳定的api,可以确保测试结果的可靠性和稳定性。另外,Puppeteer不仅可以用来进行自动化测试,而且可以用于爬虫、性能测试、页面截图等各种场景。
  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值