Skip to content

Commit 469c15d

Browse files
committed
docs: describe component testing guide
1 parent ad008b1 commit 469c15d

File tree

5 files changed

+384
-266
lines changed

5 files changed

+384
-266
lines changed

blog/component-testing.mdx

Lines changed: 3 additions & 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+
Узнайте больше об этом в нашей документации "[Компонентное тестирование][docs-component-testing]".
17442

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

@@ -183,3 +51,5 @@ it("should render react button", async ({ browser }) => {
18351
- отображение логов в терминале для повышения комфорта и увеличения скорости разработки.
18452

18553
Переезжайте на Testplane и попробуйте новую возможность самостоятельно. В случае обнаружения проблем, приходите в [issue github](https://github.com/gemini-testing/testplane/issues) мы вам обязательно поможем!
54+
55+
[docs-component-testing]: ../../docs/component-testing.mdx

docs/guides/component-testing.mdx

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

0 commit comments

Comments
 (0)