前端自动化测试:Vue 应用测试

开发 前端 自动化
测试不仅能够验证软件功能、保证代码质量,也能够影响软件开发的模式。TDD(Test-driven development),就是测试驱动开发,是敏捷开发中的一项核心实践和技术,也是一种软件设计方法论。

[[408453]]

项目环境搭建

运行 vue create [project-name] 来创建一个新项目。选择 "Manually selectfeatures" 和 "UnitTesting",以及 "Jest" 作为 test runner。

一旦安装完成,cd 进入项目目录中并运行 yarn test:unit。

通过 jest 配置文件:

\jest.config.js ==> node_modules\@vue\cli-plugin-unit-jest\jest-preset.js ==> \node_modules\@vue\cli-plugin-unit-jest\presets\default\jest-preset.js

jest-preset.js 文件就是 Vue 项目创建后,默认的 jest 配置文件:

module.exports= { 
  // 可加载模块的后缀名 
  moduleFileExtensions: [ 
    'js'
    'jsx'
    'json'
    // tell Jest to handle *.vue files 
    'vue' 
  ], 
  // 转换方式 
  transform: { 
    // process *.vue files with vue-jest 
    // 如果.vue结尾的,使用vue-jest进行转换 
    '^.+\\.vue$': require.resolve('vue-jest'), 
    '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$'
    require.resolve('jest-transform-stub'), 
    '^.+\\.jsx?$': require.resolve('babel-jest'
  }, 
  // 转换时忽略文件夹 
  transformIgnorePatterns: ['/node_modules/'], 
  // support the same @ -> src alias mapping in source code 
  // webpack 的别名映射转换 
  moduleNameMapper: { 
    '^@/(.*)$':'<rootDir>/src/$1' 
  }, 
  // 指定测试环境为 jsdom  
  testEnvironment:'jest-environment-jsdom-fifteen'
 
  // serializer for snapshots 
  // 快照序列化器 
  // 使用 jest-serializer-vue 进行组件快照的序列化方式 
  // 就是将组件转为字符串,后面进行快照测试时,就可以看到了 
  snapshotSerializers: [ 
    'jest-serializer-vue' 
  ], 
 
  // 测试代码文件在哪里 
  testMatch: [ 
    '**/tests/unit/**/*.spec.[jt]s?(x)'
    '**/__tests__/*.[jt]s?(x)' 
  ], 
  // https://github.com/facebook/jest/issues/6766 
  testURL:'http://localhost/'
  // 监视模式下的插件 
  watchPlugins: [ 
    require.resolve('jest-watch-typeahead/filename'), 
    require.resolve('jest-watch-typeahead/testname'
  ] 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.

快速体验

默认测试用例:tests\unit\example.spec.js

//tests\unit\example.spec.js 
// 导入组件挂载器,不用手动写vue入口 
import { shallowMount } from'@vue/test-utils' 
// 导入要测试的组件 
import HelloWorld from'@/components/HelloWorld.vue' 
 
describe('HelloWorld.vue', () => { 
  it('rendersprops.msg when passed', () => { 
    const msg ='newmessage' 
    const wrapper =shallowMount(HelloWorld, { 
      props: { msg } 
    }) 
    expect(wrapper.text()).toMatch(msg) 
  }) 
}) 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
$ npm runtest:unit 
  • 1.

搭建完基本的 Vue 测试环境,在正式开始 Vue 测试之前,我们先了解一下测试开发的方法。

测试开发方式

测试不仅能够验证软件功能、保证代码质量,也能够影响软件开发的模式。

测试开发有两个流派:

  • TDD:测试驱动开发,先写测试后实现功能
  • BDD:行为驱动开发,先实现功能后写测试

什么是TDD

TDD(Test-driven development),就是测试驱动开发,是敏捷开发中的一项核心实践和技术,也是一种软件设计方法论。

它的原理就是在编写代码之前先编写测试用例,由测试来决定我们的代码。而且 TDD 更多地需要编写独立的测试用例,比如只测试一个组件的某个功能点,某个工具函数等。

TDD开发流程:

  • 编写测试用例
  • 运行测试
  • 编写代码使测试通过
  • 重构/优化代码
  • 新增功能,重复上述步骤
// tests\unit\example.spec.js 
// 导入组件挂载器,不用手动写vue入口 
import { shallowMount } from'@vue/test-utils' 
// 导入要测试的组件 
import HelloWorld from'@/components/HelloWorld.vue' 
 
import {addfrom'@/utiles/math.js' 
// 输入:1,2 
// 输出:3 
test('sum', () => { 
  expect(add(1,2)).toBe(3) 
}) 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

单纯运行测试代码肯定报错,有了测试代码,为了通过测试,再具体写 math 模块中的 add() 方法:

// math.js 
functionadd (a, b) { 
  return a + b 

exportdefault add 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

Vue 3 的 TDD 测试用例

src\components\TodoHeader.vue 组件内容

<template> 
  <header> 
   <h1>Todos</h1> 
    <input  
     v-model="inputValue" 
     placeholder="What needs to be done?" 
     data-testid="todo-input" 
     @keyup.enter="handleNewTodo" 
    /> 
 </header> 
</template> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

测试用例:

tests\unit\example.spec.js

// 导入组件挂载器,不用手动写vue入口 
import { shallowMount } from'@vue/test-utils' 
// 导入要测试的组件 
import HelloWorld from'@/components/HelloWorld.vue' 
 
import TodoHeader from'@/components/TodoHeader.vue' 
test('unit: new todo',async () => { 
  const wrapper =shallowMount(TodoHeader) // 挂载渲染组件 
  const input = wrapper.find('[data-testid="todo-input"]') // 查找input 
  // 给input设置一个值 
  const text ='helloworld' 
  await input.setValue(text) 
  // 触发事件 
  await input.trigger('keyup.enter'
  // ========= 
  // 以上是具体操作,输入内容按下回车后,希望做什么?↓👇 
  // ========= 
 
  // 验证应该发布一个对外的 new-todo 的事件 
  expect(wrapper.emitted()['new-todo']).toBeTruthy() 
  // 验证导出事件的参数是否是传入的值 
  expect(wrapper.emitted()['new-todo'][0][0]).toBe(text) 
  // 验证文本框内容是否清空 
  expect(input.element.value).toBe(''
 
}) 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.

src\components\TodoHeader.vue 组件内容

exportdefault { 
  data(){ 
    return { 
      inputValue:'' 
    } 
  }, 
  methods:{ 
    handleNewTodo(){ 
      if(this.inputValue.trim().length){ 
        // 发布对外的 new-todo 事件值为文本框输入内容 
        this.$emit('new-todo',this.inputValue) 
        this.inputValue='' 
      } 
    } 
  } 
}; 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

 

责任编辑:姜华 来源: 勾勾的前端世界
相关推荐

2021-06-26 07:40:21

前端自动化测试Jest

2023-05-18 14:01:00

前端自动化测试

2021-06-25 10:57:30

前端自动化测试开发

2022-09-14 10:00:12

前端自动化测试

2011-04-18 12:52:37

自动化测试功能测试软件测试

2016-09-26 16:42:19

JavaScript前端单元测试

2011-12-23 17:09:57

自动化测试

2012-12-24 22:54:31

2014-04-16 14:15:01

QCon2014

2010-09-08 15:25:09

自动化测试技术网站链接测试

2011-08-16 15:36:47

iPhone应用测试

2021-07-02 17:22:50

前端TDDBDD

2017-01-16 13:38:05

前端开发自动化

2022-02-17 10:37:16

自动化开发团队预测

2012-02-27 17:34:12

Facebook自动化

2021-09-03 09:56:18

鸿蒙HarmonyOS应用

2013-05-16 10:58:44

Android开发自动化测试

2009-08-19 09:00:48

单元测试框架自动化测试

2024-11-01 15:05:12

2022-09-14 23:14:26

前端自动化测试工具
点赞
收藏

51CTO技术栈公众号