The Testing Academy · AI for QA

Agent Skills for QA Engineers

Two things here. Build a GitHub Copilot skill from scratch that turns a Jira story into a PDF + XLSX test plan, and download the full 36-skill QA Skill Suite covering every phase of the STLC. Both free, both copy-paste ready.

36 agent skills Full STLC coverage Playwright + Selenium MIT licensed

You have probably seen the n8n version: a chat trigger feeds an AI Agent, a chat model does the thinking, and a Jira tool acts. We are going to rebuild that pattern as a portable agent skill that GitHub Copilot (or any skill-aware agent, per agentskills.io) can pick up on its own, then have it produce shareable PDF and XLSX test plans.

1. What is an agent skill?

A skill is a folder with a SKILL.md file plus optional scripts. The SKILL.md has a short front-matter (name + description) and a body of instructions. When your request matches the description, the agent loads the instructions and follows them, running the bundled scripts as needed. It is the cleanest way to teach GitHub Copilot a repeatable, multi-step workflow like "turn this Jira story into a test plan."

Why a skill and not a prompt? A prompt is one-shot and lives in your head. A skill is versioned, shareable across your team, self-describing (Copilot decides when to use it), and can run real code (call Jira, write files). Same reliability jump as moving from a manual test to an automated one.

2. The flow

Here is the whole pipeline. Compare it to the n8n graph: the "AI Agent" is Copilot, the "Chat Model" is Copilot's model, and instead of a Jira create-issue tool we use a Jira fetch step plus two export steps.

You "QAJB-42" Copilot Skill test-plan-from-jira fetch Jira story summary + AC story JSON generate plan Test Plan .pdf .xlsx
One Jira key in, a shareable PDF and a filable XLSX out.

3. Skill anatomy

The skill is just three files in a folder. Copilot reads SKILL.md, and the two scripts do the Jira call and the file export.

test-plan- from-jira/ the skill folder SKILL.md name + description + steps fetch_jira.py calls the Jira REST API export.py writes .pdf and .xlsx
Three files. Copilot reads the first, runs the other two.

4. Build it step by step

  1. Create the folder. In your repo (or ~/.config/github-copilot/skills/ for a global skill): mkdir -p test-plan-from-jira/scripts.
  2. Add SKILL.md with the front-matter and steps (full text below). The description is what makes Copilot pick the skill automatically.
  3. Add the two scripts into scripts/. Install deps once: pip install requests reportlab openpyxl.
  4. Set three env vars (never hard-code secrets): JIRA_BASE_URL, JIRA_EMAIL, JIRA_API_TOKEN. Create the token at id.atlassian.com → Security → API tokens.
  5. Ask Copilot: "create a test plan from QAJB-42". It matches the skill, fetches the story, drafts the plan, and exports both files.
Secrets rule: the Jira token goes in an environment variable or your secret manager, never in SKILL.md or any tracked file. The script reads it from os.environ.

5. The full SKILL.md

This is the whole brain of the skill. Copy it verbatim into test-plan-from-jira/SKILL.md.

test-plan-from-jira/SKILL.md
---
name: test-plan-from-jira
description: Fetch a Jira story or epic by key and generate a complete QA test
  plan (scope, scenarios, positive / negative / edge cases with steps and expected
  results), then export it to a polished PDF and a filable XLSX. Use whenever the
  user says "create a test plan from <JIRA-KEY>", "write test cases for this story",
  "turn this ticket into a test plan", or asks to export a test plan to PDF / Excel.
---

# Test Plan from Jira

Turn one Jira issue into a review-ready QA test plan and shareable files.

## Steps

1. Get the Jira key(s) from the user (e.g. `QAJB-42`). If none given, ask for one.
2. Fetch the story:
   `python scripts/fetch_jira.py <KEY> > story.json`
   This returns summary, description, acceptance criteria, type, priority, labels.
