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:
- Run the JQL query
- Click "Save as" and give it a descriptive name
- 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 = Xearly in the query to narrow the search space - Avoid
text ~on large projects (slow full-text search) - Use
ORDER BYonly when needed (adds processing time) - Prefer
labelsover text search for categorization
Hands-On Exercise
- Write a JQL query that finds all bugs you created in the current sprint
- Write a JQL query for your team's open flaky test tickets that have not been updated in 2 weeks
- Create a saved filter for "Critical bugs blocking the release" and share it with your team
- Build a dashboard with at least 3 widgets using the JQL queries from this section
- Set up a daily email subscription for "New bugs created yesterday"
- Write a JQL query that identifies stories in the current sprint with no linked test cases