image.png

单元测试: 组件、函数等级别进行测试

针对组件 或者函数 或者模块 (开发人员知道具体逻辑)

在tests=>unit>example.spec.js

1. 测试函数级别:测试一个简单的加法函数

  1. import {add} from '../../src/util'
  2. // 测试的核心逻辑: 看输入和输出
  3. describe('测试加法函数',() = > {
  4. // 分组
  5. it('一个具体的功能测试,测试数字相加',()=>{
  6. expect( add(1,2) ).toBe(3)
  7. })
  8. it('一个具体的功能测试,测试数字和字符串相加',()=>{
  9. expect( add('a',2) ).toBe('a2')
  10. })
  11. it('一个具体的功能测试,测试数字字符串相加',()=>{
  12. expect( add('1','2') ).toBe('3')
  13. })
  14. })

运行单元测试

npm run test:unit

API 介绍

  • describe : 定义一个测试套件
  • it :定义一个测试用例
  • expect : 断言的判断条件
  • toBe : 断言的预期结果(比较结果)

    2. 测试组件:


    新建 Helloween.spec.js ```javascript // 测试Vue组件,需要用到Vue,其实就是在node层 解析组件 import Vue from ‘vue’ import Hello from ‘../../src/components/Hello.vue’

describe(‘测试Hello组件’, ()=>{

it(‘测试初始的data’, ()=>{ expect( Hello.data().message).toBe(‘Hello world!’) })

it(‘测试新建完毕,create生命周期后的数据’, ()=>{ let vm = new Vue( Hello).$mount() expect(vm.message).toBe(‘aftermounted’) })

})

  1. <a name="YofXQ"></a>
  2. ### 3. 使用Vue官方文档中的单元测试
  3. > npm install [@vue/test-utils](#) --save
  4. ```javascript
  5. // 测试Vue组件,需要用到Vue,其实就是在node层 解析组件
  6. import Vue from 'vue'
  7. import Hello from '../../src/components/Hello.vue'
  8. import {mount} from '@vue/test-utils'
  9. describe('测试Hello组件', ()=>{
  10. it('测试初始的data', ()=>{
  11. expect( Hello.data().message).toBe('Hello world!')
  12. })
  13. it('测试新建完毕,create生命周期后的数据', ()=>{
  14. let vm = new Vue( Hello).$mount()
  15. expect(vm.message).toBe('aftermounted')
  16. })
  17. it('测试按钮点击后,message改变', ()=>{
  18. let wrapper = mount(Hello)
  19. expect(wrapper.vm.message).toBe('aftermounted')
  20. // 点击一下
  21. wrapper.find('.btn').trigger('click')
  22. expect(wrapper.vm.message).toBe('click me')
  23. })
  24. })

4. 显示测试报告(测试覆盖率)

package.json

  1. "jest":{
  2. // ***新增***
  3. "collectCoverage": true,
  4. "collectCoverageFrom":["src/**/*.{js|vue}"],
  5. // 不动
  6. "moduleFileExtensions":[
  7. "js",
  8. "jsx",
  9. "json",
  10. "vue"
  11. ]
  12. }

husky

测试未通过,提交不成功,为保证提交的代码都是通过测试的

  1. 安装husky

    npm intsall husky —save

  2. 配置package.json

    1. "husky":{
    2. "hooks": {
    3. // 钩子在commit之前,运行此命令
    4. "pre-commit": "npm run test:unit"
    5. }
    6. }

    E2E测试

    针对应用,站在测试人员的角度 没有什么mount加载,只有页面 按钮 输入框 文本等

启动命令:npm run test:e2e
tests=> e2e => specs => test.js

  1. describe('index page', () => {
  2. it('visit index page url ', ()=> {
  3. // 访问根目录
  4. cy.visit('/')
  5. cy.contains('h1','Welcom to your page')
  6. })
  7. it('测试about页面',()=>{
  8. cy.visit('/about')
  9. cy.contains('h1','This is an about page')
  10. })
  11. it('hello组件页面渲染的结果',()=>{
  12. cy.visit('/')
  13. cy.contains('#message','aftermounted')
  14. cy.get('button').click()
  15. cy.contains('#message','click me')
  16. })
  17. })

测试中间件

test=> hello.test.js

  1. const request = require('supertest')
  2. const assert = require('assert')
  3. const Koa = require('koa')
  4. describe('测试Koa',()=>{
  5. let app1 = new Koa()
  6. app1.context.msg = 'welcome'
  7. it('测试ctx的信息', ()=>{
  8. app1.use((ctx,next)=>{
  9. assert.equal(ctx.msg, 'hello')
  10. })
  11. // node 启动 koa
  12. return request(app1,listen())
  13. .get('/')
  14. .expect('text koa')
  15. })
  16. })

test=> mid.test.js

  1. const request = require('supertest')
  2. const assert = require('assert')
  3. const Koa = require('Koa')
  4. decribe('中间件 app.use',()=>{
  5. const app = new Koa()
  6. const calls = []
  7. app.use( async(ctx, next)=>{
  8. calls.push(1)
  9. await next()
  10. calls.push(6)
  11. })
  12. app.use( async(ctx, next)=>{
  13. calls.push(2)
  14. await next()
  15. calls.push(5)
  16. })
  17. app.use( async(ctx, next)=>{
  18. calls.push(3)
  19. await next(
  20. calls.push(4)
  21. })
  22. await request(app.listen())
  23. .get('/')
  24. // 状态码是404
  25. .expect(404)
  26. assert.equal(calls.join(','),'1,2,3,4,5,6')
  27. })