【测试与自动化】介绍-框架-Jest-覆盖率-异步代码-e2e-Vue测试

这篇具有很好参考价值的文章主要介绍了【测试与自动化】介绍-框架-Jest-覆盖率-异步代码-e2e-Vue测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


软件测试和自动化测试介绍

了解什么是软件测试,以及自动化方式的测试

什么是软件测试?

定义:

在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。

目的:

促进目标鉴定软件的正确性、完整性、安全性和质量。

本质:

其实是对软件的 ”预期输出“ 与 ”实际输出“ 之间的比较过程

常用测试方法:

  1. 黑盒测试:主要以用户的视角来测试程序的功能,所以也称功能测试

  2. 白盒测试:主要测试程序的代码逻辑,所以也称代码测试

什么是自动化测试?

早先的软件测试工作大都由人来手工完成,其过程极度重复、枯燥、易出错。

而自动化测试则利用程序来模拟人工操作,有效规避了以上问题。

自动化测试的分类:

  1. 单元测试:属于一种白盒测试,即编写代码来对项目中的小部件代码进行测试(比如一个函数)

  2. 集成测试:属于一种白盒测试,即在单元测试基础上,将模块按设计要求组装为子系统或完整系统进行测试

  3. e2e测试:属于一种黑盒测试,即编写自动化脚本模拟用户操作,检测界面间通信、数据传递等是否如预期

  4. 快照测试:属于一种黑盒测试,即事先准备好理想中的参考文件(参考照片),然后再去访问程序并记录当前界面内容(临场拍照),最后比对两者内容是否一致


前端自动化测试框架

了解目前流行的几个用于前端的自动化测试框架

完整的自动化测试框架应包含以下 3 个部分:

  1. 断言库(Assertion Library):用于比对 ”预期输出“ 和 ”实际输出“,并抛出错误
  2. 模拟库(Mock Library):用于模拟数据对象、网络接口等
  3. 测试运行器(Test Runner):用于运行测试代码

一、常用前端单元测试框架:

  1. Jest(完整测试框架)

    • 一个由 Facebook 开源的测试框架,比较新而且目前也比较火
    • 功能全面
    • 零配置
  2. Mocha(核心测试框架)

    • 一个比较成熟的测试框架,社区很大
    • 功能单一但非常灵活,能轻易与其他库结合,比如:Chai(断言库)、Karma(测试运行器)
    • 对异步代码的测试支持的非常好

二、常用的e2e测试框架:

  1. Cypress.io

  2. Puppeteer
    vue覆盖率工具,# 【Jest自动化测试】,自动化,vue.js,单元测试


使用Jest编写单元测试

使用 Jest 框架来编写单元测试的基本用法

核心内容:

  1. jest 的基本用法

Jest会自动识别和执行项目中所有以.test.js为后缀的测试代码文件。

具体步骤:

  1. 新建项目并安装 jest
npm i jest --save-dev
  1. 编写一些功能代码(先使用 CommonJS 模块,因为用 ESM 需要借助 Babel,后面会举例)

src/util.js

function toUpperCase(str) {
    return str ? str.toUpperCase() : ""
}

module.exports = {
    toUpperCase
}
  1. 编写用于测试以上代码的 jest 测试代码

jest 提供的常用测试函数:

  • test():创建测试用例,代表一个要测试的场景
  • expect():创建匹配器,并利用 .toBe().toEqual() 等方法进行数据比对

src/util.test.js

// 导入要测试的模块
const { toUpperCase } = require('./util')

// 测试用例1:传入参数 'hello',返回 'HELLO'
test('hello to HELLO', () => {
  expect(toUpperCase('hello')).toBe('HELLO')
})

// 测试用例2:传入参数 null,返回 ''
test('null to whitespace', () => {
  expect(toUpperCase(null)).toBe('')
})
  1. 执行测试
npx jest

运行结果:
vue覆盖率工具,# 【Jest自动化测试】,自动化,vue.js,单元测试

如果目标代码使用了 ESM 模块化,那测试代码也需用 ESM。这时需要安装配置 Babel 进行支持:

  1. 安装 babel
npm i babel-jest @babel/core @babel/preset-env --save-dev
  1. 创建 babel.config.js
module.exports = {
    presets: [
        ['@babel/preset-env', {
            targets: {
                node: 'current'
            }
        }]
    ],
};
  1. 在测试代码中使用 import 导入目标测试代码
