Playwright — это мощная библиотека для автоматизации браузера, которая позволяет проводить интеграционные и энд-ту-энд тесты для современных веб-приложений. В контексте тестирования Vue компонентов, Playwright предоставляет все необходимые инструменты для того, чтобы тестировать взаимодействие с DOM, эмулировать действия пользователей и проверять корректность работы компонентов.
Для начала необходимо установить Playwright и все нужные зависимости. В проекте на Vue.js для этого достаточно выполнить несколько команд.
npm install playwright
npm install @playwright/test vue-test-utils
Playwright предоставляет обширный API для взаимодействия с элементами на странице. В контексте тестирования Vue компонентов важно понимать структуру приложения и расположение компонентов. Обычно компоненты Vue рендерятся на странице как HTML элементы с привязками к классам, ID или данным из состояния приложения.
Пример базовой структуры теста с Playwright для компонента Vue:
import { test, expect } from '@playwright/test';
test('проверка отображения компонента', async ({ page }) => {
// Переход к странице, где рендерится компонент
await page.goto('http://localhost:8080/');
// Проверка, что элемент с текстом 'Hello, Vue!' присутствует на странице
const text = await page.textContent('.hello-vue');
expect(text).toBe('Hello, Vue!');
});
Одним из ключевых аспектов тестирования компонентов является взаимодействие с ними: клик, ввод текста, изменение состояний. Для этого Playwright предоставляет API, которое позволяет имитировать действия пользователя.
Предположим, у нас есть компонент формы, который принимает данные пользователя:
<template>
<form @submit.prevent="submitForm">
<input v-model="name" type="text" placeholder="Введите имя" />
<button type="submit">Отправить</button>
</form>
</template>
<script>
export default {
data() {
return {
name: ''
};
},
methods: {
submitForm() {
alert(`Имя: ${this.name}`);
}
}
};
</script>
Для тестирования ввода данных можно использовать следующие шаги:
Пример теста:
test('проверка ввода текста', async ({ page }) => {
await page.goto('http://localhost:8080/');
// Найти поле ввода и ввести имя
await page.fill('input[type="text"]', 'Иван');
// Найти кнопку и кликнуть по ней
await page.click('button[type="submit"]');
// Проверить, что alert был вызван с правильным значением
page.on('dialog', dialog => {
expect(dialog.message()).toBe('Имя: Иван');
dialog.accept();
});
});
Vue часто использует асинхронные операции, такие как запросы к серверу или задержки перед рендером. Playwright позволяет работать с асинхронными элементами и ожидать завершения операций.
Предположим, у нас есть компонент, который загружает данные с сервера и отображает их в списке:
<template>
<div v-if="items.length > 0">
<ul>
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
</ul>
</div>
<p v-else>Загрузка...</p>
</template>
<script>
export default {
data() {
return {
items: []
};
},
mounted() {
fetch('/api/items')
.then(res => res.json())
.then(data => {
this.items = data;
});
}
};
</script>
Тестирование этого компонента требует проверки, что текст “Загрузка…” отображается до завершения загрузки данных, а затем появляется список.
Пример теста:
test('проверка загрузки данных', async ({ page }) => {
await page.goto('http://localhost:8080/');
// Проверка, что изначально показывается "Загрузка..."
const loadingText = await page.textContent('p');
expect(loadingText).toBe('Загрузка...');
// Подключение к мокированному API
await page.route('**/api/items', (route) => {
route.fulfill({
status: 200,
body: JSON.stringify([{ id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }]),
});
});
// Дождаться появления списка
await page.waitForSelector('ul');
const listItems = await page.locator('ul').textContent();
expect(listItems).toContain('Item 1');
expect(listItems).toContain('Item 2');
});
Vue Test Utils — это официальная утилита для тестирования Vue компонентов, которая позволяет тестировать компоненты изнутри. Когда Playwright используется вместе с Vue Test Utils, это позволяет более точно проверять внутренние изменения состояния и поведение компонентов.
import { mount } from '@vue/test-utils';
import MyComponent from '@/components/MyComponent.vue';
test('проверка рендеринга компонента', async () => {
const wrapper = mount(MyComponent);
// Проверка содержимого элемента
expect(wrapper.text()).toContain('Hello, World!');
// Моделирование ввода данных в компонент
await wrapper.setData({ name: 'Иван' });
expect(wrapper.vm.name).toBe('Иван');
});
Одной из важных задач тестирования является проверка корректности обработки ошибок в приложении. Playwright предоставляет инструменты для мониторинга ошибок и логирования событий в процессе тестирования.
test('проверка обработки ошибок', async ({ page }) => {
await page.goto('http://localhost:8080/');
// Проверка, что компонент корректно отображает ошибку при неправильном запросе
page.on('console', (msg) => {
if (msg.type() === 'error') {
expect(msg.text()).toContain('Ошибка при загрузке');
}
});
// Имитируем ошибку на сервере
await page.route('**/api/items', (route) => {
route.abort();
});
// Ожидаем появления ошибки
await page.waitForSelector('.error-message');
const errorMessage = await page.textContent('.error-message');
expect(errorMessage).toBe('Ошибка при загрузке данных');
});
Playwright также позволяет проверять визуальные изменения компонентов, сравнивая снимки экрана. Это полезно для регрессионного тестирования интерфейса.
test('проверка визуальных изменений', async ({ page }) => {
await page.goto('http://localhost:8080/');
// Сделать скриншот компонента
const screenshot = await page.screenshot();
expect(screenshot).toMatchSnapshot('component-snapshot.png');
});
Использование Playwright для тестирования Vue компонентов предоставляет мощный инструментарий для автоматизированных тестов. Возможности Playwright позволяют тестировать не только функциональность, но и взаимодействие с компонентами, асинхронные процессы, обработку ошибок и визуальные изменения интерфейса. Integrating Playwright с Vue Test Utils даёт возможность глубже проверять компоненты на уровне внутренней логики и их рендеринга.