在所有 Jest 测试中重用相同的 Puppeteer 实例
Reusing same Puppeteer instance in all Jest tests
问题
我正在用 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
});
现在,我真的不想将所有内容都保存在一个文件中。它更难维护,也更难 运行 只是部分测试(比如,只是 'Test A')。
我试过的
我查看了 Jest 文档并阅读了有关 setupScript 的内容。这将是完美的,但它在每个测试文件之前 运行s。我不想要这个,因为木偶操作者设置需要花费大量时间。我想重复使用相同的浏览器实例,无论我要测试多少文件,都只支付一次安装费用 运行。
所以,我想到了:
// setup puppeteer
await require('testA')(page, browser, config);
await require('testB')(page, browser, config);
// cleanup
这解决了模块化问题,重用了相同的浏览器实例,但不允许我 运行 单独测试。
最后,我偶然发现了创建自定义 testEnviroment 的可能性。这听起来不错,但没有很好的记录,所以我什至不确定是每个测试文件还是每个 Jest 运行 创建了 env 实例。稳定 API 也缺少一个 setup
方法,我可以在其中设置人偶操作(我必须在不能异步的构造函数中这样做)。
我为什么要问
由于我是 Jest 的新手,所以我可能遗漏了一些明显的东西。在我深入研究之前,我会在这里问一下。
更新(2018 年 2 月):Jest 现在有官方 Puppeteer guide,具有在所有测试中重用一个浏览器实例的特点:)
已经有人回答了 on Twitter,但为了清楚起见,让我们post在这里回答。
从 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 核心数).
问题
我正在用 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
});
现在,我真的不想将所有内容都保存在一个文件中。它更难维护,也更难 运行 只是部分测试(比如,只是 'Test A')。
我试过的
我查看了 Jest 文档并阅读了有关 setupScript 的内容。这将是完美的,但它在每个测试文件之前 运行s。我不想要这个,因为木偶操作者设置需要花费大量时间。我想重复使用相同的浏览器实例,无论我要测试多少文件,都只支付一次安装费用 运行。
所以,我想到了:
// setup puppeteer
await require('testA')(page, browser, config);
await require('testB')(page, browser, config);
// cleanup
这解决了模块化问题,重用了相同的浏览器实例,但不允许我 运行 单独测试。
最后,我偶然发现了创建自定义 testEnviroment 的可能性。这听起来不错,但没有很好的记录,所以我什至不确定是每个测试文件还是每个 Jest 运行 创建了 env 实例。稳定 API 也缺少一个 setup
方法,我可以在其中设置人偶操作(我必须在不能异步的构造函数中这样做)。
我为什么要问
由于我是 Jest 的新手,所以我可能遗漏了一些明显的东西。在我深入研究之前,我会在这里问一下。
更新(2018 年 2 月):Jest 现在有官方 Puppeteer guide,具有在所有测试中重用一个浏览器实例的特点:)
已经有人回答了 on Twitter,但为了清楚起见,让我们post在这里回答。
从 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 核心数).