import { toUpperCase } from './util'

统计测试覆盖率

了解测试覆盖率的含义和功能

测试覆盖率,也叫代码覆盖率,指的是被测试的目标代码中至少被执行了一次的条目数占所有条目数的百分比。

它是衡量测试的充分性和完整性的重要指标。

vue覆盖率工具,# 【Jest自动化测试】,自动化,vue.js,单元测试

覆盖率根据统计条目的类型,细分为:

  • 语句覆盖率:以代码语句为最小单位
  • 路径覆盖率:以逻辑路径为最小单位
  • 函数覆盖率:以函数为最小单位
  • 代码行覆盖率:以代码行为最小单位

vue覆盖率工具,# 【Jest自动化测试】,自动化,vue.js,单元测试

统计代码覆盖率的目的:

  • 找出遗漏的测试场景
  • 找出没用到的代码

常用工具

  • Jest - 自带了覆盖率统计工具
  • Karma - 借助第三方库 Istanbul

具体步骤

  1. 在上一章节代码中,执行以下命令生成覆盖率报告
npx jest --coverage

运行结果:
在这里插入图片描述
vue覆盖率工具,# 【Jest自动化测试】,自动化,vue.js,单元测试

另外会生成一个包含 html 格式覆盖率报告的 coverage 目录。


使用Jest测试异步代码

测试包含有如网络请求、定时器等异步行为的目标代码

核心内容:

  1. jest 处理异步代码的方式

方式一:回调风格

通过 test() 的回调函数参数 done (它也是个函数,调用它即可告知完成异步任务)

test('some desc', done => {
  someAsyncTask(data => {
    try {
      expect(data).toBe('....')
      done()
    } catch(e) {
      done(e)
    }
  })
})

方式二:Promise/async + await 风格

通过在 test() 的回调函数中返回一个 promise 对象

test('some desc', () => {
  return someAsyncTask().then(data => {
    expect(data).toBe('...')
  })
}) 

或直接用 async/await

test('some desc', async () => {
  const data = await someAsyncTask()
  expect(data).toBe('...')
}) 

具体步骤:

  1. 在上一章节代码基础上,安装 axios 包,并在 src/util.js 中编写一个网络接口调用函数
npm i axios --save

src/util.js

import axios from 'axios'

export function getRemoteData() {
    const url = 'http://www.liulongbin.top:3006/api/getbooks'
    return axios.get(url).then(res => res.data)
}
  1. src/util.test.js 测试代码中添加新的测试用例:
import { toUpperCase, getRemoteData } from './util'

// 测试用例3:获取异步数据
test('get remote data', async () => {
    // 测试返回 promise 的异步代码,必须要返回 promise 对象
    // 这样才能让测试正确结束
    const data = await getRemoteData()
    expect(data.status).toBe(200)
})

使用Cypress进行e2e测试

安装和使用 Cypress 进行端到端测试

核心内容:

  1. 安装和启动 Cypress
  2. 编写和运行 Cypress 测试代码

具体步骤:

  1. 安装 Cypress
  npm i cypress --save-dev
  1. 打开 Cypress
npx cypress open

Cypress 会搜索到用户电脑上的所有浏览器,供测试时选用:

  1. 创建e2e测试

测试文件名请按 xxx.spec.js 这种命名规则。

  1. 编写测试代码

e2e测试的本质其实就是模拟用户操作,即用户是如何使用网页界面的。所以 e2e 测试代码就是在利用各种 API 操作网页而已。

Cypress 使用了 Mocha + Chai,因此编写测试代码时用的是来自这两个库的函数,如: describeitexpect 等。

/// <reference types="cypress" />

describe('测试百度搜索功能', () => {

  // 每个测试用例都会执行的前置行为
  beforeEach(() => {
    // 打开百度首页
    cy.visit('https://www.baidu.com')
  })

  // 一个测试用例
  it('应该得到搜索结果', () => {
    // 获取百度首页的关键字输入框,并输入关键字
    cy.get('#kw').type('前端e2e测试')

    // 获取百度首页的搜索按钮,并点击
    cy.get('#su').click()

    // 对比结果
    cy.get('.nums_text').should('have.text', '百度为您找到相关结果约3,190,000个')
  })
})
  1. 点击用例,运行测试
    vue覆盖率工具,# 【Jest自动化测试】,自动化,vue.js,单元测试

