Modern QA2026JQL-запросы
Join

Course18 Test Management Tools

Foundations · Chapter 18

JQL-запросы

Updated Jul 2026

Что такое JQL?

JQL (Jira Query Language) — это структурированный язык запросов для поиска задач в Jira. Освоение JQL превращает вас из человека, который кликает по фильтрам, в того, кто может создавать дашборды, автоматизировать отчёты и извлекать инсайты, влияющие на решения по качеству.

Основы JQL

Структура

field operator value [AND/OR field operator value]
[ORDER BY field ASC/DESC]

Распространённые операторы

Оператор Значение Пример
= Равно status = "Open"
!= Не равно status != "Closed"
in В списке priority in (Critical, High)
not in Не в списке status not in (Done, Closed)
~ Содержит (текстовый поиск) summary ~ "checkout"
>, <, >=, <= Сравнение created >= "2024-01-01"
is EMPTY Поле не имеет значения assignee is EMPTY
is not EMPTY Поле имеет значение assignee is not EMPTY
was Историческое значение status was "In Progress"
changed Поле было изменено priority changed

Необходимые JQL-запросы для QA

Отслеживание багов

-- All open critical bugs assigned to your team
project = SHOP AND type = Bug AND priority in (Critical, Highest)
AND status not in (Done, Closed) AND team = "QA Engineering"

-- Bugs created this sprint
project = SHOP AND type = Bug AND sprint in openSprints()
AND created >= startOfSprint()

-- Your unresolved tickets ordered by priority
assignee = currentUser() AND resolution = Unresolved
ORDER BY priority DESC, created ASC

-- Bugs linked to a specific epic (traceability)
project = SHOP AND type = Bug AND "Epic Link" = SHOP-1234

-- Flaky test tickets that haven't been touched in 2 weeks
project = SHOP AND labels = flaky-test AND updated <= -14d

-- Bugs that were reopened (quality of fixes)
project = SHOP AND type = Bug AND status changed to "Reopened"
AND status changed DURING (startOfSprint(), now())

Мониторинг спринта

-- All stories without linked test cases
project = SHOP AND type = Story AND sprint in openSprints()
AND NOT issueFunction in linkedIssuesOf("type = Test")

-- Stories ready for testing
project = SHOP AND type = Story AND status = "Ready for Test"
AND sprint in openSprints()

-- Blocked items
project = SHOP AND status = "Blocked"
AND sprint in openSprints()
ORDER BY priority DESC

Метрики качества

-- Bug escape rate: bugs found in production this month
project = SHOP AND type = Bug AND labels = "production"
AND created >= startOfMonth()

-- Defect density by component
project = SHOP AND type = Bug AND created >= startOfMonth()
ORDER BY component ASC

-- Average time from bug creation to resolution
project = SHOP AND type = Bug AND resolution = "Done"
AND resolved >= startOfMonth()
ORDER BY created ASC

-- Regression bugs (things that used to work)
project = SHOP AND type = Bug AND labels = "regression"
AND created >= startOfSprint()

Создание дашбордов с помощью JQL

Дашборды объединяют несколько JQL-запросов в визуальный обзор. Вот необходимые виджеты дашборда для QA-команды.

Дашборд качества спринта

Виджет JQL Тип отображения
Открытые баги по приоритету project = SHOP AND type = Bug AND status not in (Done, Closed) Круговая диаграмма
Создано vs решено багов (30 дней) Создано: project = SHOP AND type = Bug AND created >= -30d Решено: ... AND resolved >= -30d Линейный график
Бэклог нестабильных тестов labels = flaky-test AND resolution = Unresolved Список задач
Выполнение тестов в этом спринте type = "Test Execution" AND sprint in openSprints() Статистика
Неназначенные баги project = SHOP AND type = Bug AND assignee is EMPTY AND resolution = Unresolved Список задач

Дашборд готовности к релизу

-- Tests not yet executed for the release
type = "Test" AND fixVersion = "2.4.0" AND "Test Status" != "Passed"

