【for QA】教你认识jest+puppeteer

得益于最近项目上使用了jest+puppeteer来进行前端自动化,有机会进行边实践变学习,并整理出一些相关的知识,可供对此感兴趣的人儿们参考,如有出入,欢迎指正~

在整理之前,我给自己提出了以下几个问题

1、jest是什么?

2、为什么要用jest?

3、jest+puppeteer怎么使用?(在jest中把jest+puppeteer搭起来)

4、jest和puppeteer怎么结合?(分工?)


1、jest是什么?

    由 Facebook 推出的一套开源的 JavaScript 测试框架,具有许多非常好的特性,譬如执行速度快、API友好、自动监控、Snapshot、测试覆盖率、Mock等各种特性,并且适用于Babel、TypeScript、Node、React、Angular、Vue等。

2、自动化:

前端:jest+puppeteer,cypress,selenium

后端:rest-assured, testNG

在这里没有探究具体的对比,大多数情况下,可能会结合项目实际情况看使用哪个更合适。

3、在jest框架中,把jest+puppeteer搭起来

(1)项目的前端小伙伴可能会用jest写他们自动的单元测试的用例,因此最好单独建立一个文件夹放e2e的测试,并在里面添加jest.config.js文件。


(2)在项目的package.json中添加跑e2e用例的命令

"scripts": {

            "e2e-test": "jest --config test/jest.config.js"

},

(3)若项目内没有装puppeteer,先装puppeteer

npm i puppeteer

# or "yarn add puppeteer"

确认项目package.json里有

(可以不用puppeteer-core)

(4)安装jest-puppeteer

yarn add --dev jest-puppeteer

# or "npm install --save-dev jest-puppeteer"

or

# for jest 22~23

npm install --save-dev jest-puppeteer@3.9.0 puppeteer jest

# for jest 24+

npm install --save-dev jest-puppeteer puppeteer jest

Requires Jest v22+ TypeScript users should additionally install 

@types/puppeteer, 

@types/jest-environment-puppeteer,

@types/expect-puppeteer

(5)update your Jest configuration:(在test/jest.config.js内)

{

  "preset": "jest-puppeteer"

}

(6)其他配置:Configure Puppeteer。在项目文件夹下添加jest-puppeteer.config.js

// jest-puppeteer.config.js

module.exports = {

  launch: {

    dumpio: true,

    headless: process.env.HEADLESS !== 'false',

  },

  browserContext: 'default',

}

browserContext : By default, the browser context (cookies, localStorage, etc) is shared between all tests. The following options are available for browserContext:

default Each test starts a tab, so all tests share the same context.

incognito Each tests starts an incognito window, so all tests have a separate, isolated context. Useful when running tests that could interfere with one another. (Example: testing multiple users on the same app at once with login, transactions, etc.)

headless: 若想在跑用例是关闭headless状态,可以使用命令 HEADLESS=false npm run e2e-test

defaultViewport: 设置浏览器分辨率

server :Server options allowed by jest-dev-server

 dumpio: true,据说设置为true可以解决多开页面会卡死的问题,但具体是做什么,不得而知

(7)其他配置:Configure ESLint

  Jest Puppeteer exposes three new globals: browser, page, context. If you want to avoid errors, you can add them to your .eslintrc.js:

// .eslintrc.js

module.exports = {

  env: {

    jest: true,

  },

  globals: {

    page: true,

    browser: true,

    context: true,

    jestPuppeteer: true,

  },

}

到这里可以试着运行脚本看是否成功(创建文件“google.jest.ts”在test文件夹下面):

describe('Google', () => {

  beforeAll(async () => {

    await page.goto('https://google.com')

  })

  it('should display "google" text on page', async () => {

    await expect(page).toMatch('google')

  })

})

遇到的坑:

坑1、error:Plugin/Preset files are not allowed to export objects, only functions.

原因: babel 的版本冲突,多是因为你的 babel 依赖包不兼容。在package.json内有6.0的版本也有7.0的版本

解决:把所有的包升级到7.0

方法一:你不妨把 node_modules 删掉,重新 install ,这样就可以处理一部分兼容问题(但是并没有解决我的问题。。。)

方法二:手动一个一个更改版本,然后升级

坑2、"TypeError: _asyncToGenerator is not a function"

解决办法:删除./babelrc文件就好了(黑人问号脸,不知道为什么)

(8)安装 jest-image-snapshot

npm i --save-dev jest-image-snapshot

should additionally install @types/jest-image-snapshot

在test下添加setup.ts文件,将imagesnapshot配置进去

require("expect-puppeteer");

const { toMatchImageSnapshot } = require("jest-image-snapshot");

jest.setTimeout(50000);

expect.extend({ toMatchImageSnapshot });

  并在test/jest.config.ts内将setup文件路径放进去

setupFilesAfterEnv: ["<rootDir>/setup.ts"],

到这里就可以尝试使用toMatchImageSnapshot()啦

describe('Google', () => {

  beforeAll(async () => {

    await page.goto('https://google.com');

  });

  it('should be titled "Google"', async () => {

    const image = await page.screenshot();

    return expect(image).toMatchImageSnapshot();

  });

});

生成的图片和diff_output会放在_image_snapshots_内

#其他关于jest.config.ts的设置

testRegex :定义哪些是需要跑的用例

moduleNameMapper :从正则表达式到模块名称的映射,该模块名称允许将资源(例如图像或样式)存入一个模块。(未添加它时在一个describe里存多个图片失败了?)

moduleFileExtensions : An array of file extensions your modules use. If you require modules without specifying a file extension, these are the extensions Jest will look for, in left-to-right order.


4、jest和puppeteer怎么结合?(职责划分)

- jest提供测试框架:

import { Google } from "../../pages/Google";

describe("Google test", () => {

  let homePage: Google;

  beforeAll(() => {

    homePage = new Google(page);

  });

  it("google page", async () => {

      xxx... 

     xxx...

    xxx...

  });

});

- 在jest内运行puppeteer:安装jest-puppeteer

(可在jest-puppeteer可对puppeteer进行相关的配置,比如浏览器大小、launch、headless等)

- puppeteer进行具体操作:

//const browser = await puppeteer.launch();

//const page = await browser.newPage();

page.goto('https://example.com');

page.waitForSelector('[aria-label="main-content"]');

page.click(selector);

page.waitFor(500);

page.type(incidentSummarySelector, "incident summary");

page.screenshot();

//page.pdf({path: 'hn.pdf', format: 'A4'});

puppeteer API: https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#

- 图像对比jest-image-snapshot:

expect(image).toMatchImageSnapshot();

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

推荐阅读更多精彩内容