3. Read `story.json` and design the test plan. Cover, at minimum:
   - **Scope + assumptions** (what is / is not tested)
   - **Test scenarios** grouped by feature area
   - For each scenario: `id`, `title`, `type` (positive / negative / edge / boundary),
     `priority` (P1..P3), `preconditions`, numbered `steps`, `expected_result`
   - Derive negative + boundary cases from every acceptance criterion, do not just
     restate the happy path.
4. Write the plan as JSON to `plan.json` (schema below).
5. Export both files:
   `python scripts/export.py plan.json`
   -> writes `test-plan-<KEY>.pdf` and `test-plan-<KEY>.xlsx`.
6. Tell the user the file paths and give a 3-line summary (scope + case count by type).

## plan.json schema

```json
{
  "key": "QAJB-42",
  "title": "Coupon code at checkout",
  "scope": "Applying, validating, and removing coupon codes at checkout.",
  "out_of_scope": ["Payment gateway", "Inventory"],
  "cases": [
    {
      "id": "TC-01", "title": "Valid coupon applies discount",
      "type": "positive", "priority": "P1",
      "preconditions": "Cart has 1 eligible item; coupon SAVE10 is active",
      "steps": ["Open checkout", "Enter SAVE10", "Click Apply"],
      "expected_result": "10% discount shown; total updates; success toast"
    }
  ]
}
```

## Rules

- Never hard-code the Jira token. `fetch_jira.py` reads `JIRA_*` env vars.
- Every acceptance criterion must map to at least one positive AND one negative case.
- Keep steps atomic and imperative; expected results must be verifiable.
- If the story is thin, list the assumptions you made at the top of the plan.

6. Script: fetch from Jira

Pulls the issue over the Jira Cloud REST API (v3) and prints a clean JSON the model can reason over. Auth is Basic (email + API token) over HTTPS.

test-plan-from-jira/scripts/fetch_jira.py
# Fetch one Jira issue and print normalized JSON. Usage: python fetch_jira.py QAJB-42
import os, sys, json, base64, urllib.request

def adf_to_text(node):
    # Atlassian Document Format -> plain text (recursive, best-effort).
    if node is None: return ""
    if isinstance(node, str): return node
    out = []
    if node.get("text"): out.append(node["text"])
    for ch in node.get("content", []) or []:
        out.append(adf_to_text(ch))
    sep = "\n" if node.get("type") in ("paragraph", "listItem", "heading") else ""
    return sep.join(p for p in out if p)

def main():
    key = sys.argv[1]
    base = os.environ["JIRA_BASE_URL"].rstrip("/")   # https://your.atlassian.net
    email = os.environ["JIRA_EMAIL"]
    token = os.environ["JIRA_API_TOKEN"]
    auth = base64.b64encode(f"{email}:{token}".encode()).decode()

    url = f"{base}/rest/api/3/issue/{key}" \
          "?fields=summary,description,issuetype,priority,labels,customfield_10000"
    req = urllib.request.Request(url, headers={
        "Authorization": f"Basic {auth}", "Accept": "application/json"})
    with urllib.request.urlopen(req) as r:
        data = json.load(r)

    f = data["fields"]
    story = {
        "key": data["key"],
        "summary": f.get("summary", ""),
        "type": (f.get("issuetype") or {}).get("name"),
        "priority": (f.get("priority") or {}).get("name"),
        "labels": f.get("labels", []),
        "description": adf_to_text(f.get("description")),
    }
    print(json.dumps(story, indent=2))

if __name__ == "__main__":
    main()
Acceptance criteria often live in a custom field (here customfield_10000) or inside the description. Adjust the field id to your Jira; find it via /rest/api/3/field.

7. Script: export PDF + XLSX

Takes the model's plan.json and writes both a formatted PDF (reportlab) and a spreadsheet (openpyxl) with one row per test case, ready to paste into a test-management tool.

