【问题标题】:Run grouped tests sequentially using Playwright使用 Playwright 按顺序运行分组测试
【发布时间】:2021-09-01 03:52:20
【问题描述】:

我正在将 Playwright 与 nodejs 一起使用,并且像这样将几个测试组合在一起

import { test, expect } from '@playwright/test';

test.describe('Add a simple invoice test', () => {
    test('01.Login & add an invoice', async ({ page }) => {
        await page.goto("https://someUrl.com");
        await page.fill('input[id="email"]', "someEmailAddress");
        await page.fill('input[ng-model="ctrl.user.password"]', "somePassword");
        await page.click('button[id="login-btn"]');
    });

    test('02.Add an invoice', async ({ page }) => {
        await page.click('[name="invoice"]');
        await page.click('button[id="addInvoiceButton"]');
        await page.click('a[ng-click="ctrl.goToAddInvoice()"]');
        await page.fill('#invoiceTitle', Math.random().toString(36).substring(7));
        await page.fill('#exampleInputAmount', "120");
        await page.click("#invoiceCategory")
        await page.fill("#invoiceCategory > input", "Car")
        await page.keyboard.press("Enter");
        await page.click('button[id="submitInvoiceButton"]');
    });
});

问题是这 2 个测试并行运行,而 02 依赖于 01,因为需要登录。

如何让 2 个分组测试在同一上下文中运行?

【问题讨论】:

    标签: node.js typescript automated-tests playwright


    【解决方案1】:

    您不应该让您的测试相互依赖。例如,我会提取一个函数的公共登录并从两个测试中调用该函数。 您甚至可以在第一个测试中添加一些断言来检查登录是否有效。但你不会在第二个上这样做。

    【讨论】:

    • 我知道,你说的很有道理,我完全理解。问题是我只是在玩弄它以更好地了解该工具。但是知道在 Jasmine 等其他测试框架中,使用“it”关键字对一些测试进行分组(就像这里的“test”)有助于将测试划分为每个人都可以理解的步骤,然后记录到控制台。所以我觉得这样的行为有点奇怪。
    • 我不想听起来粗鲁,请好好理解 :),但请考虑 ittest 步骤是错误的。每个it 应该是独立的,并且您将其分组在文件或describes 中,因为这些测试正在测试相同的功能。如果你想重用步骤或声明步骤,那些只是简单的函数而不是its。
    • 当它纠正我正在做的错误时,我不能接受如此粗暴的事情。我非常感激。我将在未来的项目中应用您告诉我的内容。所以只是看看我是否完全理解,如果我们假设我们想要测试登录功能。例如,第一个 it 将使用正确的凭据登录,而第二个则使用错误的凭据登录?
    【解决方案2】:

    如果您有一堆具有通用设置步骤的测试,那么 Playwright Test Runner 具有一些预先设置好的功能,您可以使用它们在所有测试之前运行一次 (test.beforeAll) 或在每次测试之前运行一次 (test.beforeEach )。

    相关文档在这里:https://playwright.dev/docs/test-intro#use-test-hooks

    有类似的拆卸选项,所以它们可能是简单的,比如进入登录页面并登录(然后在最后退出?),或者更复杂的东西,比如设置数据并在测试后将其清除.

    【讨论】:

    • 真正想要的是以 BDD 方式执行测试,每个步骤的描述都显示在控制台上。因为有些人有时会跟踪测试并且不知道发生了什么。所以我想展示如下内容:1. 用户登录。2. 导航到菜单 X。3. 是否 Y。4. 注销
    • 我不是 100% 清楚您是否要记录正在执行的操作(您已控制浏览器)或该操作已按预期工作(您期望的结果在DOM)如果是前者,您可以使用以下命令将输出转储到控制台:console.log(blah);对于后者,您可以使用断言(“expect”)。
    【解决方案3】:

    解决方案非常简单。它作为一个独立的测试执行,因为您在每个测试中都通过 {page},所以如果您想对两个测试使用相同的上下文,您需要像下面这样修改测试。

    
    test.describe('Add a simple invoice test', () => {
      let page: Page;
      test.beforeAll(async ({ browser }) => {
        page = await browser.newPage();
      });
    
        test('01.Login & add an invoice', async () => { // do not pass page
            await page.goto("https://someUrl.com");
            await page.fill('input[id="email"]', "someEmailAddress");
            await page.fill('input[ng-model="ctrl.user.password"]', "somePassword");
            await page.click('button[id="login-btn"]');
        });
    
        test('02.Add an invoice', async () => { //do not pass page 
            await page.click('[name="invoice"]');
            await page.click('button[id="addInvoiceButton"]');
            await page.click('a[ng-click="ctrl.goToAddInvoice()"]');
            await page.fill('#invoiceTitle', Math.random().toString(36).substring(7));
            await page.fill('#exampleInputAmount', "120");
            await page.click("#invoiceCategory")
            await page.fill("#invoiceCategory > input", "Car")
            await page.keyboard.press("Enter");
            await page.click('button[id="submitInvoiceButton"]');
        });
    });
    

    这应该可以按您的预期工作 也可以参考Dzone Article 了解。

    注意:Playwright 不推荐这种方法,但这个答案应该可以满足您的需求。

    【讨论】:

    • 为什么不在 beforeAll 钩子里面await page.goto("https://someUrl.com");
    猜你喜欢
    • 2014-09-23
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 2023-02-17
    相关资源
    最近更新 更多