Jest单元测试

Jestfacebook 推出的一款测试框架,集成了 Mochachaijsdomsinon等功能。

安装

npm install --save-dev jest
npm install -g jest

配置

运行命令jest后会自动运行项目下所有 .test.js.spec.js这种格式的文件。jest的配置默认只需要在package.json中配置即可。

我们将 jest 的运行范围限定在test文件夹下,而不是全部,所以在package.json中加入如下配置:

 "jest": {
    "testRegex": "/test/.*.test.jsx?$"
 }
应用

jest可以兼容部分 mochachai 的语法。

import React from 'react'
import { shallow } from 'enzyme'
import CommentItem from './commentItem'

describe('测试评论列表项组件', () => {
  // mocha
  it('测试评论内容小于等于200时不出现展开收起按钮', () => {
    const propsData = {
      name: 'hj',
      content: '测试标题'
    }
    const item = shallow(<CommentItem {...propsData} />)
    // 这里的断言实际上和chai的expect是很像的
    expect(item.find('.btn-expand').length).toBe(0);
  })
  // jest
  test('两数相加结果为两个数字的和', () => {
    expect(3).toBe(3);
  });
}
断言
expect(x).toBe(y)//判断相等,使用Object.is实现
expect({a:1}).toBe({a:1})//判断两个对象是否相等
expect(1).not.toBe(2)//判断不等
expect(n).toBeNull(); //判断是否为null
expect(n).toBeUndefined(); //判断是否为undefined
expect(n).toBeDefined(); //判断结果与toBeUndefined相反
expect(n).toBeTruthy(); //判断结果为true
expect(n).toBeFalsy(); //判断结果为false
expect(value).toBeGreaterThan(3); //大于3
expect(value).toBeGreaterThanOrEqual(3.5); //大于等于3.5
expect(value).toBeLessThan(5); //小于5
expect(value).toBeLessThanOrEqual(4.5); //小于等于4.5
expect(value).toBeCloseTo(0.3); // 浮点数判断相等
expect('Christoph').toMatch(/stop/); //正则表达式判断
expect(['one','two']).toContain('one'); //不解释

function compileAndroidCode() {
  throw new ConfigError('you are using the wrong JDK');
}

test('compiling android goes as expected', () => {
  expect(compileAndroidCode).toThrow();
  expect(compileAndroidCode).toThrow(ConfigError); //判断抛出异常
})
Mock

替代sinon

function forEach(items, callback) {
  for (let index = 0; index < items.length; index++) {
   callback(items[index]);
  }
}

const mockCallback = jest.fn();
forEach([0, 1], mockCallback);

// 判断是否被执行两次
expect(mockCallback.mock.calls.length).toBe(2);

// 判断函数被首次执行的第一个形参为0
expect(mockCallback.mock.calls[0][0]).toBe(0);

// 判断函数第二次被执行的第一个形参为1
expect(mockCallback.mock.calls[1][0]).toBe(1);
覆盖率
jest --coverage
Puppeteer & Jest

npm install jest-puppeteer 安装jest-puppeteer
npm install -g jest-cli 指定执行的文件
jest.config.js 配置jest

module.exports = {
    preset: "jest-puppeteer", // *必须,指示了Jest和puppeteer可以一起使用
    globals: { // 全局变量,你可以在项目中直接使用它们
      BAIDU_URL: "https://www.baidu.com"
    },
    // testMatch: [ // 匹配文件,指示了Jest应该在那些文件夹中寻找哪些文件
    //   "**/test/**/*.test.js"
    // ],
    verbose: true,
    testTimeout: 60000, // 每个测试的超时时间,超过这个时间本次测试算失败
}

jest-puppeteer.config.js 配置jest-puppeteer

module.exports = {
  launch: { // 这里的参数将会传给  puppeteer.launch()
    headless: false, // 是否为无头模式
    defaultViewport: { width: 1500, height: 700 }, // 默认窗口的大小
    // slowMo: process.env.SLOWMO ? process.env.SLOWMO : 0, // 是否慢动作执行测试
    devtools: true
  },
  browserContext: 'incognito', // 无痕模式
  exitOnPageError: false, // 默认为true,出现全局错误会导致测试中断
}

baidu.test.js 测试脚本

beforeAll(async () => { // 这段代码将会执行在所有代码之前
    await page.goto(BAIDU_URL, {waitUntil: 'domcontentloaded'});
});

describe('百度一下,你就知道', () => {
    it('标题测试', async () => {
        const title = await page.title();
        expect(title).toBe('百度一下,你就知道');
    });
});

npm run test baidu.test.js 执行测试用例

 PASS  src/test/baidu.test.js
  百度一下,你就知道
    √ 标题测试 (107 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        1.964 s, estimated 3 s
Ran all test suites matching /baidu.test.js/i.

Puppeteer & Jest & Allure

下载Allure 2.13.6,解压下载下来的Zip,拷贝你想放的位置下,配置系统环境变量指向解压后的bin目录(官网一直在更新)
npm install jest-allure
npm install jest-allure-reporter

/** 用了这个配置方法没生效,改为使用包引用
修改jest.config.js文件,添加

setupFilesAfterEnv: ['jest-allure/dist/setup'], // 每次执行测试前执行这个文件以便让allure生成测试结果报告

**/

引用包

const report = require('jest-allure/dist/setup');
beforeAll(async () => { // 这段代码将会执行在所有代码之前
    await page.goto(BAIDU_URL, {waitUntil: 'domcontentloaded'});
});

describe('百度一下,你就知道', () => {
    report.registerAllureReporter();
    it('标题测试', async () => {
        const title = await page.title();
        expect(title).toBe('百度一下,你就知道');
    });
});

allure generate --clean
--clean 指示本次报告覆盖之前的报告
allure serve

参考文献:
jest
expect
前端自动化测试入门教程
Jest+Puppeteer界面自动化测试
Jest中文网

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容