test-plan-from-jira/scripts/export.py
# Render plan.json to test-plan-<KEY>.pdf and .xlsx. Usage: python export.py plan.json
import sys, json
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment

plan = json.load(open(sys.argv[1]))
key = plan["key"]; cases = plan.get("cases", [])

# ---------- XLSX ----------
wb = Workbook(); ws = wb.active; ws.title = "Test Cases"
cols = ["ID","Title","Type","Priority","Preconditions","Steps","Expected Result"]
ws.append(cols)
for i, c in enumerate(ws[1], 1):
    c.font = Font(bold=True, color="FFFFFF"); c.fill = PatternFill("solid", fgColor="7C3AED")
for t in cases:
    ws.append([t.get("id"), t.get("title"), t.get("type"), t.get("priority"),
               t.get("preconditions",""), "\n".join(t.get("steps",[])), t.get("expected_result","")])
for col, w in zip("ABCDEFG", [10,34,12,10,30,44,40]):
    ws.column_dimensions[col].width = w
for row in ws.iter_rows(min_row=2):
    for cell in row: cell.alignment = Alignment(wrap_text=True, vertical="top")
wb.save(f"test-plan-{key}.xlsx")

# ---------- PDF ----------
doc = SimpleDocTemplate(f"test-plan-{key}.pdf", pagesize=A4, title=f"Test Plan {key}")
st = getSampleStyleSheet(); flow = []
flow += [Paragraph(f"Test Plan &mdash; {key}", st["Title"]),
         Paragraph(plan.get("title",""), st["Heading2"]),
         Paragraph("<b>Scope:</b> " + plan.get("scope",""), st["Normal"]), Spacer(1,12)]
head = ["ID","Title","Type","Pri","Steps","Expected"]
rows = [head] + [[t.get("id"), Paragraph(t.get("title",""), st["BodyText"]), t.get("type"),
        t.get("priority"), Paragraph("<br/>".join(t.get("steps",[])), st["BodyText"]),
        Paragraph(t.get("expected_result",""), st["BodyText"])] for t in cases]
tbl = Table(rows, colWidths=[40,110,48,32,150,140], repeatRows=1)
tbl.setStyle(TableStyle([
    ("BACKGROUND",(0,0),(-1,0),colors.HexColor("#7C3AED")),
    ("TEXTCOLOR",(0,0),(-1,0),colors.white),
    ("FONTSIZE",(0,0),(-1,-1),8), ("VALIGN",(0,0),(-1,-1),"TOP"),
    ("GRID",(0,0),(-1,-1),0.5,colors.HexColor("#d0d5dd")),
    ("ROWBACKGROUNDS",(0,1),(-1,-1),[colors.white, colors.HexColor("#f6f4fe")])]))
flow.append(tbl)
doc.build(flow)
print(f"wrote test-plan-{key}.pdf and test-plan-{key}.xlsx ({len(cases)} cases)")

8. Use it in GitHub Copilot

With the folder in place and env vars set, just ask in Copilot Chat:

Copilot Chat
create a test plan from QAJB-42

Copilot matches the skill by its description, runs fetch_jira.py QAJB-42, drafts the plan against every acceptance criterion, writes plan.json, runs export.py, and hands you test-plan-QAJB-42.pdf + test-plan-QAJB-42.xlsx. Follow-ups work too: "add security and performance cases", "make it a regression suite", "also do QAJB-43".

The n8n parallel. Your n8n graph had chat trigger → AI Agent (+ Groq model + Jira create-issue tool). This skill is the same shape, portable: the request is the trigger, Copilot's model is the brain, fetch_jira.py + export.py are the tools. n8n is great for always-on automation; a Copilot skill is great for the developer-in-the-loop moment. Build both and pick per job.

Where to go next

