28 / 108 · 03 Agentic Testing Architectures · The Orchestrator Pattern← prev⊞ allnext →☰ Read as one page
4.4Specialist Agent Design
Each specialist agent is optimized for its domain:
UI Test Specialist
class UITestSpecialist(Agent):
def __init__(self, browser, llm):
self.browser = browser
self.llm = llm
def execute_scenarios(self, scenarios: list[str]) -> AgentResults:
results = []
for scenario in scenarios:
# Each scenario is a natural language description
# e.g., "Verify the checkout button is disabled when cart is empty"
result = self.react_loop(
objective=scenario,
tools=["navigate", "click", "type", "text", "screenshot"],
max_steps=20
)
results.append(result)
return AgentResults(tests=results, failures=[r for r in results if r.failed])
API Test Specialist
class APITestSpecialist(Agent):
def __init__(self, base_url: str, llm):
self.base_url = base_url
self.llm = llm
def execute_scenarios(self, scenarios: list[str]) -> AgentResults:
results = []
for scenario in scenarios:
# e.g., "Verify POST /orders returns 400 when quantity is 0"
result = self.execute_api_test(scenario)
results.append(result)
return AgentResults(tests=results, failures=[r for r in results if r.failed])
def execute_api_test(self, scenario: str) -> TestResult:
# Use LLM to determine the HTTP request
request_spec = self.llm.generate(f"""
Scenario: {scenario}
Base URL: {self.base_url}
Generate the HTTP request as JSON:
{{"method": "...", "path": "...", "headers": {{...}}, "body": {{...}}}}
And the expected response:
{{"status": ..., "body_contains": [...], "body_not_contains": [...]}}
""")
# Execute and evaluate
response = httpx.request(
method=request_spec["method"],
url=f"{self.base_url}{request_spec['path']}",
headers=request_spec.get("headers", {}),
json=request_spec.get("body")
)
return self.evaluate_response(response, request_spec["expected"])