Разработка плагинов
Плагины позволяют добавлять собственные UI-компоненты в интерфейс HTML Reporter. Например, вы можете показать статистику стабильности теста или добавить кнопку для интеграции с внешним сервисом. В HTML Reporter есть несколько точек расширения, в которых может отображаться UI плагина — например, на панели настроек или на странице результатов запуска теста.
Быстрый старт
Пример плагина, в котором настроена сборка и используются основные возможности плагинной системы, доступен в репозитории HTML Reporter.
Мы рекомендуем использовать этот пример как шаблон для своего плагина.
Как работают плагины
Плагины подключаются к HTML Reporter в конфиге, например:
export default {
plugins: {
"html-reporter/testplane": {
pluginsEnabled: true,
plugins: [
{
name: "my-plugin-package",
component: "MyPlugin",
point: "result_meta",
position: "after",
},
],
},
},
};
В этом случае HTML Reporter будет искать плагин в npm-пакете my-plugin-package, а именно:
- В
my-plugin-package/plugin.jsHTML Reporter будет искать реализацию компонентаMyPlugin, который будет отображаться в точке расширенияresult_meta - В
my-plugin-package/middleware.jsHTML Reporter будет искать реализацию серверных эндпоинтов
Поэтому типичный плагин состоит из трёх частей:
my-plugin/
├── ui/ # UI плагина — собирается в бандл plugin.js с помощью Vite
├── server/ # Серверная часть плагина (опционально) — входная точка ожидается в файле middleware.js
└── preset-for-config/ # Пресет для удобного подключения (опционально)
Создание UI плагина
1. Настройка сборки
Формат выходного файла
Результатом сборки UI плагина должен быть 1 файл — бандл plugin.js следующего формата:
__testplane_html_reporter_register_plugin__([
"react",
function (React, options) {
// ...
return { MyPlugin, reducers: [] };
},
]);
Файл должен содержать только вызов функции __testplane_html_reporter_register_plugin__.
Единственный аргумент функции — массив. В нём декларируются нужные плагину зависимости (доступные зависимости см. в справочнике по Plugins SDK), последний элемент массива — функция, она будет вызвана с перечисленными зависимостями и должна вернуть объект с компонентом и редьюсерами.
Подробнее о том, с чем именно вызывается эта функция, см. в исходном коде HTML Reporter.
Переиспользование зависимостей
Для корректной работы React и хуков критично, чтобы зависимости не дублировались, а везде использовались одни и те же экземпляры — и в HTML Reporter, и в плагине.
HTML Reporter предоставляет плагинам ряд зависимостей, которые можно переиспользовать, включая React и Gravity UI.
Чтобы переиспользовать эти зависимости, нужно указать их в external в конфигурации Vite.
Пример конфигурации Vite
На практике нужные характеристики бандла достигаются с помощью сборки через Vite с external зависимостями и специальной обёрткой. Пример конфига можно посмотреть в репозитории HTML Reporter.
2. Реализация компонента
В зависимости от того, какая точка расширения используется, HTML Reporter может передавать в props некоторые данные, например, текущий результат запуска теста (см. подробнее в справочнике по Plugins SDK):
import { Button } from "@gravity-ui/uikit";
export const MyPlugin = ({ result }: { result: { id: string; suitePath: string[] } }) => {
const fullName = result.suitePath.join(" ");
return (
<div>
<div>Test Full Name: {fullName}</div>
<Button onClick={() => window.open(`example-tms.com/test/${result.id}`, "_blank")}>
Open test in TMS
</Button>
</div>
);
};
Главный файл плагина можно организовать так:
import { MyPlugin } from "./Plugin";
export default {
MyPlugin,
reducers: [],
};