Skip to content

Commit 0c4e39d

Browse files
committed
docs: describe component testing guide
1 parent ad008b1 commit 0c4e39d

File tree

5 files changed

+346
-267
lines changed

5 files changed

+346
-267
lines changed

blog/component-testing.mdx

Lines changed: 1 addition & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -38,139 +38,7 @@ import Admonition from "@theme/Admonition";
3838

3939
### Как использовать?
4040

41-
Будем настраивать тестирование react-компонентов, написанных на TypeScript. Поэтому, для начала установим необходимые зависимости:
42-
43-
```bash
44-
npm i testplane vite @vitejs/plugin-react @testing-library/react --save-dev
45-
npm i react --save
46-
```
47-
48-
Создаем Vite конфиг, в котором подключим плагин для поддержки React. Пример:
49-
50-
```javascript
51-
// vite.config.ts
52-
import { defineConfig } from "vite";
53-
import react from "@vitejs/plugin-react";
54-
55-
export default defineConfig({
56-
plugins: [react()],
57-
});
58-
```
59-
60-
Теперь настроим запуск тестов в браузере. Для этого укажем опцию [testRunEnv](https://github.com/gemini-testing/testplane/blob/master/docs/config.md#testrunenv). Пример:
61-
62-
```javascript
63-
// .testplane.conf.ts
64-
export const {
65-
// ...
66-
system: {
67-
// ...
68-
testRunEnv: ['browser', { viteConfig: './vite.config.ts' }],
69-
},
70-
sets: {
71-
linux: {
72-
files: [
73-
'src/tests/**/*.testplane.tsx'
74-
],
75-
browsers: [
76-
'chrome'
77-
]
78-
},
79-
},
80-
}
81-
```
82-
83-
После чего можем написать тест, в котором просто выведем значение `document` в консоль без использования команды [browser.execute](/docs/v8/commands/browser/execute):
84-
85-
```javascript
86-
// src/tests/test.testplane.tsx
87-
it("should log document", async () => {
88-
console.log(document);
89-
});
90-
```
91-
92-
Если бы такой тест выполнялся в окружении Node.js, то он бы упал с ошибкой `ReferenceError: document is not defined`. Но в нашем случае он будет выполнен прямо в браузере, где доступна глобальная переменная `document`. Поэтому, в логе браузера и терминала (про эту возможность расскажем ниже) мы увидим следующее:
93-
94-
```
95-
{
96-
location: {
97-
ancestorOrigins: {},
98-
href: 'http://localhost:56292/run-uuids/23d2af81-4259-425c-8214-c9e770d75ea4',
99-
origin: 'http://localhost:56292',
100-
protocol: 'http:',
101-
host: 'localhost:56292',
102-
hostname: 'localhost',
103-
port: '56292',
104-
pathname: '/run-uuids/23d2af81-4259-425c-8214-c9e770d75ea4',
105-
search: '',
106-
hash: ''
107-
}
108-
}
109-
```
110-
111-
Напишем более сложный тест с рендерингом React-компонента. Для этого сначала напишем небольшой компонент:
112-
113-
```javascript
114-
// src/components/Component.tsx
115-
import { useState } from "react";
116-
117-
// Простой компонент с тайтлом и кнопкой-счетчиком
118-
function Component() {
119-
const [count, setCount] = useState(0);
120-
121-
return (
122-
<div id="root">
123-
<h1>Testplane Component Testing!</h1>
124-
<button onClick={() => setCount(count => count + 1)}>count is {count}</button>
125-
</div>
126-
);
127-
}
128-
129-
export default Component;
130-
```
131-
132-
И напишем сам тест, который будет тестировать наш React-компонент:
133-
134-
```javascript
135-
// src/tests/test.testplane.tsx
136-
import { render } from "@testing-library/react";
137-
import Component from "../components/Component";
138-
139-
it("should render react button", async ({ browser }) => {
140-
render(<Component />); // рендерим компонент на сгенеренной странице Vite
141-
142-
const button = await browser.$("button");
143-
144-
await button.click();
145-
await button.click();
146-
147-
await expect(button).toHaveText("count is 2");
148-
});
149-
```
150-
151-
С полноценно работающими примерами можно ознакомиться [здесь](https://github.com/gemini-testing/testplane/tree/master/examples/component-testing).
152-
153-
<Admonition type="warning" title="На данный момент есть ограничения">
154-
- поддерживаются только компоненты, написанные на React в файлах `.jsx` и `.tsx`. Поддержка Vue
155-
также есть в планах; - нет доступа к `currentTest` из хуков и теста; - временно не
156-
поддерживается плагин @testplane/global-hook.
157-
</Admonition>
158-
159-
### Какие дополнительные возможности поддерживаются?
160-
161-
#### 1. Hot Module Replacement (HMR)
162-
163-
В Vite поддерживается [HMR](https://vitejs.dev/guide/api-hmr.html). Это означает, что если изменить загруженный файл, то произойдет или ремаунт компонента, или полная перезагрузка страницы. В случае, если компонент описан в отдельном файле (т.е. не в одном файле с тестом), то будет выполнен ремаунт, но тест перезапущен не будет. А если изменить файл с тестом, то произойдет перезагрузка страницы, которая приведет к тому, что Testplane прервет выполнение текущего теста и запустит его заново. За счет такой возможности в Vite можно очень быстро разрабатывать компоненты и писать для них тесты. Рекомендуется использовать вместе с REPL-режимом.
164-
165-
При изменении исходников компонента не происходит полного перезапуска теста (маунтится по новой только сам компонент). При этом, если изменить код теста, то происходит полный перезапуск.
166-
167-
#### 2. Использование инстанса browser и expect прямо в DevTools браузера
168-
169-
В консоли браузера, в котором выполняется тест, доступны инстанс самого `browser` и инстанс `expect`. Это довольно удобно использовать при дебаге теста.
170-
171-
#### 3. Логи из консоли браузера в терминале
172-
173-
Вызов команд `log`, `info`, `warn`, `error`, `debug` и `table` на объекте `console` в браузере приводят к тому, что отображается информация не только в DevTools браузера, но также и в терминале, из которого был запущен Testplane. Т.е. можно вызвать `console.log` в тесте/компоненте и затем увидеть результат его выполнения в терминале. Это также довольно удобно при дебаге теста.
41+
Узнайте больше об этом в нашей документации <a href="/docs/guides/component-testing">Компонентное тестирование</a>.
17442

17543
### Заключение
17644

docs/guides/component-testing.mdx

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
import Admonition from "@theme/Admonition";
2+
3+
# Компонентное тестирование (экспериментальное)
4+
5+
## Введение
6+
7+
Узнайте больше об этом в посте про <a href="/blog/component-testing-intro">Компонентное тестирование</a> в нашем блоге.
8+
9+
## Пример
10+
11+
```typescript
12+
import { render } from '@testing-library/react';
13+
import Component from '../Component';
14+
15+
it('should render react component', async ({browser}) => {
16+
// Отрендерить компонент на изолированной странице
17+
render(<Component />);
18+
19+
// Найти кнопку внутри компонента и кликнуть по ней
20+
const button = await browser.$("button");
21+
await button.click();
22+
23+
// Проверить, что текст кнопки имеет ожидаемое значение
24+
await expect(button).toHaveText("count is 1");
25+
});
26+
```
27+
28+
## Как начать?
29+
30+
Давайте настроим тестирование реакт компонентов, написанных на Typescript.
31+
32+
### Шаг 1: Установка Testplane и необходимых зависимостей
33+
34+
```bash
35+
npm init testplane@latest
36+
npm i vite @vitejs/plugin-react @testing-library/react --save-dev
37+
npm i react --save
38+
```
39+
40+
### Шаг 2: Создание конфигурации Vite и подключение плагина react
41+
42+
```typescript title="vite.config.ts"
43+
import { defineConfig } from "vite";
44+
import react from "@vitejs/plugin-react";
45+
46+
export default defineConfig({
47+
plugins: [react()],
48+
});
49+
```
50+
51+
### Шаг 3: Настройка запуска тестов в браузере (используя опцию testRunEnv)
52+
53+
```typescript title=".testplane.conf.ts"
54+
export default {
55+
// ...
56+
system: {
57+
// ...
58+
testRunEnv: ["browser", { viteConfig: "./vite.config.ts" }],
59+
},
60+
sets: {
61+
linux: {
62+
files: ["src/tests/**/*.testplane.tsx"],
63+
browsers: ["chrome"],
64+
},
65+
},
66+
};
67+
```
68+
69+
### Шаг 4: Написание теста
70+
71+
Чтобы проверить правильную конфигурацию, мы можем написать самый простой тест, в котором выводим значение document в консоль без использования команды [browser.execute][browser-execute]:
72+
73+
```typescript title="src/tests/test.testplane.tsx"
74+
it("should log document", async () => {
75+
console.log(document);
76+
});
77+
```
78+
79+
Если бы такой тест был выполнен в среде Node.js, то он упал бы с ошибкой: `ReferenceError: document is not defined`. Но в нашем случае он будет выполнен непосредственно в браузере, где глобальная переменная `document` доступна. Поэтому в консоли браузера и терминала мы увидим следующее:
80+
81+
```
82+
{
83+
location: {
84+
ancestorOrigins: {},
85+
href: 'http://localhost:56292/run-uuids/23d2af81-4259-425c-8214-c9e770d75ea4',
86+
origin: 'http://localhost:56292',
87+
protocol: 'http:',
88+
host: 'localhost:56292',
89+
hostname: 'localhost',
90+
port: '56292',
91+
pathname: '/run-uuids/23d2af81-4259-425c-8214-c9e770d75ea4',
92+
search: '',
93+
hash: ''
94+
}
95+
}
96+
```
97+
98+
Давайте напишем более сложный тест с рендером компонента:
99+
100+
```typescript title="src/tests/test.testplane.tsx"
101+
import { render } from '@testing-library/react';
102+
import Component from '../Component';
103+
104+
it('should render react component', async ({browser}) => {
105+
// Отрендерить компонент на изолированной странице
106+
render(<Component />);
107+
108+
// Найти кнопку внутри компонента и кликнуть по ней
109+
const button = await browser.$("button");
110+
await button.click();
111+
112+
// Проверить, что текст кнопки имеет ожидаемое значение
113+
await expect(button).toHaveText("count is 1");
114+
});
115+
```
116+
117+
И исходный код самого компонента:
118+
119+
```typescript title="src/Component.tsx"
120+
import { useState } from 'react';
121+
122+
// A simple component with a title and a counter button
123+
function Component() {
124+
const [count, setCount] = useState(0);
125+
126+
return (
127+
<div id="root">
128+
<h1>Testplane Component Testing</h1>
129+
<button onClick={() => setCount((count) => count + 1)}>
130+
count is {count}
131+
</button>
132+
</div>
133+
);
134+
}
135+
```
136+
137+
Полностью работающие примеры можно найти [здесь][testplane-examples-component-testing].
138+
139+
## Временные ограничения
140+
141+
<Admonition type="warning">
142+
* поддерживаются только компоненты, написанные на React в файлах .jsx и .tsx. Возможность
143+
написания тестов в файлах .js будет реализована в ближайшем будущем. Мы также планируем
144+
поддержку фреймворка Vue; * нет доступа к currentTest из it, beforeEach и afterEach. Это будет
145+
добавлено в ближайшем будущем; * плагин [@testplane/global-hook][testplane-global-hook] в
146+
настоящее время временно не поддерживается.
147+
</Admonition>
148+
149+
## Дополнительные возможности
150+
151+
### Горячая замена модулей (HMR)
152+
153+
[HMR][vite-hmr] поддерживается в Vite. Это означает, что если вы измените загруженный файл, либо компонент будет повторно монтироваться, либо страница будет полностью предварительно загружена. Если компонент описан в отдельном файле (т.е. не в том же файле, что и тест), произойдет повторная установка, но тест не будет перезапущен. А если вы измените файл теста, страница будет перезагружена, что заставит Testplane прервать выполнение текущего теста и запустить его заново. Благодаря этой функции вы можете быстро разрабатывать компоненты в Vite и писать для них тесты. Рекомендуется использовать ее вместе с [REPL режимом][repl-mode].
154+
155+
### Использование экземпляров browser и expect напрямую в средствах разработчика браузера
156+
157+
Инстансы `browser` и `expect` доступны в глобальной области видимости браузера. Это довольно удобно использовать при отладке теста.
158+
159+
### Логи из консоли браузера в терминале
160+
161+
Вызов команд `log`, `info`, `warn`, `error`, `debug` и `table` на объекте `console` в браузере приводит к отображению информации не только в средствах разработчика браузера, но также в терминале, из которого был запущен Testplane. То есть, вы можете вызывать `console.log` в тесте/компоненте и увидеть результат его выполнения в терминале. Это особенно удобно при отладке тестов.
162+
163+
[test-run-env-option]: ../config/system.mdx#testrunenv
164+
[browser-execute]: ../commands/browser/execute.mdx
165+
[testplane-examples-component-testing]: https://github.com/gemini-testing/testplane/tree/master/examples/component-testing
166+
[testplane-global-hook]: https://github.com/gemini-testing/testplane-global-hook
167+
[vite-hmr]: https://vitejs.dev/guide/api-hmr.html
168+
[repl-mode]: ../command-line/index.mdx#repl

0 commit comments

Comments
 (0)