Building one skill (the tab on the left) is the pattern. Here is the payoff: a complete, free QA Skill Suite of 36 agent skills covering every phase of the Software Testing Life Cycle, plus two automation framework packs. Drop any folder into ~/.claude/skills/ for Claude Code, or convert it to a .prompt.md for GitHub Copilot.

The whole suite, one download
36 skills - 7 STLC phases + Playwright & Selenium packs - MIT licensed
Download .zip

Or build one live, end to end

Three of these skills have a full build-it-yourself guide: the prompt that generates them, the real scripts, and a working CLI table plus a shareable HTML report. Start here if you want to watch one run before grabbing the whole set. New to the ideas themselves? The two concept explainers cover what a skill even is, and what turns an LLM into an agent.

Test Planning

Test Plan from Jira

Turn one Jira story into a full QA test plan (scope, scenarios, positive / negative / edge cases) and export it to a polished PDF and a filable XLSX.

Test Execution

Flaky Test Detector

Run your Playwright or Selenium suite several times, score every test with a real flakiness formula, and get a CLI table plus an HTML report that tells flaky apart from broken.

Defect Management

Bug Triage Crew

Triage a bug end to end: severity P0-P4 with a justification, root cause traced down the stack, duplicate leads, the tests to prove the fix, and an HTML triage report.

Concepts

Prompt vs Skill vs Agent

When should a prompt graduate into a skill file, and a skill into an agent? One comparison table, the ladder diagram, and the same Jira test-plan job done four ways.

Concepts

LLM vs AI Agent

An LLM is a brain in a jar. Add memory and tools and it becomes an agent. The next-token diagram, the six limitations, the formula, and why MCP matters.

Setup + Build

Install n8n, build the agent

Get n8n running on Windows and Mac (Node or Docker, full commands), then wire a Jira test-plan generator in four nodes: Chat Trigger, Jira, AI Agent, reply.

Setup + Build

Install LangFlow, build the agent

Install LangFlow via pip/uv or Docker, then rebuild the same Jira test-plan generator as five visual components with a paste-ready prompt template.

The suite follows the STLC

The folders are numbered in testing order, so the skills hand off the way real work flows: analyze the ticket, plan, design scenarios, write cases and data, execute (with a framework pack), manage defects, then close out and feed the next cycle.

1 Requirement1 skill 2 Planning1 skill 3 Design2 skills 4 Cases2 skills 5 Execution3 skills 6 Defects3 skills 7 Closure2 skills nextcycle
The full STLC, one skill (or a few) per phase, looping into the next cycle.
Every skill stops at a human-review gate. None of them file a ticket, push code, or sign off on their own. They draft, state assumptions, and hand back to you. No skill ever fabricates a requirement, a repro step, or a result, a missing item is flagged, never invented.

The 14 STLC skills

One or a few focused skills per phase. Each card links the raw SKILL.md you can read or drop straight into your agent.

1

Requirement Analysis

1 skill
P1jira-requirement-analyzer

JIRA Requirement Analyzer

Read a JIRA ticket and judge whether it is actually ready to test.

"analyze this ticket""is this story ready to test"
Download SKILL.md
2

Test Planning

1 skill
P2test-plan-generator

Test Plan Generator

Turn a JIRA ticket into a review-ready test plan.

"write a test plan for JIRA-1234""plan testing for this story"
Download SKILL.md
3

Test Design

2 skills
P3api-test-designer

API Test Designer

Design API-level test coverage from an endpoint or contract.

"design API tests for POST /orders""test this endpoint"
Download SKILL.md
P3test-scenario-designer

Test Scenario Designer

Derive high-level test scenarios from a requirement or acceptance criteria before anyone writes detailed steps.

"what scenarios should we test""design scenarios for this feature"
Download SKILL.md
4

Test Case Development

2 skills
P4test-case-writer

Test Case Writer

Expand approved test scenarios into detailed, executable test cases.

"write test cases for TS-1""detail these scenarios"
Download SKILL.md
P4test-data-generator

Test Data Generator

