Думаю о расширении BeforeAll, чтобы он позаботился о входе в систему
Для написания интеграционных тестов мы привлекаем драматурга. Одна из вещей, которые мы пытались сделать, - это свести к минимуму код в самом тесте и сделать больше за кулисами.
Чтобы объяснить это немного подробнее, если бы мы писали интеграционные тесты для определенной страницы, мы бы хотели, чтобы состояние нашего приложения было установлено на эту страницу еще до того, как мы начнем писать тест. Мы настроили нашу объектную модель страницы, чтобы добиться именно этого.
В настоящее время мы пытаемся реализовать дизайн, в котором мы будем входить в приложение еще до выполнения первого BeforeAll. Мы думаем реализовать это примерно так -
test.beforeAll(()=>{
//code
}, {username: "name"})
Мы ожидаем, что приведенный выше блок кода сделает вход в приложение для предоставленного имени пользователя за кулисами, а затем запустит код внутри блока BeforeAll.
Тем не менее, я обнаружил, что драматург не дает возможности расширить beforeAll. Не могли бы вы предложить возможные решения?
Мне известны подходы globalSetup и StorageState, но это происходит в глобальной области. Итак, если бы мне пришлось использовать 5 разных пользователей в течение всего времени выполнения теста, мне нужно было бы войти в систему и сохранить состояние всех пользователей одновременно. Это может повлиять на производительность, когда я заинтересован в использовании только двух пользователей, поскольку он все равно будет входить в систему для всех пяти пользователей в начале выполнения.
Я также думал о расширении фикстуры страницы и реализации там логики входа в систему, но я не верю, что мы можем передавать параметры (в данном случае имя пользователя) в функцию base.extend().
Спасибо, что прочитали этот пост, и ценю ваши ответы.
1 ответ
Для этого вы можете определить собственные приспособления .
// 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
может решить, использовать ли существующее состояние или создать / войти в систему нового пользователя. Обратите внимание, что этот код будет запускаться в каждом работнике драматурга, поэтому вам нужно будет каким-то образом синхронизировать их между собой.