0

我们正在使用 playwright 编写集成测试。正在尝试做的一件事是在实际测试本身中最小化代码并在幕后做更多的事情。

为了进一步解释这一点,如果我们正在为特定页面编写集成测试,我们希望甚至在开始编写测试之前就将应用程序的状态设置为该页面。我们已经建立了我们的页面对象模型来实现这一点。

目前,我们正在尝试实现一种设计,即使在执行第一个 BeforeAll 之前,我们也将登录到应用程序。我们正在考虑以这样的方式实现它 -

test.beforeAll(()=>{
     //code
}, {username: "name"})

我们期望上面的代码块做的是在后台使用提供的用户名登录应用程序,然后在 BeforeAll 块中运行代码。

但是,我发现剧作家没有提供扩展 beforeAll 的方法。您能否提出可能的解决方案?

我知道 globalSetup 和 StorageState 方法,但这发生在全局范围内。因此,如果我在整个测试执行期间使用 5 个不同的用户,我将需要同时登录并存储所有用户的状态。当我对只使用两个用户感兴趣时,这可能会影响性能,因为它仍然会在执行开始时为所有五个用户登录。

我也想过扩展页面夹具并在那里实现登录逻辑,但我不相信我们可以将参数(在本例中为用户名)传递给 base.extend() 函数。

感谢您阅读这篇文章并感谢您的回复。

4

1 回答 1

0

您可以定义自定义装置来实现这一点。

// fixtures.js
const base = require('@playwright/test');

module.exports = base.test.extend({
  loginUser: [ async ({}, use) => {
    const getLoggedInUser = (username) => {
      console.log('Decide how to (lazily?) allocate the user based on the username ' + username);
      return 'User: ' + username;
    };
    await use(getLoggedInUser);
    console.log('Do cleanup after all');
  }, { scope: 'worker', auto: true } ],
});

然后从以下位置调用夹具beforeAll

// example.spec.js
const test = require('./fixtures');

test.beforeAll(({ loginUser }) => {
  loginUser('User 1');
})

test('test 1', async ({  }) => {
});

或者直接从测试中调用它:

// example-2.spec.js
const test = require('./fixtures');

test('test 2', async ({ loginUser }) => {
  loginUser('User 2');
});

getLoggedInUser可以决定是使用现有状态还是创建/登录新用户。请注意,此代码将在每个剧作家中运行,因此您需要以某种方式在它们之间进行同步。

于 2021-10-14T23:10:35.417 回答