Produce the data sets a scenario or test case needs to run.

"generate test data""give me boundary values for this field"
Download SKILL.md
5

Test Execution

3 skills
P5automation-script-generator

Automation Script Generator

Turn an approved test case into a runnable automation script skeleton.

"automate TC-5""write a Playwright test for this"
Download SKILL.md
P5regression-suite-selector

Regression Suite Selector

Pick a targeted regression subset for a change instead of running the whole suite.

"what regression should I run for this PR""pick regression tests"
Download SKILL.md
P5test-execution-tracker

Test Execution Tracker

Log and summarize the execution of a test cycle.

"log this run""track execution for the sprint"
Download SKILL.md
6

Defect Management

3 skills
P6bug-reporter

Bug Reporter

Turn a failure into a clean, reproducible bug report.

"file a bug for this""write up this defect"
Download SKILL.md
P6bug-triage-assistant

Bug Triage Assistant

Triage a batch of defects instead of grinding through them one by one.

"triage these bugs""prioritize the defect backlog"
Download SKILL.md
P6rca-analyzer

RCA Analyzer

Run a structured root-cause analysis on a defect.

"do an RCA for this bug""why did this escape"
Download SKILL.md
7

Test Closure

2 skills
P7test-closure-reporter

Test Closure Reporter

Produce the closure report that wraps up a test cycle.

"write the test closure report""summarize the test cycle"
Download SKILL.md
P7test-coverage-analyzer

Test Coverage Analyzer

Find the gaps between what was required and what was actually tested.

"where are our coverage gaps""what isn't tested"
Download SKILL.md

The 22 framework-pack skills

Cross-cutting automation skills for the two stacks most QA teams run. These plug into phase 5 (execution) but are useful any time you are writing or fixing tests.

Playwright PackTypeScript, 11 skills Selenium PackJava + TestNG, 11 skills Phase 5Test Execution CIgreen
The two automation packs plug straight into the execution phase, your stack, your call.
PW

Playwright Pack (TypeScript)

11 skills
PWpw-accessibility-auditor

PW Accessibility Auditor

Integrates automated accessibility checks into Playwright tests using axe-core.

"add a11y checks""run axe on this page"
Download SKILL.md
PWpw-api-tester

PW API Tester

Designs and generates API tests using Playwright's request context.

"write API tests for this endpoint""test the /orders API"
Download SKILL.md
PWpw-ci-configurator

PW CI Configurator

Generates CI configuration (GitHub Actions) for a Playwright suite.

"set up Playwright in CI""add a GitHub Actions workflow"
Download SKILL.md
PWpw-fixture-designer

PW Fixture Designer

Designs custom Playwright test fixtures (auth/session, seeded data, page objects) with correct setup/teardown and scope.

"create an auth fixture""I need a logged-in page fixture"
Download SKILL.md
PWpw-flaky-debugger

PW Flaky Debugger

Diagnoses a flaky Playwright test and proposes web-first fixes.

"this test is flaky""passes locally fails in CI"
Download SKILL.md
PWpw-locator-fixer

PW Locator Fixer

Scans a Playwright spec or Page Object for brittle locators and rewrites them to resilient ones.

"fix these locators""my selectors are flaky"
Download SKILL.md
PWpw-network-mocker

PW Network Mocker

Designs Playwright route interception and mocking.

"mock this API""stub the /orders response"
Download SKILL.md
PWpw-page-object-builder

PW Page Object Builder

Builds a Playwright Page Object Model class from a page or URL.

"make a page object for the login page""build a POM for the dashboard"
Download SKILL.md
PWpw-test-generator

PW Test Generator

Generates a Playwright (TypeScript) test spec from a described user flow or scenario.

"write a Playwright test for login""generate a spec for the checkout flow"
Download SKILL.md
PWpw-trace-analyzer

PW Trace Analyzer

