27 / 108 · 03 Agentic Testing Architectures · The Orchestrator Pattern← prev⊞ allnext →☰ Read as one page
4.3Implementation
class OrchestratorAgent:
def __init__(self, specialists: dict[str, Agent]):
self.specialists = specialists # {"ui": UIAgent, "api": APIAgent, ...}
self.llm = get_llm()
def plan_and_execute(self, feature_spec: str) -> TestReport:
# Step 1: Analyze the spec and create a test plan
plan = self.llm.generate(f"""
Given this feature specification:
{feature_spec}
Determine which test types are needed:
- UI tests (if there are user-facing changes)
- API tests (if there are endpoint changes)
- Performance tests (if there are SLA requirements)
- Security tests (if there are auth/data changes)
Output a JSON plan: {{"ui": [...scenarios], "api": [...scenarios], ...}}
""")
# Step 2: Delegate to specialists
results = {}
for agent_type, scenarios in plan.items():
if agent_type not in self.specialists:
results[agent_type] = {"skipped": f"No specialist for {agent_type}"}
continue
specialist = self.specialists[agent_type]
results[agent_type] = specialist.execute_scenarios(scenarios)
# Step 3: Merge and resolve conflicts
return self.merge_results(results)
def merge_results(self, results: dict) -> TestReport:
"""Merge results from multiple specialists into a unified report."""
all_tests = []
all_failures = []
all_coverage = {}
for agent_type, agent_results in results.items():
if isinstance(agent_results, dict) and "skipped" in agent_results:
continue
all_tests.extend(agent_results.tests)
all_failures.extend(agent_results.failures)
all_coverage[agent_type] = agent_results.coverage
return TestReport(
total_tests=len(all_tests),
total_failures=len(all_failures),
results_by_type=results,
coverage=all_coverage,
overall_status="FAIL" if all_failures else "PASS"
)