在所有Jest测试中重用相同的Puppeteer实例

时间:2017-10-18 20:10:34

标签: 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。它会很完美,但它会在每个测试文件之前运行。我不想要这个,因为木偶操作设置需要花费很多时间。无论我运行多少测试文件,我都希望重复使用相同的浏览器实例并支付一次设置费用。

所以,我想到了:

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

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

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

为什么我要问

由于我是Jest的新手,我可能会遗漏一些明显的东西。在我深入研究之前,我会问这里。

1 个答案:

答案 0 :(得分:8)

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

已经回复了on Twitter,但为了清楚起见,请在此处发布。

从Jest v22开始,你可以创建一个异步的custom test environment并且有setup() / teardown()个钩子:

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核心数)。