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

项目环境搭建

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

我们提供的服务有:网站设计、成都网站设计、微信公众号开发、网站优化、网站认证、邵东ssl等。为成百上千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的邵东网站制作公司

一旦安装完成,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 配置文件:

 
 
 
 
  1. module.exports= { 
  2.   // 可加载模块的后缀名 
  3.   moduleFileExtensions: [ 
  4.     'js', 
  5.     'jsx', 
  6.     'json', 
  7.     // tell Jest to handle *.vue files 
  8.     'vue' 
  9.   ], 
  10.   // 转换方式 
  11.   transform: { 
  12.     // process *.vue files with vue-jest 
  13.     // 如果.vue结尾的,使用vue-jest进行转换 
  14.     '^.+\\.vue$': require.resolve('vue-jest'), 
  15.     '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 
  16.     require.resolve('jest-transform-stub'), 
  17.     '^.+\\.jsx?$': require.resolve('babel-jest') 
  18.   }, 
  19.   // 转换时忽略文件夹 
  20.   transformIgnorePatterns: ['/node_modules/'], 
  21.   // support the same @ -> src alias mapping in source code 
  22.   // webpack 的别名映射转换 
  23.   moduleNameMapper: { 
  24.     '^@/(.*)$':'/src/$1' 
  25.   }, 
  26.   // 指定测试环境为 jsdom  
  27.   testEnvironment:'jest-environment-jsdom-fifteen', 
  28.  
  29.   // serializer for snapshots 
  30.   // 快照序列化器 
  31.   // 使用 jest-serializer-vue 进行组件快照的序列化方式 
  32.   // 就是将组件转为字符串,后面进行快照测试时,就可以看到了 
  33.   snapshotSerializers: [ 
  34.     'jest-serializer-vue' 
  35.   ], 
  36.  
  37.   // 测试代码文件在哪里 
  38.   testMatch: [ 
  39.     '**/tests/unit/**/*.spec.[jt]s?(x)', 
  40.     '**/__tests__/*.[jt]s?(x)' 
  41.   ], 
  42.   // https://github.com/facebook/jest/issues/6766 
  43.   testURL:'http://localhost/', 
  44.   // 监视模式下的插件 
  45.   watchPlugins: [ 
  46.     require.resolve('jest-watch-typeahead/filename'), 
  47.     require.resolve('jest-watch-typeahead/testname') 
  48.   ] 

快速体验

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

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

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

测试开发方式

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

测试开发有两个流派:

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

什么是TDD

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

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

TDD开发流程:

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

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

 
 
 
 
  1. // math.js 
  2. functionadd (a, b) { 
  3.   return a + b 
  4. exportdefault add 

Vue 3 的 TDD 测试用例

src\components\TodoHeader.vue 组件内容

 
 
 
 
  1.  

测试用例:

tests\unit\example.spec.js

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

src\components\TodoHeader.vue 组件内容

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

新闻标题:前端自动化测试:Vue应用测试
转载源于:http://www.shufengxianlan.com/qtweb/news38/22888.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联