Компонентное тестирование
Введение
Узнайте больше о б этом в посте про Компонентное тестирование в нашем блоге.
Пример
import { render } from '@testing-library/react';
import Component from '../Component';
it('should render react component', async ({browser}) => {
// Отрендерить компонент на изолированной странице
render(<Component />);
// Найти кнопку внутри компонента и кликнуть по ней
const button = await browser.$("button");
await button.click();
// Проверить, что текст кнопки имеет ожидаемое значение
await expect(button).toHaveText("count is 1");
});
Как начать?
Давайте настроим тестирование реакт компонентов, написанных на Typescript.
Шаг 1: Установка Testplane и необходимых зависимостей
npm init testplane@latest
npm i vite @vitejs/plugin-react @testing-library/react --save-dev
npm i react --save
Шаг 2: Создание конфигурации Vite и подключение плагина react
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
export default defineConfig({
plugins: [react()],
});
Шаг 3: Настройка запуска тестов в браузере (используя опцию testRunEnv)
export default {
// ...
system: {
// ...
testRunEnv: ["browser", { viteConfig: "./vite.config.ts" }],
},
sets: {
linux: {
files: ["src/tests/**/*.testplane.tsx"],
browsers: ["chrome"],
},
},
};
Шаг 4: Написание теста
Чтобы проверить правильную конфигурацию, мы можем написать самый простой тест, в котором выводим значение document в консоль без использования команды browser.execute:
it("should log document", async () => {
console.log(document);
});
Если бы такой тест был выполнен в среде Node.js, то он упал бы с ошибкой: ReferenceError: document is not defined
. Но в нашем случае он будет выполнен непосредственно в браузере, где глобальная переменная document
доступна. Поэтому в консоли браузера и терминала мы увидим следующее:
{
location: {
ancestorOrigins: {},
href: 'http://localhost:56292/run-uuids/23d2af81-4259-425c-8214-c9e770d75ea4',
origin: 'http://localhost:56292',
protocol: 'http:',
host: 'localhost:56292',
hostname: 'localhost',
port: '56292',
pathname: '/run-uuids/23d2af81-4259-425c-8214-c9e770d75ea4',
search: '',
hash: ''
}
}
Давайте напишем более сложный тест с рендером компонента:
import { render } from '@testing-library/react';
import Component from '../Component';
it('should render react component', async ({browser}) => {
// Отрендерить компонент на изолированной странице
render(<Component />);
// Найти кнопку внутри компонента и кликнуть по ней
const button = await browser.$("button");
await button.click();
// Проверить, что текст кнопки имеет ожидаемое значение
await expect(button).toHaveText("count is 1");
});
И исходный код самого компонента:
import { useState } from 'react';
// A simple component with a title and a counter button
function Component() {
const [count, setCount] = useState(0);
return (
<div id="root">
<h1>Testplane Component Testing</h1>
<button onClick={() => setCount((count) => count + 1)}>
count is {count}
</button>
</div>
);
}
Полностью работающие примеры можно найти здесь.
Временные ограничения
-
поддерживаются только компоненты, написанные на React в файлах .jsx и .tsx. Возможность написания тестов в файлах .js будет реализована в ближайшем будущем. Мы также планируем поддержку фреймворка Vue;
-
нет доступа к currentTest из it, beforeEach и afterEach. Это будет добавлено в ближайшем будущем;
-
плагин @testplane/global-hook в настоящее время временно не поддерживается.
Дополнительные возможности
Горячая замена модулей (HMR)
HMR поддерживается в Vite. Это означает, что если вы измените загруженный файл, либо компонент будет повторно монтироваться, либо страница будет полностью предварительно загружена. Если компонент описан в отдельном файле (т.е. не в том же файле, что и тест), произойдет повторная установка, но тест не будет перезапущен. А если вы измените файл теста, страница будет перезагружена, что заставит Testplane прервать выполнение текущего теста и запусти ть его заново. Благодаря этой функции вы можете быстро разрабатывать компоненты в Vite и писать для них тесты. Рекомендуется использовать ее вместе с REPL режимом.
Использование экземпляров browser и expect напрямую в средствах разработчика браузера
Инстансы browser
и expect
доступны в глобальной области видимости браузера. Это довольно удобно использовать при отладке теста.
Логи из консоли браузера в терминале
Вызов команд log
, info
, warn
, error
, debug
и table
на объекте console
в браузере приводит к отображению информации не только в средствах разработчика браузера, но также в терминале, из которого был запущен Testplane. То есть, вы можете вызывать console.log
в тесте/компоненте и увидеть результат его выполнения в терминале. Это особенно удобно при отладке тестов.