-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #24 from gemini-testing/docs.component-testing
docs: describe component testing guide
- Loading branch information
Showing
6 changed files
with
347 additions
and
267 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,168 @@ | ||
import Admonition from "@theme/Admonition"; | ||
|
||
# Компонентное тестирование (экспериментальное) | ||
|
||
## Введение | ||
|
||
Узнайте больше об этом в посте про <a href="/blog/component-testing-intro">Компонентное тестирование</a> в нашем блоге. | ||
|
||
## Пример | ||
|
||
```typescript | ||
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 и необходимых зависимостей | ||
|
||
```bash | ||
npm init testplane@latest | ||
npm i vite @vitejs/plugin-react @testing-library/react --save-dev | ||
npm i react --save | ||
``` | ||
|
||
### Шаг 2: Создание конфигурации Vite и подключение плагина react | ||
|
||
```typescript title="vite.config.ts" | ||
import { defineConfig } from "vite"; | ||
import react from "@vitejs/plugin-react"; | ||
|
||
export default defineConfig({ | ||
plugins: [react()], | ||
}); | ||
``` | ||
|
||
### Шаг 3: Настройка запуска тестов в браузере (используя опцию testRunEnv) | ||
|
||
```typescript title=".testplane.conf.ts" | ||
export default { | ||
// ... | ||
system: { | ||
// ... | ||
testRunEnv: ["browser", { viteConfig: "./vite.config.ts" }], | ||
}, | ||
sets: { | ||
linux: { | ||
files: ["src/tests/**/*.testplane.tsx"], | ||
browsers: ["chrome"], | ||
}, | ||
}, | ||
}; | ||
``` | ||
|
||
### Шаг 4: Написание теста | ||
|
||
Чтобы проверить правильную конфигурацию, мы можем написать самый простой тест, в котором выводим значение document в консоль без использования команды [browser.execute][browser-execute]: | ||
|
||
```typescript title="src/tests/test.testplane.tsx" | ||
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: '' | ||
} | ||
} | ||
``` | ||
|
||
Давайте напишем более сложный тест с рендером компонента: | ||
|
||
```typescript title="src/tests/test.testplane.tsx" | ||
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 title="src/Component.tsx" | ||
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> | ||
); | ||
} | ||
``` | ||
|
||
Полностью работающие примеры можно найти [здесь][testplane-examples-component-testing]. | ||
|
||
## Временные ограничения | ||
|
||
<Admonition type="warning"> | ||
* поддерживаются только компоненты, написанные на React в файлах .jsx и .tsx. Возможность | ||
написания тестов в файлах .js будет реализована в ближайшем будущем. Мы также планируем | ||
поддержку фреймворка Vue; * нет доступа к currentTest из it, beforeEach и afterEach. Это будет | ||
добавлено в ближайшем будущем; * плагин [@testplane/global-hook][testplane-global-hook] в | ||
настоящее время временно не поддерживается. | ||
</Admonition> | ||
|
||
## Дополнительные возможности | ||
|
||
### Горячая замена модулей (HMR) | ||
|
||
[HMR][vite-hmr] поддерживается в Vite. Это означает, что если вы измените загруженный файл, либо компонент будет повторно монтироваться, либо страница будет полностью предварительно загружена. Если компонент описан в отдельном файле (т.е. не в том же файле, что и тест), произойдет повторная установка, но тест не будет перезапущен. А если вы измените файл теста, страница будет перезагружена, что заставит Testplane прервать выполнение текущего теста и запустить его заново. Благодаря этой функции вы можете быстро разрабатывать компоненты в Vite и писать для них тесты. Рекомендуется использовать ее вместе с [REPL режимом][repl-mode]. | ||
|
||
### Использование экземпляров browser и expect напрямую в средствах разработчика браузера | ||
|
||
Инстансы `browser` и `expect` доступны в глобальной области видимости браузера. Это довольно удобно использовать при отладке теста. | ||
|
||
### Логи из консоли браузера в терминале | ||
|
||
Вызов команд `log`, `info`, `warn`, `error`, `debug` и `table` на объекте `console` в браузере приводит к отображению информации не только в средствах разработчика браузера, но также в терминале, из которого был запущен Testplane. То есть, вы можете вызывать `console.log` в тесте/компоненте и увидеть результат его выполнения в терминале. Это особенно удобно при отладке тестов. | ||
|
||
[test-run-env-option]: ../config/system.mdx#testrunenv | ||
[browser-execute]: ../commands/browser/execute.mdx | ||
[testplane-examples-component-testing]: https://github.com/gemini-testing/testplane/tree/master/examples/component-testing | ||
[testplane-global-hook]: https://github.com/gemini-testing/testplane-global-hook | ||
[vite-hmr]: https://vitejs.dev/guide/api-hmr.html | ||
[repl-mode]: ../command-line/index.mdx#repl |
Oops, something went wrong.