-- Open blockers for the release
project = SHOP AND type = Bug AND priority = Blocker
AND fixVersion = "2.4.0" AND resolution = Unresolved

-- Stories without test coverage
project = SHOP AND type = Story AND fixVersion = "2.4.0"
AND NOT issueFunction in linkedIssuesOf("type = Test AND status = Passed")

Функции JQL

JQL включает встроенные функции, делающие запросы динамичными и переиспользуемыми.

Функция Что делает Пример
currentUser() Ваше имя пользователя Jira assignee = currentUser()
now() Текущая дата/время created > now("-7d")
startOfDay() Начало сегодняшнего дня created >= startOfDay()
startOfWeek() Начало текущей недели created >= startOfWeek()
startOfMonth() Начало текущего месяца created >= startOfMonth()
startOfSprint() Начало текущего спринта created >= startOfSprint()
endOfSprint() Конец текущего спринта due <= endOfSprint()
openSprints() Текущие активные спринты sprint in openSprints()
closedSprints() Завершённые спринты sprint in closedSprints()
membersOf("group") Все пользователи группы assignee in membersOf("qa-team")

Синтаксис относительных дат

-- Last 7 days
created >= -7d

-- Last 2 weeks
created >= -2w

-- Since specific date
created >= "2024-01-15"

-- Between dates
created >= "2024-01-01" AND created <= "2024-01-31"

-- This quarter
created >= startOfMonth(-2) AND created <= endOfMonth()

Сохранённые фильтры и подписки

Создание сохранённых фильтров

Сохраняйте часто используемые запросы как фильтры, чтобы не набирать их заново:

  1. Выполните JQL-запрос
  2. Нажмите «Save as» и дайте описательное имя
  3. Поделитесь с командой (установите разрешения на «Project: SHOP»)

Подписки на фильтры

Подпишитесь на фильтр для получения email-уведомлений по расписанию:

  • Ежедневное утреннее письмо: фильтр «Баги, созданные вчера»
  • Еженедельная сводка: фильтр «Баги, решённые на этой неделе»
  • Конец спринта: фильтр «Открытые баги текущего спринта»

Использование фильтров в автоматизации

Правила автоматизации Jira могут запускать действия на основе результатов фильтра:

When: Scheduled (every morning at 9 AM)
If: Filter "Unassigned Critical Bugs" returns results
Then: Send Slack message to #qa-channel with issue list

Советы и приёмы JQL

Комбинирование с фильтрами досок

Доски Jira используют JQL как базовый фильтр. Настройте вашу QA-доску:

-- QA board filter: Show items that need testing
project = SHOP AND (
  (type = Story AND status = "Ready for Test")
  OR (type = Bug AND assignee = currentUser() AND status = "In Verification")
  OR (type = "Test" AND sprint in openSprints())
)
ORDER BY priority DESC

Текстовый поиск

-- Search in summary and description
text ~ "payment timeout"

-- Search only in summary
summary ~ "checkout"

-- Search only in description
description ~ "NullPointerException"

-- Search in comments
comment ~ "cannot reproduce"

Советы по производительности

  • Используйте project = X в начале запроса для сужения области поиска
  • Избегайте text ~ на больших проектах (медленный полнотекстовый поиск)
  • Используйте ORDER BY только при необходимости (добавляет время обработки)
  • Предпочитайте labels вместо текстового поиска для категоризации

Практическое упражнение

  1. Напишите JQL-запрос, который находит все баги, созданные вами в текущем спринте
  2. Напишите JQL-запрос для открытых тикетов нестабильных тестов вашей команды, не обновлявшихся 2 недели
  3. Создайте сохранённый фильтр «Критические баги, блокирующие релиз» и поделитесь с командой
  4. Создайте дашборд с как минимум 3 виджетами, используя JQL-запросы из этого раздела
  5. Настройте ежедневную email-подписку на «Новые баги, созданные вчера»
  6. Напишите JQL-запрос, выявляющий истории текущего спринта без привязанных тест-кейсов