js单元测试工具-jest自动化测试

时间: 2018-04-20阅读: 1322标签: 测试

概述

jest 是 facebook 开源的,用来进行单元测试的框架,可以测试 javascipt 和 react。 单元测试各种好处已经被说烂了,这里就不多扯了。重点要说的是,使用 jest, 可以降低写单元测试的难度。

单元测试做得好,能够极大提高软件的质量,加快软件迭代更新的速度, 但是,单元测试也不是银弹,单元测试做得好,并不是测试框架好就行,其实单元测试做的好不好,很大程度上取决于代码写的是否易于测试。 单元测试不仅仅是测试代码,通过编写单元测试 case,也可以反过来重构已有的代码,使之更加容易测试。

jest 的零配置思路是我最喜欢的特性。


安装方式

# yarn
yarn add --dev jest

# OR npm
npm install --save-dev jest


测试方式

随着 node.js 的发展,javascipt 语言的发展,前端可以胜任越来越多的工作,后端很多时候反而沦为数据库的 http API 所以前端不仅仅是测试看得见的页面,还有很多看不见的逻辑需要测试。

jest 提供了非常方便的 API,可以对下面的场景方便的测试


一般函数

对于一般的函数,参考附录中的 jest Expect API 可以很容易的写测试 case 待测试文件:joinPath.js

const separator = '/'
const replace = new RegExp(separator + '{1,}', 'g')
export default (...parts) => parts.join(separator).replace(replace, separator)

测试文件的命名:joinPath.test.js 采用这种命名,jest 会自动找到这个文件来运行

import joinPath from 'utils/joinPath'

test('join path 01', () => {
  const path1 = '/a/b/c'
  const path2 = '/d/e/f'

  expect(joinPath(path1, path2)).toBe('/a/b/c/d/e/f')
})

test('join path 02', () => {
  const path1 = '/a/b/c/'
  const path2 = '/d/e/f'

  expect(joinPath(path1, path2)).toBe('/a/b/c/d/e/f')
})

test('join path 03', () => {
  const path1 = '/a/b/c/'
  const path2 = 'd/e/f'

  expect(joinPath(path1, path2)).toBe('/a/b/c/d/e/f')
})


异步函数

上面的是普通函数,对于异步函数,比如 ajax 请求,测试写法同样容易 待测试文件:utils/client.js

export const get = (url, headers = {}) => {
  return fetch(url, {
    method: 'GET',
    headers: {
      ...getHeaders(),
      ...headers
    }
  }).then(parseResponse)
}

测试文件:client.test.js

import { get } from 'utils/client'

test('fetch by get method', async () => {
  expect.assertions(1)
  // 测试使用了一个免费的在线 JSON API
  const url = 'https://jsonip.com/'

  const data = await get(url)
  const { about } = data
  expect(about).toBe('/about')
})


测试的生命周期

jest 测试提供了一些测试的生命周期 API,可以辅助我们在每个 case 的开始和结束做一些处理。 这样,在进行一些和数据相关的测试时,可以在测试前准备一些数据,在测试后,清理测试数据。

4 个主要的生命周期函数:

  • afterAll(fn, timeout): 当前文件中的所有测试执行完成后执行 fn, 如果 fn 是 promise,jest 会等待 timeout 毫秒,默认 5000
  • afterEach(fn, timeout): 每个 test 执行完后执行 fn,timeout 含义同上
  • beforeAll(fn, timeout): 同 afterAll,不同之处在于在所有测试开始前执行
  • beforeEach(fn, timeout): 同 afterEach,不同之处在于在每个测试开始前执行
BeforeAll(() => {
  console.log('before all tests to excute !')
})

BeforeEach(() => {
  console.log('before each test !')
})

AfterAll(() => {
  console.log('after all tests to excute !')
})

AfterEach(() => {
  console.log('after each test !')
})

Test('test lifecycle 01', () => {
  expect(1 + 2).toBe(3)
})

