QA Engineer Skills 2026QA-2026JQL Queries

JQL Queries

What Is JQL?

JQL (Jira Query Language) is a structured query language for searching Jira issues. Mastering JQL transforms you from someone who clicks through filters to someone who can build dashboards, automate reports, and surface insights that drive quality decisions.


JQL Basics

Structure

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

Common Operators

Operator Meaning Example
= Equals status = "Open"
!= Not equals status != "Closed"
in In a list priority in (Critical, High)
not in Not in a list status not in (Done, Closed)
~ Contains (text search) summary ~ "checkout"
>, <, >=, <= Comparison created >= "2024-01-01"
is EMPTY Field has no value assignee is EMPTY
is not EMPTY Field has a value assignee is not EMPTY
was Historical value status was "In Progress"
changed Field was modified priority changed

Essential JQL Queries for QA

Bug Tracking

-- 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())

Sprint Monitoring

-- 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

Quality Metrics

-- 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()

Building Dashboards with JQL

Dashboards combine multiple JQL queries into a visual overview. Here are the essential dashboard widgets for a QA team.

Sprint Quality Dashboard

Widget JQL Display Type
Open Bugs by Priority project = SHOP AND type = Bug AND status not in (Done, Closed) Pie chart
Bugs Created vs Resolved (30 days) Created: project = SHOP AND type = Bug AND created >= -30d Resolved: ... AND resolved >= -30d Line chart
Flaky Test Backlog labels = flaky-test AND resolution = Unresolved Issue list
Test Execution This Sprint type = "Test Execution" AND sprint in openSprints() Statistics
Unassigned Bugs project = SHOP AND type = Bug AND assignee is EMPTY AND resolution = Unresolved Issue list

Release Readiness Dashboard

-- 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 Functions

JQL includes built-in functions that make queries dynamic and reusable.

Function What It Does Example
currentUser() Your Jira username assignee = currentUser()
now() Current date/time created > now("-7d")
startOfDay() Start of today created >= startOfDay()
startOfWeek() Start of this week created >= startOfWeek()
startOfMonth() Start of this month created >= startOfMonth()
startOfSprint() Start of the current sprint created >= startOfSprint()
endOfSprint() End of the current sprint due <= endOfSprint()
openSprints() Currently active sprints sprint in openSprints()
closedSprints() Completed sprints sprint in closedSprints()
membersOf("group") All users in a group assignee in membersOf("qa-team")

Relative Date Syntax

-- 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()

Saved Filters and Subscriptions

Creating Saved Filters

Save frequently used queries as filters so you do not retype them:

  1. Run the JQL query
  2. Click "Save as" and give it a descriptive name
  3. Share with your team (set permissions to "Project: SHOP")

Filter Subscriptions

Subscribe to a filter to receive email notifications on a schedule:

  • Daily morning email: "Bugs created yesterday" filter
  • Weekly summary: "Bugs resolved this week" filter
  • Sprint end: "Open bugs for current sprint" filter

Using Filters in Automation

Jira automation rules can trigger actions based on filter results:

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 Tips and Tricks

Combine with Board Filters

Jira boards use JQL as their base filter. Customize your QA board:

-- 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

Text Search

-- 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"

Performance Tips

  • Use project = X early in the query to narrow the search space
  • Avoid text ~ on large projects (slow full-text search)
  • Use ORDER BY only when needed (adds processing time)
  • Prefer labels over text search for categorization

Hands-On Exercise

  1. Write a JQL query that finds all bugs you created in the current sprint
  2. Write a JQL query for your team's open flaky test tickets that have not been updated in 2 weeks
  3. Create a saved filter for "Critical bugs blocking the release" and share it with your team
  4. Build a dashboard with at least 3 widgets using the JQL queries from this section
  5. Set up a daily email subscription for "New bugs created yesterday"
  6. Write a JQL query that identifies stories in the current sprint with no linked test cases