测试 Vue 项目

介绍针对 Vue 开发的应用代码进行自动化测试的工具

核心内容:

  1. 针对 Vue 代码的测试工具介绍
  2. 在 Vue 代码中添加测试工具,并编写测试案例

Vue的代码测试涉会及到以下三类:

  • 单元测试(测试函数)- 可使用 Jest 或 Mocha,官方提供了相关插件,可查看官方文档
  • 组件测试(测试Vue组件)- 官方推荐使用 Vue Test Utils 或它的进一步封装库 Vue Testing Library
  • e2e测试(测试界面)- 可使用专为 Vue 封装的 Cypress

具体步骤:

一、测试 Vue 组件

  1. 在现有的 Vue CLI 项目中,通过 vue-cli 提供的命令添加 Vue Testing Library
# 单元测试
vue add @vue/unit-jest

# 端到端测试
vue add @vue/e2e-cypress

执行后项目中会新增测试专用目录 tests
vue覆盖率工具,# 【Jest自动化测试】,自动化,vue.js,单元测试

  1. 编写一个新组件Counter.vue,并在 App.vue 中调用

Counter.vue

<template>
  <div>
    <h1 class="title">
      当前计数:
      <span class="count">{{ count }}</span>
    </h1>
    <div>
      <button class="btn decrease" @click="decreaseHandler">减少</button>
      <button class="btn increase" @click="increaseHandler">增加</button>
    </div>
  </div>
</template>

<script>
  export default {
    props: {
      init: {
        type: Number,
        default: 0
      }
    },

    data() {
      return {
        count: this.init
      }
    },

    methods: {
      increaseHandler() {
        this.count += 1
      },

      decreaseHandler() {
        this.count -= 1
      }
    }
  }
</script>

<style>
  .count {
    color: red;
  }
</style>

App.vue中的调用:

<Counter :init="10"/>
  1. 针对 Counter.vue 组件,编写以下几个单元测试

tests/unit/count.spec.js

import Counter from '@/components/Counter.vue'
import { mount } from '@vue/test-utils'

describe('Counter.vue', () => {

  it('不传 init 属性时显示的初始计数是 0', () => {
    // 渲染组件
    const wrapper = mount(Counter)
    // 获取组件内的数据
    expect(wrapper.vm.count).toBe(0)
  })

  it('传入 init 属性值为 10 时显示的初始计数是 10', () => {
    const wrapper = mount(Counter, {
      // 为组件传入属性
      propsData: {
        init: 10
      }
    })
    expect(wrapper.vm.count).toBe(10)
  })

  it('点击 3 下增加按钮及 1 下减少按钮,当前计数增加 2', () => {
    const wrapper = mount(Counter)

    // 获取组件内的元素
    const btnIncrease = wrapper.find('.increase')
    const btnDecrease = wrapper.find('.decrease')

    // 模拟用户点击
    btnIncrease.trigger('click')
    btnIncrease.trigger('click')
    btnIncrease.trigger('click')
    
    btnDecrease.trigger('click')

    // 比对数据
    expect(wrapper.vm.count).toBe(2)
  })
})
  1. 运行单元测试
npm run test:unit

在以上单元测试中进行数据比对时,都从组件的实例(vm 对象)上获取数据来进行比对,但有时我们想测试的是界面是否已渲染成我们期望的内容,这时应该这样写:

it('点击 3 下增加按钮及 1 下减少按钮,当前计数增加 2', async () => {
  const wrapper = mount(Counter)

  // 获取组件内的元素
  const btnIncrease = wrapper.find('.increase')
  const btnDecrease = wrapper.find('.decrease')

  // (修改点1)模拟用户点击(使用 await)
  await btnIncrease.trigger('click')
  await btnIncrease.trigger('click')
  await btnIncrease.trigger('click')
  await btnDecrease.trigger('click')

  // (修改点2)获取界面上的内容来进行数据比较
  expect(wrapper.get('.count').text()).toBe('2')
})

说明:此处使用 await 是因为 click 事件是异步的,这样才能在异步行为发生后正确获取重新渲染后的界面内容。

二、e2e 测试

在 vue 中进行 e2e 测试其实和直接使用 Cypress 没有太大差别。文章来源地址https://www.toymoban.com/news/detail-595056.html

  1. 通过以下命令启动 Cypress
