【发布时间】:2019-12-13 12:48:55
【问题描述】:
问题总结:我正在编写几个测试套件(使用 Jest 和 Puppeteer)来自动测试我的 AngularJS 应用程序的 index.html 页面。不幸的是,我在运行测试时看到了一些奇怪的行为,我认为这与 Jest 运行我的各种测试套件的顺序有关。
背景:我使用 Jest (v24.8.0) 作为我的测试框架。我正在使用 Puppeteer (v1.19.0) 来启动和控制一个 Chromium 浏览器来执行我的测试。
我的代码:
<!-- index.html -->
<div ng-app="myApp" ng-controller="myCtrl as ctrl">
<form name="form1">
<md-input-container>
<label class="md-required">Name</label>
<input ng-model="ctrl.name1"></input>
</md-input-container>
<md-dialog-actions>
<button class="md-primary md-button" ng-transclude type="submit">Submit</button>
</md-dialog-actions>
</form>
<form name="form2">
<md-input-container>
<label class="md-required">Name</label>
<input ng-model="ctrl.name2"></input>
</md-input-container>
<md-dialog-actions>
<button class="md-primary md-button" ng-transclude type="submit">Submit</button>
</md-dialog-actions>
</form>
</div>
// index.spec.js
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
await page.goto('https://my-site.com');
describe('form 1', async () => {
test('populate form 1', async () => {
let formSelector = 'form[name="form1"]';
await page.waitForSelector(formSelector+' input', {timeout: 3000});
await page.click(formSelector+' input');
await page.keyboard.type('casey');
let submitButtonSelector = 'form[name="form1"] button[type="submit"]';
await page.click(submitButtonSelector);
});
});
describe('form 2', async () => {
test('populate form 2', async () => {
let formSelector = 'form[name="form2"]';
await page.waitForSelector(formSelector+' input', {timeout: 3000});
await page.click(formSelector+' input');
await page.keyboard.type('jackie');
let submitButtonSelector = 'form[name="form2"] button[type="submit"]';
await page.click(submitButtonSelector);
});
});
await browser.close();
})();
测试行为:
有时当我运行npm test 时,我的两个测试套件'form1' 和'form2'(我用describe 定义)似乎正在并行运行(尽管我知道那不是可能在 Javascript 中,所以我假设 Jest 异步运行不同的测试套件)。无论哪种方式,当我在非无头模式下运行测试时,我可以看到form1 的名称输入填充了'jackie',即使它应该是'casey'。在那之后,form2 永远不会被填写(即使我的第二个测试套件应该这样做)并且测试完成,之后 Jest 告诉我'populate form 2' 失败了。同样,每次我运行测试时都不会发生这种情况,因此您可能无法复制我的问题。
我的问题:
-
Jest 是否并行/异步运行测试套件? 注意:我不是在谈论在测试套件中使用
李>test定义的单个测试,我知道如果我向它们传递async函数,它们会异步运行。 如果 Jest 确实异步运行测试套件,我该如何禁用它?或者更好的是,为不同的测试套件提供不同的
browser实例以便它们在完全独立的窗口中运行是智能/传统/最优吗?有没有其他方法可以确保测试套件单独和/或同步运行?如果 Jest 不异步运行测试套件,那么您认为我为什么会看到这种行为?
我之所以这么问,是因为我想找到一种方法来确保我的所有测试始终通过,而不是仅在某些时候通过。从长远来看,这将更容易确定我在开发过程中的更改是否破坏了任何东西。
提前感谢所有 Jest/Puppeteer 黑客!
【问题讨论】:
标签: javascript angularjs jestjs puppeteer