Современное тестирование программного обеспечения требует большего, чем просто ручные клики и исследовательское тестирование. Сегодняшние QA-инженеры нуждаются в мощных средах разработки, специализированных расширениях и инструментах отладки для написания автоматизированных тестов, анализа сетевого трафика и эффективного расследования багов. Это всеобъемлющее руководство охватывает основные IDE, расширения и инструменты, которые должен освоить каждый тестировщик.
Оглавление
- VS Code для QA-инженеров
- IntelliJ IDEA для тестирования
- Мастерство Browser DevTools
- Proxy-инструменты: Charles и Fiddler
- Выбор правильных инструментов
VS Code для QA-инженеров
Visual Studio Code стал предпочтительным редактором для многих тестировщиков благодаря своей легковесности, обширному маркетплейсу расширений и отличной поддержке множества языков программирования. Давайте рассмотрим, как превратить VS Code в мощную среду для тестирования.
Основные расширения для тестировщиков
1. Расширения для запуска тестов
Jest Runner
- Прямая интеграция с фреймворком тестирования Jest
- Запуск отдельных тестов или наборов тестов одним кликом
- Отображение результатов тестов прямо в редакторе
- Отладка тестов непосредственно из редактора
Установка:
code --install-extension Orta.vscode-jest
Конфигурация в .vscode/settings.json
:
{
"jest.autoRun": "off",
"jest (как обсуждается в [From Manual to Automation: Complete Transition Guide for QA Engineers](/blog/manual-to-automation-transition)).showCoverageOnLoad": true,
"jest (как обсуждается в [Allure Framework: Creating Beautiful Test Reports](/blog/allure-framework-reporting)).coverageFormatter": "DefaultFormatter",
"jest.debugMode": true
}
Test Explorer UI
- Унифицированный проводник тестов для множества фреймворков
- Поддерживает Jest, Mocha, Pytest, JUnit и другие
- Древовидное представление всех тестов с индикаторами прохождения/провала
- Быстрая навигация к определениям тестов
code --install-extension hbenl.vscode-test-explorer
Playwright Test for VSCode
- Запуск тестов Playwright прямо из VS Code
- Выбор локаторов с визуальным инструментом
- Запись тестов с интеграцией codegen
- Отладка с точками останова
code --install-extension ms-playwright.playwright
Пример конфигурации:
{
"playwright.reuseBrowser": true,
"playwright (как обсуждается в [Cloud Testing Platforms: Complete Guide to BrowserStack, Sauce Labs, AWS Device Farm & More](/blog/cloud-testing-platforms)).showTrace": true,
"playwright.env": {
"HEADLESS": "false"
}
}
2. Качество кода и линтинг
ESLint Необходим для качества тестового кода JavaScript/TypeScript:
code --install-extension dbaeumer.vscode-eslint
.eslintrc.js
для тестовых файлов:
module.exports = {
env: {
node: true,
jest: true,
mocha: true
},
extends: [
'eslint:recommended',
'plugin:jest/recommended'
],
rules: {
'jest/no-disabled-tests': 'warn',
'jest/no-focused-tests': 'error',
'jest/valid-expect': 'error'
}
}
Prettier Согласованное форматирование кода для тестовой автоматизации:
code --install-extension esbenp.prettier-vscode
Конфигурация:
{
"editor.formatOnSave": true,
"prettier.singleQuote": true,
"prettier.semi": false,
"prettier.tabWidth": 2
}
3. Расширения для тестирования API
REST Client Тестирование API-эндпоинтов без выхода из VS Code:
code --install-extension humao.rest-client
Создайте файлы .http
для тестирования API:
### Получить пользователя по ID
GET https://api.example.com/users/123
Authorization: Bearer {{token}}
### Создать нового пользователя
POST https://api.example.com/users
Content-Type: application/json
{
"name": "Иван Иванов",
"email": "ivan@example.com"
}
### Переменные
@baseUrl = https://api.example.com
@token = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
### Использование переменных
GET {{baseUrl}}/profile
Authorization: Bearer {{token}}
Thunder Client Легковесная альтернатива Postman:
code --install-extension rangav.vscode-thunder-client
Возможности:
- Коллекции и окружения
- Графический интерфейс для тестирования API
- Генерация сниппетов кода на нескольких языках
- Импорт/экспорт коллекций Postman
4. Отладка и инспекция
JavaScript Debugger Встроен в VS Code, но требует конфигурации:
Создайте .vscode/launch.json
:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Jest текущий файл",
"program": "${workspaceFolder}/node_modules/.bin/jest",
"args": [
"${fileBasename}",
"--runInBand",
"--no-cache"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
},
{
"type": "node",
"request": "launch",
"name": "Отладка теста Playwright",
"program": "${workspaceFolder}/node_modules/.bin/playwright",
"args": [
"test",
"${file}",
"--debug"
],
"console": "integratedTerminal"
}
]
}
CodeLLDB (для тестирования на Python):
code --install-extension vadimcn.vscode-lldb
Конфигурация отладки Python:
{
"type": "python",
"request": "launch",
"name": "Pytest текущий файл",
"module": "pytest",
"args": [
"${file}",
"-v",
"-s"
],
"console": "integratedTerminal"
}
5. Контроль версий и совместная работа
GitLens Расширенные возможности Git для отслеживания изменений в тестах:
code --install-extension eamodio.gitlens
Ключевые функции для тестировщиков:
- Аннотации blame, показывающие кто написал каждый тест
- История файлов для отслеживания эволюции тестов
- Сравнение версий тестов между ветками
- История строк для понимания модификаций тестов
Live Share Парное тестирование и совместная отладка:
code --install-extension MS-vsliveshare.vsliveshare
Сценарии использования:
- Парное программирование в тестовой автоматизации
- Сеансы удаленной отладки
- Совместный код-ревью тестов
- Сессии обмена знаниями
Пользовательские сниппеты для тестовой автоматизации
Создайте пользовательские сниппеты в Код > Настройки > Пользовательские сниппеты
:
Сниппеты для тестов Jest (javascript.json
):
{
"Jest блок Describe": {
"prefix": "desc",
"body": [
"describe('${1:название набора}', () => {",
" ${2:// код теста}",
"});"
]
},
"Jest тестовый случай": {
"prefix": "test",
"body": [
"test('${1:название теста}', async () => {",
" ${2:// реализация теста}",
"});"
]
},
"Jest Before Each": {
"prefix": "beforeach",
"body": [
"beforeEach(async () => {",
" ${1:// код подготовки}",
"});"
]
},
"Шаблон API теста": {
"prefix": "apitest",
"body": [
"test('${1:эндпоинт} должен ${2:ожидаемое поведение}', async () => {",
" const response = await request(app)",
" .${3:get}('${4:/api/endpoint}')",
" .set('Authorization', `Bearer \\${token}`);",
"",
" expect(response.status).toBe(${5:200});",
" expect(response.body).toMatchObject({",
" ${6:// ожидаемые свойства}",
" });",
"});"
]
}
}
Сниппеты Playwright:
{
"Тест Playwright": {
"prefix": "pwtest",
"body": [
"test('${1:описание теста}', async ({ page }) => {",
" await page.goto('${2:https://example.com}');",
" ${3:// шаги теста}",
"});"
]
},
"Playwright Expect": {
"prefix": "pwexpect",
"body": [
"await expect(page.locator('${1:селектор}')).${2:toBeVisible}();"
]
}
}
Конфигурация workspace для тестовых проектов
Создайте .vscode/settings.json
для вашего тестового проекта:
{
"files.exclude": {
"**/.git": true,
"**/node_modules": true,
"**/coverage": true,
"**/playwright-report": true
},
"search.exclude": {
"**/node_modules": true,
"**/coverage": true,
"**/dist": true
},
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"files.associations": {
"*.spec.js": "javascript",
"*.test.js": "javascript",
"*.http": "http"
},
"jest.autoRun": {
"watch": false,
"onSave": "test-file"
},
"testing.automaticallyOpenPeekView": "failureInVisibleDocument",
"terminal.integrated.defaultProfile.osx": "zsh",
"npm.enableScriptExplorer": true
}
Задачи для общих операций тестирования
Создайте .vscode/tasks.json
:
{
"version": "2.0.0",
"tasks": [
{
"label": "Запустить все тесты",
"type": "npm",
"script": "test",
"problemMatcher": [],
"presentation": {
"reveal": "always",
"panel": "new"
}
},
{
"label": "Запустить тесты с покрытием",
"type": "npm",
"script": "test:coverage",
"problemMatcher": [],
"presentation": {
"reveal": "always"
}
},
{
"label": "Линт тестовых файлов",
"type": "npm",
"script": "lint",
"problemMatcher": ["$eslint-stylish"]
},
{
"label": "Создать отчет Playwright",
"type": "shell",
"command": "npx playwright show-report",
"problemMatcher": []
}
]
}
Горячие клавиши для продуктивности
Настройте горячие клавиши в Keybindings
(JSON):
[
{
"key": "ctrl+shift+t",
"command": "testing.runCurrentFile"
},
{
"key": "ctrl+shift+d",
"command": "testing.debugCurrentFile"
},
{
"key": "ctrl+shift+a",
"command": "testing.runAll"
},
{
"key": "ctrl+shift+f",
"command": "testing.reRunFailTests"
}
]
Multi-Root workspace для сложных проектов
Для проектов с отдельными фронтенд и бэкенд тестами:
Создайте test-automation.code-workspace
:
{
"folders": [
{
"name": "API тесты",
"path": "./api-tests"
},
{
"name": "E2E тесты",
"path": "./e2e-tests"
},
{
"name": "Тесты производительности",
"path": "./performance-tests"
}
],
"settings": {
"files.watcherExclude": {
"**/node_modules/**": true
}
}
}
IntelliJ IDEA для тестирования
IntelliJ IDEA (и другие IDE от JetBrains) предоставляют мощные возможности для Java-автоматизации тестов, включая отличную поддержку JUnit, TestNG, Selenium и других фреймворков тестирования.
Основные плагины для тестирования
1. Плагины для тестовой автоматизации
Поддержка JUnit 5 (встроенная)
- Запуск тестов из иконок в редакторе
- Навигация между тестами и продакшн-кодом
- Автоматическая генерация методов тестов
- Анализ покрытия
Конфигурация в Run Configuration
:
Опции VM: -ea -Dfile.encoding=UTF-8
Рабочая директория: $MODULE_WORKING_DIR$
Переменные окружения: ENV=test
Плагин TestNG Поддержка продвинутого фреймворка тестирования:
<!-- Зависимость pom.xml -->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.8.0</version>
<scope>test</scope>
</dependency>
Конфигурация TestNG (testng.xml
):
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="Набор тестов" parallel="methods" thread-count="5">
<test name="API тесты">
<classes>
<class name="com.example.tests.UserApiTest"/>
<class name="com.example.tests.ProductApiTest"/>
</classes>
</test>
<test name="UI тесты">
<packages>
<package name="com.example.tests.ui"/>
</packages>
</test>
</suite>
Cucumber for Java Поддержка BDD-тестирования:
Settings > Plugins > Install "Cucumber for Java"
Возможности:
- Подсветка синтаксиса Gherkin
- Навигация от шагов к определениям шагов
- Генерация определений шагов из feature-файлов
- Запуск сценариев из редактора
Пример feature-файла:
Feature: Аутентификация пользователя
Background:
Given приложение запущено
And база данных очищена
@smoke @api
Scenario: Успешный вход с валидными учетными данными
Given существует пользователь с именем "testuser"
When пользователь входит с именем "testuser" и паролем "Test123!"
Then вход должен быть успешным
And должен быть возвращен валидный JWT токен
@negative
Scenario Outline: Неудачные попытки входа
When пользователь входит с именем "<username>" и паролем "<password>"
Then вход должен провалиться
And сообщение об ошибке должно быть "<error>"
Examples:
| username | password | error |
| invalid | Test123! | Неверные учетные данные |
| testuser | wrong | Неверные учетные данные |
| | Test123! | Требуется имя пользователя|
2. Инструменты покрытия кода
Покрытие кода IntelliJ IDEA (встроенное) Запуск тестов с покрытием:
- Правый клик на тестовом классе/пакете
- Выбрать “Run with Coverage”
- Просмотр покрытия в gutter редактора и окне Coverage
Конфигурация в .idea/workspace.xml
:
<component name="CoverageOptionsProvider">
<option name="myAddOrReplace" value="2" />
<option name="myGlobalRunner" value="IDEA" />
<option name="myTraceTestFramework" value="false" />
</component>
Плагин JaCoCo Более продвинутые отчеты о покрытии:
<!-- Maven плагин -->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.11</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>jacoco-check</id>
<goals>
<goal>check</goal>
</goals>
<configuration>
<rules>
<rule>
<element>PACKAGE</element>
<limits>
<limit>
<counter>LINE</counter>
<value>COVEREDRATIO</value>
<minimum>0.80</minimum>
</limit>
</limits>
</rule>
</rules>
</configuration>
</execution>
</executions>
</plugin>
3. Тестирование REST API
HTTP Client (встроенный)
Создайте файлы .http
для тестирования API:
### Окружение разработки
@host = http://localhost:8080
@token = {{auth_token}}
### Получить токен аутентификации
# @name auth
POST {{host}}/api/auth/login
Content-Type: application/json
{
"username": "admin",
"password": "admin123"
}
> {% client.global.set("auth_token", response.body.token); %}
### Получить всех пользователей (с аутентификацией)
GET {{host}}/api/users
Authorization: Bearer {{token}}
### Создать нового пользователя
POST {{host}}/api/users
Content-Type: application/json
Authorization: Bearer {{token}}
{
"username": "новыйпользователь",
"email": "новыйпользователь@example.com",
"role": "USER"
}
### Обновить пользователя
# @name updateUser
PUT {{host}}/api/users/{{userId}}
Content-Type: application/json
Authorization: Bearer {{token}}
{
"email": "обновленный@example.com"
}
### Обработчик ответа
> {%
client.test("Запрос выполнен успешно", function() {
client.assert(response.status === 200, "Статус ответа не 200");
});
client.test("Пользователь обновлен корректно", function() {
client.assert(response.body.email === "обновленный@example.com");
});
%}
### Удалить пользователя
DELETE {{host}}/api/users/{{userId}}
Authorization: Bearer {{token}}
4. Интеграция с инструментами баз данных
Database Tools and SQL (встроенные) Подключение к тестовым базам данных для проверки данных:
- Открыть окно инструмента Database
- Добавить источник данных (PostgreSQL, MySQL и т.д.)
- Создать консоль SQL для управления тестовыми данными
Пример скрипта настройки тестовых данных:
-- Настройка тестовых данных
TRUNCATE TABLE users CASCADE;
TRUNCATE TABLE orders CASCADE;
INSERT INTO users (id, username, email, role, created_at)
VALUES
(1, 'testuser1', 'test1@example.com', 'USER', NOW()),
(2, 'testuser2', 'test2@example.com', 'USER', NOW()),
(3, 'admin', 'admin@example.com', 'ADMIN', NOW());
INSERT INTO orders (id, user_id, product_id, quantity, total, status)
VALUES
(1, 1, 101, 2, 199.98, 'COMPLETED'),
(2, 1, 102, 1, 49.99, 'PENDING'),
(3, 2, 101, 1, 99.99, 'COMPLETED');
-- Проверка данных
SELECT u.username, COUNT(o.id) as order_count, SUM(o.total) as total_spent
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.username;
Live Templates для тестового кода
Создайте пользовательские live templates в Settings > Editor > Live Templates
:
Тестовый метод JUnit 5:
@Test
@DisplayName("$DESCRIPTION$")
void $METHOD_NAME$() {
// Arrange (Подготовка)
$ARRANGE$
// Act (Действие)
$ACT$
// Assert (Проверка)
$ASSERT$
}
REST Assured API тест:
@Test
void test$METHOD$Returns$STATUS$() {
given()
.contentType(ContentType.JSON)
.header("Authorization", "Bearer " + token)
.when()
.$HTTP_METHOD$("$ENDPOINT$")
.then()
.statusCode($STATUS_CODE$)
.body("$JSON_PATH$", equalTo($EXPECTED_VALUE$));
}
Метод Page Object для Selenium:
public $RETURN_TYPE$ $METHOD_NAME$($PARAMETERS$) {
wait.until(ExpectedConditions.elementToBeClickable($ELEMENT$));
$ELEMENT$.$ACTION$();
return $RETURN_VALUE$;
}
Data Provider TestNG:
@DataProvider(name = "$PROVIDER_NAME$")
public Object[][] $METHOD_NAME$() {
return new Object[][] {
$DATA$
};
}
Конфигурации запуска для выполнения тестов
Шаблон конфигурации JUnit:
Название: Все юнит-тесты
Тип теста: All in package
Пакет: com.example.tests.unit
Опции VM: -ea -Xmx512m
Рабочая директория: $MODULE_DIR$
Переменные окружения:
ENV=test
LOG_LEVEL=DEBUG
Перед запуском: Build, Run Maven Goal (clean compile)
Конфигурация набора TestNG:
Название: Интеграционные тесты
Набор: src/test/resources/testng-integration.xml
Опции VM: -Denv=staging -Dbrowser=chrome
Listeners: com.example.listeners.TestListener
Перед запуском: Build, Run Maven Goal (clean test-compile)
Отладка тестовых сбоев
Условные точки останова: Правый клик на точке останова и добавить условие:
username.equals("проблемныйПользователь") && response.getStatus() != 200
Вычислить выражение:
Во время отладки используйте Alt+F8
для вычисления:
// Проверить содержимое JSON ответа
new ObjectMapper().readTree(response.getBody().asString())
// Проверить состояние элемента
driver.findElement(By.id("submitBtn")).isEnabled()
// Проверка запроса к базе данных
jdbcTemplate.queryForObject("SELECT COUNT(*) FROM users WHERE status = 'ACTIVE'", Integer.class)
Точки останова исключений: Установите точки останова для конкретных исключений:
- Перейти в
Run > View Breakpoints
- Добавить
Java Exception Breakpoints
- Ввести класс исключения (например,
AssertionError
,TimeoutException
)
Анализ и инспекция кода
Включите полезные инспекции для тестового кода:
Settings > Editor > Inspections > Enable:
- JUnit > Test method naming convention
- JUnit > Test method without assertions
- TestNG > Dependent methods
- Java > Probable bugs > Constant conditions
- Java > Testing > Assertion arguments order
Пользовательский профиль инспекции для тестов:
<!-- .idea/inspectionProfiles/Tests.xml -->
<profile version="1.0">
<option name="myName" value="Tests" />
<inspection_tool class="JUnitTestMethodWithNoAssertions" enabled="true" level="WARNING" />
<inspection_tool class="TestMethodWithoutAssertion" enabled="true" level="WARNING" />
</profile>
Мастерство Browser DevTools
Инструменты разработчика браузера необходимы каждому тестировщику, будь то отладка проблем UI, анализ производительности сети или исследование ошибок JavaScript. Современные браузеры (Chrome, Firefox, Safari, Edge) предлагают мощные встроенные инструменты.
Chrome DevTools для тестирования
1. Панель Elements
Инспекция DOM для тестовой автоматизации:
- Правый клик на элементе → Inspect
- Поиск уникальных селекторов для автоматизации
- Копировать XPath: Правый клик на элементе → Copy → Copy XPath
- Копировать JS Path: Правый клик на элементе → Copy → Copy JS path
Лучшие практики генерации селекторов:
// Вместо хрупкого XPath:
// /html/body/div[1]/div[2]/form/div[3]/button
// Используйте более стабильные селекторы:
document.querySelector('[data-testid="submit-button"]')
document.querySelector('button[type="submit"].primary')
// Или относительный XPath:
//button[contains(text(), 'Отправить')]
//button[@data-testid='submit-button']
Live редактирование для тестирования:
- Двойной клик на атрибутах для изменения
- Редактировать как HTML для сложных изменений
- Тестировать CSS изменения в панели Styles
- Принудительные состояния элемента: :hover, :active, :focus
2. Панель Console
Основные команды Console для тестировщиков:
// Запрос элементов (похоже на тестовую автоматизацию)
$('button.submit') // Возвращает первое совпадение (как querySelector)
$$('button') // Возвращает все совпадения (как querySelectorAll)
$x('//button[@type="submit"]') // XPath запрос
// Инспектировать элементы
inspect($('button.submit')) // Открывает панель Elements
// Мониторинг событий
monitorEvents($('form'), 'submit') // Лог отправки формы
unmonitorEvents($('form')) // Остановить мониторинг
// Мониторинг сети
monitor(названиеФункции) // Лог когда функция вызывается
unmonitor(названиеФункции)
// Производительность
console.time('названиеОперации')
// ... выполнение кода ...
console.timeEnd('названиеОперации') // Показывает время выполнения
// Табличный вывод для анализа данных
console.table(пользователи) // Показать массив объектов как таблицу
// Тестовые утверждения
console.assert(значение > 0, 'Значение должно быть положительным')
// Получить обработчики событий
getEventListeners($('button.submit'))
// Копировать данные в буфер обмена
copy(JSON.stringify(данныеПользователя))
Сниппеты для переиспользуемых тестовых скриптов:
Создайте сниппет в Sources > Snippets
:
// Сниппет: Проверить все ошибки валидации
(function checkValidation() {
const errors = $$('.error-message');
console.table(errors.map(el => ({
элемент: el.closest('[data-testid]')?.dataset.testid || 'неизвестно',
сообщение: el.textContent.trim(),
видимый: window.getComputedStyle(el).display !== 'none'
})));
})();
// Сниппет: Протестировать данные формы
(function getFormData() {
const form = $('form');
const formData = new FormData(form);
const data = {};
for (let [key, value] of formData.entries()) {
data[key] = value;
}
console.log('Данные формы:', data);
copy(JSON.stringify(data, null, 2));
console.log('Скопировано в буфер обмена!');
})();
// Сниппет: Найти потерянные test ID
(function findOrphanedTestIds() {
const elements = $$('[data-testid]');
const testIds = elements.map(el => ({
id: el.dataset.testid,
тег: el.tagName,
текст: el.textContent.trim().substring(0, 50)
}));
console.table(testIds);
console.log(`Всего: ${testIds.length} элементов с test ID`);
})();
3. Панель Network
Анализ API-запросов для тестирования:
Фильтрация запросов:
Фильтр по типу: XHR, Fetch, JS, CSS, Img
Фильтр по домену: domain:api.example.com
Фильтр по статусу: status-code:404
Фильтр по методу: method:POST
Комбинировать: method:POST domain:api status-code:200
Анализ запроса:
- Headers: Проверить токены авторизации, типы контента
- Payload: Проверить формат тела запроса
- Preview: Просмотр структуры данных ответа
- Response: Сырые данные ответа
- Timing: Анализ длительности запроса
Копировать запрос как код: Правый клик на запросе → Copy → Copy as cURL / Copy as fetch / Copy as PowerShell
# Пример cURL для тестовой автоматизации
curl 'https://api.example.com/users' \
-H 'Authorization: Bearer eyJhbGc...' \
-H 'Content-Type: application/json' \
--data-raw '{"username":"testuser"}' \
--compressed
Экспорт HAR-файла для отчетов о багах:
- Правый клик в панели Network
- Сохранить все как HAR
- Прикрепить к отчету о баге для полного сетевого трейса
Троттлинг для тестирования производительности:
Панель Network > Выпадающий список Throttling:
- Fast 3G (1.6 Mbps)
- Slow 3G (400 Kbps)
- Offline
- Пользовательские профили
4. Панель Sources для отладки
Отладка JavaScript для тестировщиков:
Типы точек останова:
- Line Breakpoints: Клик на номере строки
- Conditional Breakpoints: Правый клик на строке → Add conditional breakpoint
userId === 123 && response.status !== 200
- DOM Breakpoints: Правый клик на элементе в панели Elements
- Break on subtree modifications
- Break on attribute modifications
- Break on node removal
- Event Listener Breakpoints: Sources > Event Listener Breakpoints
- Mouse > click
- Keyboard > keydown
- Form > submit
- XHR > XMLHttpRequest sent
- XHR/Fetch Breakpoints: Sources > XHR/fetch Breakpoints
- Добавить паттерн URL:
api/users
- Добавить паттерн URL:
Local Overrides для тестирования:
1. Sources > Overrides > Enable Local Overrides
2. Выбрать папку для переопределений
3. Редактировать ответ в панели Sources
4. Сохранить (Ctrl+S)
5. Перезагрузить страницу для тестирования измененного ответа
Сценарии использования:
- Тестировать обработку ошибок без изменений бэкенда
- Изменять API-ответы для граничных случаев
- Тестировать различные сценарии данных
- Симулировать медленные/неудачные ответы
Blackboxing сторонних скриптов:
Settings > Blackboxing > Add pattern
Паттерн: node_modules/
Улучшает отладку, пропуская код библиотек.
5. Панель Performance
Запись производительности для анализа тестов:
1. Клик на Record
2. Выполнить действия
3. Остановить запись
4. Анализировать:
- FPS: Кадров в секунду (плавно = 60 FPS)
- CPU: Время выполнения JavaScript
- Network: Водопад запросов
- Screenshots: Визуальная временная шкала
Ключевые метрики для тестировщиков:
- FCP (First Contentful Paint): Когда появляется первый контент
- LCP (Largest Contentful Paint): Когда загружен основной контент
- TTI (Time to Interactive): Когда страница становится интерактивной
- TBT (Total Blocking Time): Время блокировки главного потока
- CLS (Cumulative Layout Shift): Визуальная стабильность
Скрипт тестирования производительности:
// Записать метрики производительности
const perfData = performance.getEntriesByType('navigation')[0];
console.table({
'DNS Lookup': perfData.domainLookupEnd - perfData.domainLookupStart,
'TCP соединение': perfData.connectEnd - perfData.connectStart,
'Время запроса': perfData.responseStart - perfData.requestStart,
'Время ответа': perfData.responseEnd - perfData.responseStart,
'Обработка DOM': perfData.domInteractive - perfData.responseEnd,
'Общее время загрузки': perfData.loadEventEnd - perfData.navigationStart
});
// Получить Web Vitals
const observer = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
console.log(`${entry.name}: ${entry.value}`);
}
});
observer.observe({ entryTypes: ['largest-contentful-paint', 'first-input', 'layout-shift'] });
6. Панель Application
Инспекция хранилища для тестирования:
Local Storage / Session Storage:
// Просмотр в Console
console.table(Object.entries(localStorage))
// Манипуляция тестовыми данными
localStorage.setItem('authToken', 'test-token-123')
localStorage.removeItem('userId')
localStorage.clear()
// Тест для автоматизации
expect(localStorage.getItem('theme')).toBe('dark')
Cookies:
- Просмотр всех cookies домена
- Редактирование значений cookies
- Удаление отдельных cookies
- Очистка всех cookies
IndexedDB:
- Инспекция структуры базы данных
- Просмотр сохраненных записей
- Удаление баз данных для чистого тестового состояния
Cache Storage:
- Инспекция кешей Service Worker
- Просмотр кешированных ответов
- Удаление кеша для тестирования
7. Lighthouse для тестирования качества
Запуск автоматизированных аудитов:
1. Открыть панель Lighthouse
2. Выбрать категории:
- Performance
- Accessibility
- Best Practices
- SEO
- Progressive Web App
3. Выбрать устройство (Mobile/Desktop)
4. Кликнуть "Generate report"
Lighthouse из командной строки:
npm install -g lighthouse
# Запустить аудит
lighthouse https://example.com --output html --output-path ./report.html
# С пользовательской конфигурацией
lighthouse https://example.com \
--throttling.cpuSlowdownMultiplier=4 \
--only-categories=performance,accessibility \
--chrome-flags="--headless"
Firefox Developer Tools
Уникальные функции для тестировщиков:
Инспектор CSS Grid/Flexbox:
- Визуальное наложение для Grid/Flexbox макетов
- Лучше чем Chrome для CSS отладки
Accessibility Inspector:
Tools > Browser Tools > Accessibility
- Просмотр дерева доступности
- Проверка ARIA атрибутов
- Симуляция дальтонизма
- Проверка коэффициентов контраста
Команда Screenshot:
Открыть Developer Tools > Settings (F1) > Available Toolbox Buttons > Enable "Take a screenshot"
Или использовать Console:
:screenshot --fullpage
:screenshot --selector ".main-content"
Блокировка сетевых запросов:
Панель Network > Правый клик на запросе > Block URL
Тестировать обработку ошибок без изменений бэкенда.
Proxy-инструменты: Charles и Fiddler
Proxy-инструменты перехватывают HTTP/HTTPS трафик между клиентом и сервером, позволяя тестировщикам инспектировать, изменять и имитировать API-ответы. Необходимы для мобильного тестирования, тестирования API и тестирования безопасности.
Charles Proxy
Charles - это кроссплатформенный HTTP-прокси / HTTP-монитор / Обратный прокси, который позволяет разработчикам и тестировщикам просматривать весь HTTP/HTTPS трафик.
Установка и настройка
# macOS
brew install --cask charles
# Windows: Скачать с charlesproxy.com
# Лицензия: ~$50 (доступна бесплатная пробная версия)
Начальная конфигурация:
- Proxy > Proxy Settings
- Порт: 8888 (по умолчанию)
- Enable transparent HTTP proxying: ✓
- Proxy > macOS Proxy (для установки системного прокси)
Установка SSL-сертификата (для расшифровки HTTPS):
macOS:
1. Help > SSL Proxying > Install Charles Root Certificate
2. Открыть Keychain Access
3. Найти сертификат "Charles Proxy"
4. Двойной клик > Trust > Always Trust
Windows:
1. Help > SSL Proxying > Install Charles Root Certificate
2. Сертификат будет добавлен в Windows Certificate Store
Мобильное устройство (iOS/Android):
1. Подключить устройство к той же WiFi, что и компьютер
2. Настройки WiFi устройства > Настроить Прокси > Вручную
- Сервер: [IP компьютера]
- Порт: 8888
3. Открыть браузер на устройстве: chls.pro/ssl
4. Установить сертификат
5. iOS: Settings > General > About > Certificate Trust Settings > Enable
Настройки SSL Proxying
Включить SSL proxying для конкретных хостов:
Proxy > SSL Proxying Settings > Add
Location:
Host: *.example.com
Port: 443
Или для всех хостов:
Host: *
Port: 443
Запись и анализ трафика
Вид Structure:
- Иерархический вид хостов и путей
- Разворачивать для просмотра всех запросов к конкретной конечной точке
- Правый клик > Clear для удаления шума
Вид Sequence:
- Хронологический список всех запросов
- Лучше для понимания потока запросов
- Показывает точное время запросов
Инспектор Request/Response:
Вкладки:
- Overview: Метод, статус, время, размер
- Headers: Заголовки запроса/ответа
- Text: Ответ в виде обычного текста
- JSON: Форматированный JSON с древовидным представлением
- XML: Форматированный XML
- Raw: Полный сырой запрос/ответ
Фильтрация трафика
Фокус на конкретном хосте:
Правый клик на хосте > Focus
Теперь показывает только трафик для этого хоста
Recording Settings:
Proxy > Recording Settings > Include
Add:
Protocol: HTTP+HTTPS
Host: api.example.com
Port: 443
Path: /api/*
Фильтр по типу контента:
View > Filter Settings
Show only:
☑ JSON
☑ XML
☐ HTML
☐ Images
☐ CSS/JavaScript
Манипуляция запросами
Breakpoints для модификации запроса/ответа:
1. Proxy > Breakpoint Settings > Enable Breakpoints
2. Добавить breakpoint:
- Host: api.example.com
- Path: /api/users
- Request: ✓
- Response: ✓
Когда запрос/ответ достигает breakpoint:
- Вкладка Edit JSON Request: Изменить тело запроса
- Вкладка Edit Response: Изменить ответ
- Кликнуть Execute для продолжения
Сценарии использования:
- Тестировать обработку ошибок, изменяя коды статуса
- Изменять данные ответа для граничных случаев
- Изменять параметры запроса
- Тестировать сценарии таймаута (добавить задержку)
Map Local и Map Remote
Map Local (Заменить удаленный ответ локальным файлом):
Tools > Map Local Settings > Add
Map From:
Protocol: HTTPS
Host: api.example.com
Path: /api/users
Map To:
Local Path: /Users/test/mock-responses/users.json
Файл mock-ответа (users.json
):
{
"users": [
{
"id": 1,
"name": "Тестовый пользователь",
"email": "test@example.com",
"role": "admin"
}
],
"total": 1
}
Map Remote (Перенаправить запросы на другой сервер):
Tools > Map Remote Settings > Add
Map From:
Protocol: HTTPS
Host: api-prod.example.com
Path: /api/v2/users
Map To:
Protocol: HTTPS
Host: api-staging.example.com
Path: /api/v2/users
Сценарии использования:
- Тестировать против staging, используя production frontend
- Тестировать новую версию API
- Тестировать поведение балансировщика нагрузки
Инструмент Rewrite
Изменение запросов/ответов правилами:
Tools > Rewrite Settings > Add
Name: Добавить CORS заголовки
Apply to: api.example.com
Add Rule:
Type: Add Header
Where: Response
Name: Access-Control-Allow-Origin
Value: *
Add Rule:
Type: Modify Status
Where: Response
Status: 200
(Изменить 4xx/5xx на 200 для тестирования)
Add Rule:
Type: Body Replacement
Where: Response
Match: "status":"active"
Replace: "status":"inactive"
Throttling (ограничение сети)
Proxy > Throttle Settings > Enable Throttling
Preset: 3G (780 kbps down, 330 kbps up)
Или Custom:
Bandwidth: 512 kbps
Utilisation: 80%
Round-trip latency: 300ms
MTU: 1500 bytes
Apply to: Only selected hosts
Add: api.example.com
Сценарии использования:
- Тестировать поведение приложения в медленных сетях
- Тестировать таймауты
- Тестировать состояния загрузки
- Тестировать прогрессивное улучшение
Повтор запросов
Тестирование повторов:
Правый клик на запросе > Repeat
Правый клик на запросе > Repeat Advanced
- Count: 10
- Concurrency: 5
- Delay: 1000ms
Использовать для:
- Нагрузочного тестирования (базового)
- Тестирования race conditions
- Тестирования rate limiting
- Воспроизведения периодических проблем
Экспорт и отчетность
Экспортировать сессию:
File > Export Session
Форматы:
- Charles Session (.chls)
- HAR (HTTP Archive)
- CSV
- JSON
Создать отчет:
File > Export Report
- HTML Report
- Include request/response bodies
- Include timing information
Прикрепить к отчетам о багах для полного контекста.
Fiddler Classic / Fiddler Everywhere
Fiddler - это еще один мощный веб-отладочный прокси, популярный на Windows. Fiddler Everywhere - кроссплатформенная версия.
Установка
# Windows (Fiddler Classic - Бесплатно)
winget install Fiddler.Fiddler
# Кроссплатформенный (Fiddler Everywhere - Подписка)
# Скачать с telerik.com/fiddler
Ключевые возможности
Composers: Создание пользовательских запросов:
Composer > Parsed
Request:
Method: POST
URL: https://api.example.com/users
Headers:
Content-Type: application/json
Authorization: Bearer {token}
Body:
{
"username": "testuser",
"email": "test@example.com"
}
Execute > Просмотр ответа
AutoResponder (Похож на Charles Map Local):
Rules > Add Rule
If request matches:
EXACT: https://api.example.com/users
Then respond with:
File: C:\mocks\users.json
Or: *404
Or: *delay:5000 (задержка 5 секунд)
Or: *bpu (break on request)
FiddlerScript (Скриптинг на C#):
// Авто-изменение запросов
static function OnBeforeRequest(oSession: Session) {
// Добавить заголовок ко всем API запросам
if (oSession.uriContains("/api/")) {
oSession.oRequest["X-Test-Mode"] = "true";
}
// Блокировать аналитику
if (oSession.uriContains("analytics.google.com")) {
oSession.oRequest.FailSession(404, "Заблокировано", "");
}
}
// Авто-изменение ответов
static function OnBeforeResponse(oSession: Session) {
// Принудительный CORS
if (oSession.uriContains("/api/")) {
oSession.oResponse["Access-Control-Allow-Origin"] = "*";
}
// Лог медленных ответов
if (oSession.Timers.ClientDoneResponse.Subtract(oSession.Timers.ClientBeginRequest).TotalMilliseconds > 2000) {
FiddlerObject.log("Медленный запрос: " + oSession.fullUrl);
}
}
Фильтры:
Вкладка Filters:
Hosts:
Show only: api.example.com
Hide: cdn.example.com
Client Process:
Show only: chrome.exe
Breakpoints:
Break request on POST
Break response on status 500
Request Builder: Более продвинутый, чем Composer:
Request Builder > New Request
Templates:
- REST API GET
- REST API POST with JSON
- SOAP Request
- GraphQL Query
Сохранить как коллекцию для повторного использования
Сравнение Charles vs Fiddler
Функция | Charles | Fiddler Classic | Fiddler Everywhere |
---|---|---|---|
Платформа | Mac, Windows, Linux | Только Windows | Mac, Windows, Linux |
Цена | $50 (бессрочная) | Бесплатно | $150/год подписка |
UI | Нативный (Java Swing) | Нативный (WinForms) | Electron (современный) |
Кривая обучения | Средняя | Средняя | Легкая |
Производительность | Хорошая | Отличная | Хорошая |
Скриптинг | Ограниченный | C# (мощный) | JavaScript |
Настройка SSL | Легко | Легко | Очень легко |
Мобильное тестирование | Отлично | Отлично | Отлично |
Мокинг запросов | Map Local/Remote | AutoResponder | Mock Server |
Троттлинг сети | Да | Да | Да |
API тестирование | Базовое | Composer | Продвинутое (коллекции) |
Лучше для | Mac пользователи, простота | Windows power users | Команды, кроссплатформа |
Рабочий процесс мобильного тестирования
Полная настройка мобильного тестирования:
- Настроить прокси на устройстве:
iOS:
Settings > Wi-Fi > [Сеть] > Configure Proxy
Manual: [IP компьютера]:8888
Android:
Settings > Wi-Fi > [Сеть] > Advanced
Proxy: Manual
Hostname: [IP компьютера]
Port: 8888
Установить SSL сертификат (см. настройку Charles выше)
Включить SSL Proxying для доменов приложения
Распространенные сценарии мобильного тестирования:
Тестировать обработку ошибок API:
- Использовать Breakpoints для изменения статуса ответа на 500
- Проверить, что приложение показывает соответствующее сообщение об ошибке
- Проверить работает ли механизм повторных попыток
Тестировать офлайн режим:
- Использовать Map Local для возврата кешированных ответов
- Блокировать конкретные запросы
- Проверить офлайн функциональность
Тестировать разные версии API:
- Использовать Map Remote для указания на разные версии API
- Тестировать обратную совместимость
- Тестировать сценарии миграции
Тестировать медленные сети:
- Применить throttling (настройки 3G)
- Проверить состояния загрузки
- Проверить обработку таймаутов
- Тестировать прогрессивную загрузку изображений
Захват для отчетов о багах:
- Записать полную сессию
- Экспортировать HAR файл
- Включить в отчет о баге с шагами для воспроизведения
Выбор правильных инструментов
Матрица выбора IDE
Сценарий использования | VS Code | IntelliJ IDEA |
---|---|---|
Тесты JavaScript/TypeScript | ✓✓✓ Отлично | ✓✓ Хорошо |
Java тестовая автоматизация | ✓ Базово | ✓✓✓ Отлично |
Python тестирование | ✓✓✓ Отлично (с расширениями) | ✓✓ Хорошо (PyCharm лучше) |
Мультиязычные проекты | ✓✓✓ Отлично | ✓✓ Хорошо |
Легковесность/Быстрый старт | ✓✓✓ Отлично | ✓ Медленнее |
Встроенные функции | ✓ Нужны расширения | ✓✓✓ Отлично |
Бесплатно/Open source | ✓✓✓ Бесплатно | ✓ Community Edition |
API тестирование | ✓✓ Хорошо (расширения) | ✓✓✓ Встроенное |
Рекомендуемые комбинации инструментов
Автоматизация фронтенд-тестов:
- IDE: VS Code
- Расширения: Playwright, Jest, ESLint
- Браузер: Chrome DevTools
- Прокси: Charles
Тестирование Backend API:
- IDE: IntelliJ IDEA / VS Code
- Инструменты: REST Client, Postman
- Прокси: Charles / Fiddler
- База данных: DBeaver / IntelliJ Database Tools
Мобильное тестирование:
- IDE: VS Code / Android Studio
- Прокси: Charles (лучшая мобильная поддержка)
- Device Mirroring: scrcpy
- Производительность: Chrome DevTools (удаленная отладка)
Full Stack тестирование:
- IDE: VS Code (multi-root workspace)
- Браузер: Chrome DevTools
- API: IntelliJ HTTP Client / Thunder Client
- Прокси: Charles
Путь обучения
Неделя 1-2: Основы IDE
- Настроить VS Code или IntelliJ IDEA
- Установить основные расширения/плагины
- Выучить горячие клавиши
- Настроить отладку
- Создать пользовательские сниппеты
Неделя 3-4: Browser DevTools
- Освоить панели Elements и Console
- Изучить анализ Network
- Практиковать отладку JavaScript
- Создать переиспользуемые сниппеты
- Запустить аудиты Lighthouse
Неделя 5-6: Proxy инструменты
- Установить и настроить Charles/Fiddler
- Настроить SSL proxying
- Практиковать модификацию запросов
- Создать mock-ответы с Map Local
- Тестировать мобильные приложения
Неделя 7-8: Продвинутые техники
- Комбинировать инструменты в рабочем процессе тестирования
- Создать автоматизированные тестовые помощники
- Построить пользовательские скрипты отладки
- Документировать лучшие практики команды
- Обучить других членов команды
Советы по продуктивности
1. Горячие клавиши Выучите эти в первую очередь:
- VS Code:
Cmd/Ctrl + P
(быстрое открытие),Cmd/Ctrl + Shift + P
(палитра команд) - DevTools:
Cmd/Ctrl + Shift + C
(инспектировать элемент),Cmd + K
(очистить консоль) - Charles:
Cmd/Ctrl + K
(очистить сессию),Cmd/Ctrl + R
(старт/стоп записи)
2. Пользовательские сниппеты Создайте сниппеты для:
- Общих паттернов тестов
- Шаблонов API запросов
- Скриптов отладки в консоли
- Генераторов mock-данных
3. Организация workspace
- Используйте multi-root workspaces для сложных проектов
- Создайте .vscode/tasks.json для общих операций
- Сохраняйте конфигурации отладки
- Организуйте прокси-сессии по функциям
4. Документация Документируйте в вики команды:
- Инструкции по настройке IDE
- Требуемые расширения/плагины
- Конфигурации отладки
- Настройка прокси для проектов
- Общие шаги по устранению неполадок
5. Автоматизация Автоматизируйте повторяющиеся задачи:
- Скрипты выполнения тестов
- Генерация отчетов о покрытии
- Скрипты анализа HAR файлов
- Мониторинг производительности сети
Заключение
Освоение правильных инструментов преобразует эффективность тестирования. VS Code и IntelliJ IDEA предоставляют мощные среды для разработки тестов с правильными расширениями и конфигурациями. Browser DevTools предлагают непревзойденное понимание поведения приложения. Proxy-инструменты типа Charles и Fiddler обеспечивают глубокую инспекцию и манипуляцию API.
Ключ не в том, чтобы изучить каждую функцию каждого инструмента, а в том, чтобы:
- Выбрать инструменты, подходящие вашему технологическому стеку
- Освоить функции, которые вы используете ежедневно (правило 80/20)
- Автоматизировать повторяющиеся задачи с помощью сниппетов и скриптов
- Документировать вашу настройку для согласованности команды
- Непрерывно учиться по мере развития инструментов
Начните с одного инструмента из каждой категории (IDE, DevTools, Прокси), развивайте мастерство, затем расширяйте свой набор инструментов. Помните: инструменты - это усилители, но экспертиза в тестировании - это то, что имеет наибольшее значение.
Следующие шаги:
- Настройте свою основную IDE с необходимыми расширениями сегодня
- Практикуйте browser DevTools ежедневно во время тестирования
- Установите и настройте proxy-инструмент на этой неделе
- Создайте свой первый пользовательский сниппет или конфигурацию отладки
- Поделитесь своими знаниями с командой
Успешного тестирования!