Skip to content

Commit 5d88346

Browse files
committed
docs: describe component testing guide
1 parent 655fda6 commit 5d88346

File tree

5 files changed

+394
-266
lines changed

5 files changed

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

0 commit comments

Comments
 (0)