
Testing Dags
- 953 installs
- 412 repo stars
- Updated July 27, 2026
- astronomer/agents
testing-dags is a Claude Code skill that iteratively tests, debugs, and fixes Apache Airflow DAGs using the af CLI for developers facing multi-step pipeline validation failures.
About
testing-dags is an Astronomer agents skill for complex Apache Airflow DAG testing that goes beyond a single run command. It handles iterative test-debug-fix cycles when requests include testing a DAG and repairing failures, troubleshooting pipeline issues, or validating multi-step workflows. Simple one-shot test or run requests are delegated to the airflow entrypoint skill, while testing-dags owns repeated validation loops. Commands assume the af CLI on PATH, obtainable via astro otto or uv tool install astro-airflow-mcp. Developers reach for testing-dags when an Airflow DAG fails validation and needs structured debugging with Astro CLI quick checks.
- Handles multi-step test-debug-fix cycles for DAGs
- First action is always af runs trigger-wait <dag_id>
- Uses Astro CLI for quick parse and pytest validation without a live instance
- Distinguishes complex iterative requests from simple test commands
- Prevents unnecessary pre-flight commands like dags list or errors
Testing Dags by the numbers
- 953 all-time installs (skills.sh)
- +21 installs in the week ending Jul 28, 2026 (Skillselion tracking)
- Ranked #536 of 2,184 Testing & QA skills by installs in the Skillselion catalog
- Security screen: MEDIUM risk (skills.sh audit)
- Data as of Jul 28, 2026 (Skillselion catalog sync)
npx skills add https://github.com/astronomer/agents --skill testing-dagsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 953 |
|---|---|
| repo stars | ★ 412 |
| Security audit | 2 / 3 scanners passed |
| Last updated | July 27, 2026 |
| Repository | astronomer/agents ↗ |
How do you test and debug a failing Airflow DAG?
Handle complex Airflow DAG testing that requires iterative debug and fix cycles.
Who is it for?
Data engineers maintaining Airflow DAGs who need automated iterative test-and-fix loops instead of a single run command.
Skip if: Developers who only need a one-shot dag test or run without debugging, which the airflow entrypoint skill handles directly.
When should I use this skill?
The user asks to test a DAG and fix failures, debug pipeline issues, troubleshoot Airflow tasks, or run iterative validation with af commands.
What you get
Validated Airflow DAGs, resolved task failures, and passing Astro CLI validation after iterative debug cycles.
- passing DAG validation
- debugged task configurations
- fixed pipeline definitions
Files
DAG Testing Skill
Use af commands to test, debug, and fix DAGs in iterative cycles.
Running the CLI
These commands assume af is on PATH. Run via astro otto to get it automatically, or install standalone with uv tool install astro-airflow-mcp.
---
Quick Validation with Astro CLI
If the user has the Astro CLI available, these commands provide fast feedback without needing a running Airflow instance:
# Parse DAGs to catch import errors, syntax issues, and DAG-level problems
astro dev parse
# Run pytest against DAGs (runs tests in tests/ directory)
astro dev pytestUse these for quick validation during development. For full end-to-end testing against a live Airflow instance, continue to the trigger-and-wait workflow below.
---
FIRST ACTION: Just Trigger the DAG
When the user asks to test a DAG, your FIRST AND ONLY action should be:
af runs trigger-wait <dag_id>DO NOT:
- Call
af dags listfirst - Call
af dags getfirst - Call
af dags errorsfirst - Use
greporlsor any other bash command - Do any "pre-flight checks"
Just trigger the DAG. If it fails, THEN debug.
---
Testing Workflow Overview
┌─────────────────────────────────────┐
│ 1. TRIGGER AND WAIT │
│ Run DAG, wait for completion │
└─────────────────────────────────────┘
↓
┌───────┴───────┐
↓ ↓
┌─────────┐ ┌──────────┐
│ SUCCESS │ │ FAILED │
│ Done! │ │ Debug... │
└─────────┘ └──────────┘
↓
┌─────────────────────────────────────┐
│ 2. DEBUG (only if failed) │
│ Get logs, identify root cause │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 3. FIX AND RETEST │
│ Apply fix, restart from step 1 │
└─────────────────────────────────────┘Philosophy: Try first, debug on failure. Don't waste time on pre-flight checks — just run the DAG and diagnose if something goes wrong.
---
Phase 1: Trigger and Wait
Use af runs trigger-wait to test the DAG:
Primary Method: Trigger and Wait
af runs trigger-wait <dag_id> --timeout 300Example:
af runs trigger-wait my_dag --timeout 300Why this is the preferred method:
- Single command handles trigger + monitoring
- Returns immediately when DAG completes (success or failure)
- Includes failed task details if run fails
- No manual polling required
Response Interpretation
Success:
{
"dag_run": {
"dag_id": "my_dag",
"dag_run_id": "manual__2025-01-14T...",
"state": "success",
"start_date": "...",
"end_date": "..."
},
"timed_out": false,
"elapsed_seconds": 45.2
}Failure:
{
"dag_run": {
"state": "failed"
},
"timed_out": false,
"elapsed_seconds": 30.1,
"failed_tasks": [
{
"task_id": "extract_data",
"state": "failed",
"try_number": 2
}
]
}Timeout:
{
"dag_id": "my_dag",
"dag_run_id": "manual__...",
"state": "running",
"timed_out": true,
"elapsed_seconds": 300.0,
"message": "Timed out after 300 seconds. DAG run is still running."
}Alternative: Trigger and Monitor Separately
Use this only when you need more control:
# Step 1: Trigger
af runs trigger my_dag
# Returns: {"dag_run_id": "manual__...", "state": "queued"}
# Step 2: Check status
af runs get my_dag manual__2025-01-14T...
# Returns current state---
Handling Results
If Success
The DAG ran successfully. Summarize for the user:
- Total elapsed time
- Number of tasks completed
- Any notable outputs (if visible in logs)
You're done!
If Timed Out
The DAG is still running. Options: 1. Check current status: af runs get <dag_id> <dag_run_id> 2. Ask user if they want to continue waiting 3. Increase timeout and try again
If Failed
Move to Phase 2 (Debug) to identify the root cause.
---
Phase 2: Debug Failures (Only If Needed)
When a DAG run fails, use these commands to diagnose:
Get Comprehensive Diagnosis
af runs diagnose <dag_id> <dag_run_id>Returns in one call:
- Run metadata (state, timing)
- All task instances with states
- Summary of failed tasks
- State counts (success, failed, skipped, etc.)
Get Task Logs
af tasks logs <dag_id> <dag_run_id> <task_id>Example:
af tasks logs my_dag manual__2025-01-14T... extract_dataFor specific retry attempt:
af tasks logs my_dag manual__2025-01-14T... extract_data --try 2Look for:
- Exception messages and stack traces
- Connection errors (database, API, S3)
- Permission errors
- Timeout errors
- Missing dependencies
Check Upstream Tasks
If a task shows upstream_failed, the root cause is in an upstream task. Use af runs diagnose to find which task actually failed.
Check Import Errors (If DAG Didn't Run)
If the trigger failed because the DAG doesn't exist:
af dags errorsThis reveals syntax errors or missing dependencies that prevented the DAG from loading.
---
Phase 3: Fix and Retest
Once you identify the issue:
Common Fixes
| Issue | Fix |
|---|---|
| Missing import | Add to DAG file |
| Missing package | Add to requirements.txt |
| Connection error | Check af config connections, verify credentials |
| Variable missing | Check af config variables, create if needed |
| Timeout | Increase task timeout or optimize query |
| Permission error | Check credentials in connection |
After Fixing
1. Save the file 2. Retest: af runs trigger-wait <dag_id>
Repeat the test → debug → fix loop until the DAG succeeds.
---
CLI Quick Reference
| Phase | Command | Purpose |
|---|---|---|
| Test | af runs trigger-wait <dag_id> | Primary test method — start here |
| Test | af runs trigger <dag_id> | Start run (alternative) |
| Test | af runs get <dag_id> <run_id> | Check run status |
| Debug | af runs diagnose <dag_id> <run_id> | Comprehensive failure diagnosis |
| Debug | af tasks logs <dag_id> <run_id> <task_id> | Get task output/errors |
| Debug | af dags errors | Check for parse errors (if DAG won't load) |
| Debug | af dags get <dag_id> | Verify DAG config |
| Debug | af dags explore <dag_id> | Full DAG inspection |
| Config | af config connections | List connections |
| Config | af config variables | List variables |
---
Testing Scenarios
Scenario 1: Test a DAG (Happy Path)
af runs trigger-wait my_dag
# Success! Done.Scenario 2: Test a DAG (With Failure)
# 1. Run and wait
af runs trigger-wait my_dag
# Failed...
# 2. Find failed tasks
af runs diagnose my_dag manual__2025-01-14T...
# 3. Get error details
af tasks logs my_dag manual__2025-01-14T... extract_data
# 4. [Fix the issue in DAG code]
# 5. Retest
af runs trigger-wait my_dagScenario 3: DAG Doesn't Exist / Won't Load
# 1. Trigger fails - DAG not found
af runs trigger-wait my_dag
# Error: DAG not found
# 2. Find parse error
af dags errors
# 3. [Fix the issue in DAG code]
# 4. Retest
af runs trigger-wait my_dagScenario 4: Debug a Failed Scheduled Run
# 1. Get failure summary
af runs diagnose my_dag scheduled__2025-01-14T...
# 2. Get error from failed task
af tasks logs my_dag scheduled__2025-01-14T... failed_task_id
# 3. [Fix the issue]
# 4. Retest
af runs trigger-wait my_dagScenario 5: Test with Custom Configuration
af runs trigger-wait my_dag --conf '{"env": "staging", "batch_size": 100}' --timeout 600Scenario 6: Long-Running DAG
# Wait up to 1 hour
af runs trigger-wait my_dag --timeout 3600
# If timed out, check current state
af runs get my_dag manual__2025-01-14T...---
Debugging Tips
Common Error Patterns
Connection Refused / Timeout:
- Check
af config connectionsfor correct host/port - Verify network connectivity to external system
- Check if connection credentials are correct
ModuleNotFoundError:
- Package missing from
requirements.txt - After adding, may need environment restart
PermissionError:
- Check IAM roles, database grants, API keys
- Verify connection has correct credentials
Task Timeout:
- Query or operation taking too long
- Consider adding timeout parameter to task
- Optimize underlying query/operation
Reading Task Logs
Task logs typically show: 1. Task start timestamp 2. Any print/log statements from task code 3. Return value (for @task decorated functions) 4. Exception + full stack trace (if failed) 5. Task end timestamp and duration
Focus on the exception at the bottom of failed task logs.
On Astro
Astro deployments support environment promotion, which helps structure your testing workflow:
- Dev deployment: Test DAGs freely with
astro deploy --dagsfor fast iteration - Staging deployment: Run integration tests against production-like data
- Production deployment: Deploy only after validation in lower environments
- Use separate Astro deployments for each environment and promote code through them
---
Related Skills
- authoring-dags: For creating new DAGs (includes validation before testing)
- debugging-dags: For general Airflow troubleshooting
- deploying-airflow: For deploying DAGs to production after testing
Related skills
How it compares
Choose testing-dags for failing DAG debug loops; use the airflow entrypoint skill for straightforward single-run DAG tests.
FAQ
When should developers use testing-dags versus the airflow entrypoint skill?
testing-dags handles iterative test-debug-fix cycles on failing DAGs, while the airflow entrypoint skill covers simple one-shot requests like test dag or run dag without troubleshooting loops.
How do you run af commands for testing-dags?
testing-dags assumes the af CLI is on PATH, available through astro otto or by installing astro-airflow-mcp with uv tool install astro-airflow-mcp for DAG validation and debugging.
What Airflow problems does testing-dags solve?
testing-dags solves multi-step Airflow DAG failures by combining Astro CLI quick validation, af command execution, and repeated fix cycles until pipeline tests pass.
Is Testing Dags safe to install?
skills.sh reports 2 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.