npm run test:e2e
  1. 和之前一样,编写和运行 Cypress 测试脚本即可

到了这里,关于【测试与自动化】介绍-框架-Jest-覆盖率-异步代码-e2e-Vue测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 开源自动化测试框架介绍

    框架在精而不在多,毕竟还是得以我们测试工程师平常用的最多的为基准。精通以下7个框架,应该能满足你工作中的基本需求了。 https://junit.org/junit5/ Junit是一个面向Java编程语言的单元测试框架。 单元测试:针对最小的功能单元编写测试代码。Java程序最小的功能单元是方法

    2024年02月12日
    浏览(39)
  • UI自动化概念 + Web自动化测试框架介绍

    UI,即(User Interface简称UI用户界面)是系统和用户之间进行交互和信息交换的媒介 UI自动化测试: Web自动化测试和移动自动化测试都属于UI自动化测试,UI自动化测试就是借助自动化工具对程序UI层进行自动化的测试 从不同的阶段或层次来说,自动化测试可以分为单元测试、接口

    2024年02月08日
    浏览(70)
  • Ui自动化概念+Web自动化测试框架介绍

    目录 UI 1.UI自动化测试概念:我们先明确什么是UI 2.为什么对UI采用自动化测试? 3.什么项目适合做UI自动化测试? 4.UI自动化测试介入时机 5.UI自动化测试所属分类 Web自动化测试框架介绍 2.Selenium框架介绍及特点: Web自动化测试环境搭建 2.元素定位(一) idclassname,tagname定位 link text与

    2023年04月21日
    浏览(54)
  • vue3配置jest自动化测试

    前排提醒,并不是所有的项目都需要单元测试,因为写单元测试真的很耗时间。单元测试主要针对需求变更不多,项目时间充裕的项目。如elementui这种框架类的项目 本文主要针对vue3+vuecli4 这里主要有两种情况:新建项目和老项目 对于新建项目,在通过脚手架生成时可选择

    2024年02月12日
    浏览(46)
  • Python自动化测试框架:unittest介绍

    Unittest是Python中最常用的测试框架之一,它提供了丰富和强大的测试工具和方法,可以帮助开发者更好地保证代码质量和稳定性,本文就来介绍下Unittest单元测试框架。 unittest是Python的单元测试框架,它提供了一套丰富的测试工具和方法,包括测试用例、测试套件、断言、测试

    2024年02月05日
    浏览(57)
  • Jest | 测试框架实战之-测试用例编写与覆盖率解读

    通常写完库的测试用例,总要跑跑覆盖率,看看测试用例写得如何,jest刚好也支持查看覆盖率,对应的指令是:jest --coverage。当然在继续往下看,如果还没搭建jest环境,可以先搭建,毕竟实践出真知。 如何编写测试用例,已经存在很多教程,官方也有非常多例子,因此这里

    2024年02月03日
    浏览(46)
  • 前端自动化测试(二)Vue Test Utils + Jest

    项目会从快速迭代走向以维护为主的状态,因此引入自动化测试能有效减少人工维成本 。 自动化的收益 = 迭代次数 * 全手动执行成本 - 首次自动化成本 - 维护次数 * 维护成本 对于自动化测试,相对于发现未知问题,更倾向于避免可能的问题。 (1) 单元测试 单元测试(unit t

    2024年02月08日
    浏览(41)
  • Selenium基础 — Selenium自动化测试框架介绍

    Selenium是一个用于Web应用程序测试的工具。 只要在测试用例中把预期的用户行为与结果都描述出来,我们就得到了一个可以自动化运行的功能测试套件。 Selenium测试套件直接运行在浏览器中,就像真正的用户在操作浏览器一样。 Selenium也是一款同样使用Apache License 2.0协议发布

    2024年02月02日
    浏览(53)
  • 【web自动化测试】入门篇 01—— 框架介绍

    web自动化测试作为软件自动化测试领域中绕不过去的一个“香饽饽”,通常都会作为广大测试从业者的首选学习对象,相较于C/S架构的自动化来说,B/S有着其无法忽视的诸多优势,从行业发展趋、研发模式特点、测试工具支持,其整体的完整生态已经远远超过了C/S架构方面的

    2024年02月09日
    浏览(45)
  • Selenium浏览器自动化测试框架详解_selenium 测试框架介绍

    先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年最新软件测试全套学习资料》

    2024年04月25日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包