Test('test lifecycle 03', () => {
  expect(2 + 2).toBe(4)
})


mock

我自己觉得能不 mock,还是尽量不要 mock,很多时候觉得代码不好测试而使用 mock,还不如看看如何重构代码,使之不用 mock 也能测试。 对于某些函数中包含的一些用时过长,或者调用第三方库的地方,而这些地方并不是函数的主要功能, 那么,可以用 mock 来模拟,从而提高测试执行的速度。

对于上面异步函数的例子,我们改造成 mock 的方式:

const funcUseGet = async url => {
  return await get(url)
}

test('mock fetch get method', async () => {
  const client = require('utils/client')
  client.get = jest.fn(url => ({ mock: 'test' }))

  const url = 'http://mock.test'
  const data = await funcUseGet(url)

  expect(data).toEqual({ mock: 'test' })
})


react 测试

jest 可以测试 react component,但是我们用了状态分离的方式开发前端, 大部分功能都在 action 中,这部分测试基本没有做。


附录

来源:https://www.cnblogs.com/wang_yb/archive/2018/04/19/8886859.html

站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/684

关闭

十大流行的无脚本测试方案

在传统的软件开发中,测试专业人​​员除了手动进行各种测试以外,更多时候需要依赖自动化的测试工具,来反复执行某些相同的测试任务。对于一些按照硬编码值执行、且无需任何修改的简单测试任务而言

Jest 初学者教程:JavaScript 测试入门

在编程术语中,测试意味着检查我们的代码是否符合某些期望。例如:一个名为 “ transformer” 的函数应在给定某些输入的情况下返回期望的输出。测试类型很多,但简单来说测试分为三大类:

不用写代码,也能做好接口测试

本文你将了解到:1、接口测试基本概念,包含什么是接口,什么是接口测试,为什么要做接口测试;2、接口测试用例设计,3、怎样不用写代码,也能快速的根据开发的API文档完成接口自动化测试脚本

Selenium打开浏览器加载慢的原因

在自动化元素定位操作中经常使用智能等待来加强定位的强壮性,主要就是因为WebDriver没有提供页面加载场景的方法;在使用JavaScript知识的突然心生灵感,可以使用JavaScript来配合验证页面加载,结果发现我真是井底之蛙。

前端性能测试工具整理简介_性能测试工具都有哪些?

前端性能测试工具都有哪些:Favicon、Open Graph、图片优化-压缩图像、CSS 优化-Autoprefixer、Purifycss、minify CSS、减少载入时间、GZIP、CDN、优化平台-Sentry、Google Tag Manager

九大高效的前端测试工具与框架

在每个Web应用程序中,作为用户直接可见的应用程序外观,“前端”包括:图形化的用户界面、相应的功能、及其整体站点的可用性。我们可以毫不夸张地说:如果前端无法正常工作,您将无法“拉新”网站的潜在用户

Macaca自动化测试解决方案

Macaca 是一套面向用户端软件的测试解决方案,提供了自动化驱动,环境配套,周边工具,集成方案,旨在解决终端上的测试、自动化、性能等方面的问题。以及两大平台的混合运行时 Webview,也支持以往的桌面端浏览器。

web测试流程及注意事项

界面对不懂技术的客户来说那相当关键,慢慢体会就会明白的。Web界面设计中,对各种元素(如按钮、单选框、复选框、列表框、超连接、输入框等等)的设计是非常重要的。

power assert_更智能、优雅的全方位 assert 断言库

在写测试代码时,以往我们需要翻阅文档,学习各种 API 才能明白如何操作断言。而现在我们可以透过 power-assert 的 assert 方法来减轻调试压力。不仅如此,它还提供更加直观,具体的运行效果,帮助 DEBUG。写测试代码,其实可以很容易。

Appium介绍

appium是一个自动化测试开源工具,支持IOS、Android平台上的原生应用、web应用和混合应用;原生应用:是指使用ios或者android编写的应用,Appium是Node.js写的http服务器,用来创建和控制webDriver的session。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!