跳至主要内容

从 Testing Library 迁移

迁移原则

本指南介绍了从 DOM Testing LibraryReact Testing LibraryVue Testing LibrarySvelte Testing Library 迁移到 Playwright 的 实验性组件测试

注意

如果您在浏览器中使用 DOM Testing Library(例如,您使用 webpack 捆绑端到端测试),则可以直接切换到 Playwright 测试。以下示例侧重于组件测试,但对于端到端测试,您只需将 await mount 替换为 await page.goto('https://127.0.0.1:3000/') 即可打开要测试的页面。

备忘单

Testing LibraryPlaywright
screenpagecomponent
查询定位器
异步助手断言
用户事件操作
await user.click(screen.getByText('Click me'))await component.getByText('Click me').click()
await user.click(await screen.findByText('Click me'))await component.getByText('Click me').click()
await user.type(screen.getByLabelText('Password'), 'secret')await component.getByLabel('Password').fill('secret')
expect(screen.getByLabelText('Password')).toHaveValue('secret')await expect(component.getByLabel('Password')).toHaveValue('secret')
screen.getByRole('button', { pressed: true })component.getByRole('button', { pressed: true })
screen.getByLabelText('...')component.getByLabel('...')
screen.queryByPlaceholderText('...')component.getByPlaceholder('...')
screen.findByText('...')component.getByText('...')
screen.getByTestId('...')component.getByTestId('...')
render(<Component />);mount(<Component />);
const { unmount } = render(<Component />);const { unmount } = await mount(<Component />);
const { rerender } = render(<Component />);const { update } = await mount(<Component />);

示例

Testing Library

import React from 'react';
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';

test('sign in', async () => {
// Setup the page.
const user = userEvent.setup();
render(<SignInPage />);

// Perform actions.
await user.type(screen.getByLabelText('Username'), 'John');
await user.type(screen.getByLabelText('Password'), 'secret');
await user.click(screen.getByRole('button', { name: 'Sign in' }));

// Verify signed in state by waiting until "Welcome" message appears.
expect(await screen.findByText('Welcome, John')).toBeInTheDocument();
});

逐行迁移到 Playwright 测试

const { test, expect } = require('@playwright/experimental-ct-react'); // 1

test('sign in', async ({ mount }) => { // 2
// Setup the page.
const component = await mount(<SignInPage />); // 3

// Perform actions.
await component.getByLabel('Username').fill('John'); // 4
await component.getByLabel('Password').fill('secret');
await component.getByRole('button', { name: 'Sign in' }).click();

// Verify signed in state by waiting until "Welcome" message appears.
await expect(component.getByText('Welcome, John')).toBeVisible(); // 5
});

迁移要点(请参阅 Playwright 测试代码片段中的内联注释)

  1. 对于组件测试,从 @playwright/experimental-ct-react(或 -vue、-svelte)导入所有内容,或对于端到端测试,从 @playwright/test 导入所有内容。
  2. 测试函数被赋予一个与其他测试隔离的 page,以及在该页面中渲染组件的 mount。这些是 Playwright 测试中 有用夹具 中的两个。
  3. render 替换为返回 组件定位器mount
  4. 使用使用 locator.locator()page.locator() 创建的定位器来执行大部分操作。
  5. 使用 断言 来验证状态。

迁移查询

所有类似 getBy...findBy...queryBy... 以及它们的多元素对应物的查询都被替换为 component.getBy... 定位器。定位器始终自动等待并在需要时重试,因此您不必担心选择正确的方法。当您想要执行 列表操作(例如,断言文本列表)时,Playwright 会自动执行多元素操作。

替换 waitFor

Playwright 包含 断言,这些断言会自动等待条件,因此您通常不需要显式调用 waitFor/waitForElementToBeRemoved

// Testing Library
await waitFor(() => {
expect(getByText('the lion king')).toBeInTheDocument();
});
await waitForElementToBeRemoved(() => queryByText('the mummy'));

// Playwright
await expect(page.getByText('the lion king')).toBeVisible();
await expect(page.getByText('the mummy')).toBeHidden();

当您找不到合适的断言时,请改用 expect.poll

await expect.poll(async () => {
const response = await page.request.get('https://api.example.com');
return response.status();
}).toBe(200);

替换 within

您可以使用 locator.locator() 方法在另一个定位器内创建定位器。

// Testing Library
const messages = document.getElementById('messages');
const helloMessage = within(messages).getByText('hello');

// Playwright
const messages = component.getByTestId('messages');
const helloMessage = messages.getByText('hello');

Playwright 测试超级大国

一旦您使用 Playwright 测试,您就会获得很多好处!

  • 完全零配置的 TypeScript 支持
  • 在所有 Web 引擎(Chrome、Firefox、Safari)上以及任何流行的操作系统(Windows、macOS、Ubuntu)上运行测试
  • 完全支持多个来源、(i)frames选项卡和上下文
  • 在多个浏览器中并行地以隔离方式运行测试
  • 内置测试 工件收集

您还将获得所有这些与 Playwright 测试捆绑在一起的 ✨ 强大的工具 ✨

进一步阅读

了解有关 Playwright 测试运行器的更多信息