Хранение и организация артефактов

В процессе автоматизированного тестирования артефакты играют ключевую роль. К артефактам относятся скриншоты, видеозаписи прохождения тестов, логи, отчёты о выполнении тестов и другие данные, которые помогают анализировать результаты и выявлять ошибки. Эффективная организация этих ресурсов позволяет ускорить отладку, облегчает интеграцию с CI/CD и повышает качество тестовой инфраструктуры.


1. Структура проекта и место хранения артефактов

Для упрощения работы с артефактами обычно создается отдельная папка, например ./artifacts, с подкаталогами:

project-root/
│
├─ tests/
│
├─ artifacts/
│   ├─ screenshots/
│   ├─ videos/
│   ├─ logs/
│   └─ reports/
│
├─ wdio.conf.js
└─ package.json
  • screenshots/ – сохраняются скриншоты, автоматически или по условию (например, при падении теста).
  • videos/ – видеозаписи сессий тестирования (требуется настройка соответствующих сервисов WebdriverIO).
  • logs/ – текстовые и структурированные логи (например, JSON), полезные для анализа нестабильных тестов.
  • reports/ – HTML- или Allure-отчёты о выполнении тестов.

Такое разделение позволяет быстро находить нужный артефакт и интегрировать его в CI/CD пайплайны.


2. Сохранение скриншотов

WebdriverIO предоставляет метод browser.saveScreenshot(filePath), который сохраняет скриншот текущего состояния браузера.

Пример сохранения скриншота при падении теста:

afterTest: async function(test, context, { error, result, duration, passed, retries }) {
    if (!passed) {
        const filePath = `./artifacts/screenshots/${test.title.replace(/\s+/g, '_')}.png`;
        await browser.saveScreenshot(filePath);
    }
}

Особенности:

  • Рекомендуется использовать replace(/\s+/g, '_') или аналогичный метод для корректных имён файлов.

  • Можно включить timestamp, чтобы избежать перезаписи:

    const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
    const filePath = `./artifacts/screenshots/${test.title}_${timestamp}.png`;

3. Видеозаписи тестовых сессий

Для записи видео WebdriverIO поддерживает интеграцию с различными сервисами, например wdio-video-reporter или Selenium Grid с поддержкой видео. В конфигурации:

const { VideoReporter } = require('wdio-video-reporter');

exports.config = {
    reporters: [
        ['video', {
            saveAllVideos: true,
            videoSlowdownMultiplier: 3
        }]
    ],
};

Основные принципы:

  • Видео сохраняются только при падении теста или всех тестов.
  • Для больших проектов можно настроить удалённое хранение видео, например в облачные хранилища.
  • Видео дополняют скриншоты: скриншот фиксирует момент ошибки, а видео — последовательность действий.

4. Логи тестов

WebdriverIO позволяет записывать как системные логи браузера, так и собственные логи тестов:

  • Логи браузера:
const logs = await browser.getLogs('browser');
logs.forEach(entry => {
    console.log(`${entry.level}: ${entry.message}`);
});
  • Собственные логи тестов: часто используют log4js или pino для структурированного хранения.

Пример настройки log4js:

const log4js = require('log4js');

log4js.configure({
    appenders: { file: { type: 'file', filename: './artifacts/logs/test.log' } },
    categories: { default: { appenders: ['file'], level: 'info' } }
});

const logger = log4js.getLogger('default');
logger.info('Тест стартовал');

5. Отчёты о выполнении тестов

WebdriverIO поддерживает множество репортеров: spec, allure, junit, json. Для организации артефактов рекомендуется сохранять их в artifacts/reports/.

Пример конфигурации Allure:

exports.config = {
    reporters: ['spec', ['allure', {
        outputDir: './artifacts/reports/allure-results',
        disableWebdriverStepsReporting: false,
        disableWebdriverScreenshotsReporting: false,
    }]],
};

Преимущества:

  • Возможность интеграции с CI/CD.
  • Сбор всех артефактов (скриншоты, видео) в единый отчёт.
  • Удобная навигация по упавшим тестам.

6. Автоматизация организации артефактов

Для больших проектов рекомендуется реализовать:

  1. Динамическую генерацию папок для каждой тестовой сессии:
const fs = require('fs');
const path = require('path');

const sessionDir = `./artifacts/session_${new Date().toISOString().replace(/[:.]/g,'-')}`;
fs.mkdirSync(sessionDir, { recursive: true });
  1. Собирание артефактов в CI/CD после выполнения тестов:
  • Передавать artifacts/screenshots и artifacts/videos в систему хранения.
  • Генерировать HTML-отчёты с ссылками на скриншоты и видео.
  1. Очистку старых артефактов для экономии места:
const rimraf = require('rimraf');
rimraf.sync('./artifacts/old-session-*');

7. Рекомендации по хранению

  • Разделять артефакты по типу и дате для удобного поиска.
  • Использовать понятные имена файлов, включающие название теста и timestamp.
  • Сохранять минимальный набор данных для успешных тестов, чтобы не перегружать хранилище.
  • Интегрировать артефакты с системами анализа (Allure, Jenkins, GitLab CI) для автоматического обзора и диагностики.

Эффективная организация артефактов делает тестовую инфраструктуру прозрачной, ускоряет анализ ошибок и облегчает поддержку проектов с большим количеством автоматизированных тестов.