4

问题

我正在用 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的可能性。这听起来不错,但没有很好的文档记录,所以我什至不确定是每个测试文件还是每个 Jest 运行都创建了 env 实例。稳定的 API 也缺少一种setup我可以设置 puppeteer 的方法(我必须在不能异步的构造函数中这样做)。

为什么我要问

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

4

1 回答 1

11

更新(2018 年 2 月):Jest 现在有了官方Puppeteer 指南,其中包括在所有测试中重用一个浏览器实例 :)

它已经在 Twitter 上得到了回答,但为了清楚起见,让我们在这里发布。

从 Jest v22 开始,您可以创建一个异步的自定义测试环境并具有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 核心数)生成新的测试环境。

于 2017-10-18T20:43:30.510 回答