23 / 89 · 04 API & Contract Testing with AI · AI-Enhanced Contract Generation and Maintenance← prev⊞ allnext →☰ Read as one page
4.3AI's Role in Contract Maintenance
| Task | Traditional Approach | AI-Augmented Approach |
|---|---|---|
| New consumer feature | Manually write new Pact tests | AI analyzes client code, generates contract |
| Provider schema change | Consumer tests fail in CI | AI detects drift, suggests contract update |
| Contract conflict resolution | Manual negotiation between teams | AI identifies minimal compatible contract |
| Coverage gap detection | Manual audit | AI compares client code paths to Pact interactions |
Detecting Coverage Gaps
AI can compare the consumer's API client code against existing Pact interactions to find missing coverage:
class ContractCoverageAnalyzer:
def __init__(self, llm, client_code: str, pact_file: str):
self.llm = llm
self.client_code = client_code
self.pact = json.load(open(pact_file))
def find_gaps(self) -> list[str]:
"""Find API calls in client code without Pact coverage."""
prompt = f"""
Compare these two artifacts:
1. API CLIENT CODE (all HTTP calls the consumer makes):
{self.client_code}
2. PACT INTERACTIONS (all API calls covered by contracts):
{json.dumps([i['description'] for i in self.pact['interactions']])}
List any API calls in the client code that do NOT have a
corresponding Pact interaction. For each gap, describe:
- The HTTP method and path
- What the client expects in the response
- Why this gap matters (what could break without a contract)
"""
return self.llm.generate(prompt)
Automatic Contract Updates
When the provider's schema changes, AI can suggest the minimal contract update:
class ContractUpdateAdvisor:
def suggest_update(self, old_schema: dict, new_schema: dict, pact: dict) -> str:
"""Suggest contract updates when provider schema changes."""
prompt = f"""
The provider's schema has changed. Analyze the change and determine
if any Pact contracts need updating.
OLD SCHEMA (relevant section):
{json.dumps(old_schema, indent=2)}
NEW SCHEMA (relevant section):
{json.dumps(new_schema, indent=2)}
CURRENT PACT INTERACTIONS:
{json.dumps(pact['interactions'], indent=2)}
For each affected interaction:
1. Describe what changed
2. Whether the change is backward-compatible
3. If not backward-compatible, suggest the minimal contract update
4. Flag if the consumer code likely needs changes too
"""
return self.llm.generate(prompt)