Analyzes a Playwright trace.zip or test failure to pinpoint the root cause.

"read this trace""why did this test fail"
Download SKILL.md
PWpw-visual-regression

PW Visual Regression

Sets up Playwright visual/screenshot regression testing.

"add visual regression""snapshot this component"
Download SKILL.md
SE

Selenium Pack (Java)

11 skills
SEse-cross-browser-runner

Selenium Cross-Browser Runner

Sets up cross-browser Selenium execution across Chrome, Firefox, and Edge via TestNG parameters or a factory, plus a browser matrix.

"run my tests on Chrome and Firefox""add cross-browser support"
Download SKILL.md
SEse-data-driven-designer

Selenium Data-Driven Designer

Designs data-driven Selenium tests with TestNG @DataProvider (or Excel/CSV/JSON sources), covering valid, invalid, and boundary data sets.

"make this test data-driven""add a @DataProvider"
Download SKILL.md
SEse-driver-manager

Selenium Driver Manager

Sets up browser driver management with Selenium Manager (built-in) or WebDriverManager, browser options, and a thread-safe driver factory.

"set up my WebDriver""I keep getting driver version mismatch"
Download SKILL.md
SEse-flaky-debugger

Selenium Flaky Debugger

Diagnoses flaky Selenium tests - StaleElementReferenceException, timing and synchronization races, dynamic/late-rendering elements - and proposes robust fixes.

"my test is flaky""StaleElementReferenceException keeps happening"
Download SKILL.md
SEse-framework-scaffolder

Selenium Framework Scaffolder

Scaffolds a Maven Selenium framework - TestNG suite, base test, Page Object package, config loader, logging, and reporting hooks.

"scaffold a Selenium framework""set up a new Maven Selenium project"
Download SKILL.md
SEse-grid-configurator

Selenium Grid Configurator

Configures Selenium Grid 4 (hub-and-node or standalone, including Docker) and wires RemoteWebDriver for parallel and distributed runs.

"set up Selenium Grid""run my tests on a remote grid"
Download SKILL.md
SEse-locator-strategist

Selenium Locator Strategist

Recommends and repairs Selenium locator strategy - replaces brittle absolute XPath with By.id, By.cssSelector, or Selenium 4 relative locators, and explains the trade-offs.

"this XPath keeps breaking""make this locator more stable"
Download SKILL.md
SEse-page-object-builder

Selenium Page Object Builder

Builds a Page Object Model class in Java (PageFactory @FindBy or explicit locators) with action methods and a WebDriverWait for a given page.

"create a page object for the login page""build a POM class"
Download SKILL.md
SEse-report-integrator

Selenium Report Integrator

Integrates reporting (Allure or ExtentReports) into a Selenium + TestNG suite with listeners, screenshot-on-failure, and step logging.

"add Allure to my tests""set up ExtentReports"
Download SKILL.md
SEse-test-generator

Selenium Test Generator

Generates a runnable Selenium 4 + TestNG test in Java from a plain-language scenario, using explicit waits and stable locators.

"write a Selenium test for login""generate a TestNG test for the checkout flow"
Download SKILL.md
SEse-wait-fixer

Selenium Wait Fixer

Scans Selenium Java code for Thread.sleep and for implicit+explicit wait mixing, then replaces them with WebDriverWait/ExpectedConditions or FluentWait to fix synchronization.

"remove Thread.sleep from my tests""fix the flaky waits"
Download SKILL.md

Install

Grab the zip above (or a single folder), then:

terminal
# one skill
cp -r ./02-test-planning/test-plan-generator ~/.claude/skills/

# a whole phase
cp -r ./05-test-execution/* ~/.claude/skills/

# a framework pack
cp -r ./framework-packs/playwright-pack/* ~/.claude/skills/

Then just ask your agent in plain English, for example "analyze QAJB-42 for testability" or "write a Playwright test for the login flow". The agent matches the skill by its description and follows it.