jestjs - 在所有 Jest 测试中重复使用相同的 Puppeteer 实例

标签 jestjs functional-testing puppeteer

问题

我将用 Jest + Puppeteer 替换 CasperJS。将所有内容放入一个文件中效果很好:

beforeAll(async () => {
  // get `page` and `browser` instances from puppeteer
});

describe('Test A', () => {
   // testing
});

describe('Test B', () => {
   // testing
});

afterAll(async () => {
 // close the browser
});

现在,我真的不想将所有内容都保存在一个文件中。维护起来更困难,并且只运行部分测试(例如,仅“测试 A”)也更困难。

我尝试过的

我查看了 Jest 文档并阅读了有关 setupScript 的内容。这将是完美的,但它在每个测试文件之前运行。我不想要这个,因为 puppeteer 操作者的设置需要相当多的时间。我想重复使用相同的浏览器实例,并且无论我要运行多少个测试文件,都只需支付一次设置费用。

所以,我想到了:

// setup puppeteer
await require('testA')(page, browser, config);
await require('testB')(page, browser, config);
// cleanup

这解决了模块化问题,重用了相同的浏览器实例,但不允许我单独运行测试。

最后,我偶然发现了创建自定义testEnviroment的可能性。 。这听起来不错,但没有很好的记录,所以我什至不确定 env 实例是每个测试文件还是每个 Jest 运行创建的。稳定 API 还缺少一个 setup 方法,我可以在其中设置 puppeteer(我必须在不能异步的构造函数中执行此操作)。

我为什么问

由于我是 Jest 新手,所以我可能会错过一些明显的东西。在我深入研究这个问题之前,我想先在这里问一下。

最佳答案

更新(2018 年 2 月):Jest 现在有官方 Puppeteer guide ,在所有测试中重复使用一个浏览器实例:)

已经回答了on Twitter ,但为了清楚起见,让我们将其发布在这里。

从 Jest v22 开始,您可以创建 custom test environment它是异步的并且具有 setup()/teardown() Hook :

import NodeEnvironment from 'jest-environment-node';

class CustomEnvironment extends NodeEnvironment {
  async setup() {
    await super.setup();
    await setupPuppeteer();
  }

  async teardown() {
    await teardownPuppeteer();
    await super.teardown();
  }
}

并在 Jest 配置中使用它:

{
  "testEnvironment": "path/to/CustomEnvironment.js"
}

值得注意的是,Jest 在沙箱(单独的 vm 上下文)中并行化测试,并且需要为每个工作线程生成新的测试环境(通常是机器的 CPU 核心数量)。

关于jestjs - 在所有 Jest 测试中重复使用相同的 Puppeteer 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46818427/

相关文章:

reactjs - 运行 Next.js 构建时出现 Jest 引用错误 'describe' 未定义

testing - 寻找 "test execution manager"软件来管理自动化测试

python - Django 测试运行器不尊重 unittest.TestCase?

javascript - 如果页面中不存在 DOM 元素,我如何移动到下一个迭代?

css - 如何在 Enzyme 中测试 CSS 悬停 - React

docker - Jest-dynamoDB 连接在 docker 容器内被拒绝

node.js - 使用 Mocha 和 Grunt 在 Sails.js 中运行功能测试时的竞争条件

aws-lambda - Pyppeteer:浏览器在 AWS Lambda 中意外关闭

node.js - 我选择哪一种 headless 浏览器?

javascript - 在 vue 中使用 jest 时编译失败但测试用例通过