सेल्फ-हीलिंग टेस्ट पाइपलाइन
Synapse मेमोरी का उपयोग करके विफलताओं से सीखने और अपने आप ढलने वाले टेस्ट पाइपलाइन बनाएँ।
सेल्फ-हीलिंग टेस्ट पाइपलाइन
पारंपरिक टेस्ट सूट UI बदलने पर टूट जाते हैं। सेल्फ-हीलिंग टेस्ट पिछली विफलताओं से सीखने और ढलने के लिए Synapse मेमोरी का उपयोग करते हैं — फ्लेकी टेस्ट और रखरखाव बोझ कम करते हैं।
अवधारणा
┌─────────┐ fails ┌──────────┐ store ┌──────────┐
│ Test │ ───────▶ │ Synapse │ ───────▶ │ Memories │
│ Run │ │ Memory │ │ (failures)│
└─────────┘ └──────────┘ └──────────┘
▲ │
│ recall │
│ before next run │
└─────────────────────┘- टेस्ट चलता है
- यदि विफल हो, तो विफलता स्टोर करें (क्या गलत हुआ, क्यों, कैसे ठीक करें)
- अगली बार: निष्पादित करने से पहले संबंधित विफलताएँ रिकॉल करें
- ज्ञात सुधार स्वचालित रूप से लागू करें
कार्यान्वयन
चरण 1: टेस्ट रैपर
प्रत्येक टेस्ट को मेमोरी रिकॉल/स्टोर के साथ रैप करें:
import requests
from datetime import datetime
URL = "https://synapse.schaefer.zone"
MIND_KEY = "mk_..."
def self_healing_test(test_name, test_fn):
"""Decorator: wrap a test with self-healing memory."""
def wrapper():
# 1. Recall past failures for this test
past_failures = requests.get(
f"{URL}/memory/search?q={test_name}+failure",
headers={"Authorization": f"Bearer {MIND_KEY}"}
).json()
# 2. Run test with failure context
try:
test_fn(known_failures=past_failures)
except Exception as e:
# 3. Store the failure
store_failure(test_name, e, traceback.format_exc())
raise
return wrapper
def store_failure(test_name, error, traceback_str):
requests.post(f"{URL}/memory",
headers={"Authorization": f"Bearer {MIND_KEY}",
"Content-Type": "application/json"},
json={
"category": "mistake",
"key": f"test_failure_{test_name}_{datetime.now().isoformat()}",
"content": f"Test: {test_name}\nError: {error}\nTrace:\n{traceback_str}",
"tags": ["test", "failure", test_name],
"priority": "high"
})चरण 2: अनुकूलनशील टेस्ट लॉजिक
टेस्ट के अंदर, ज्ञात विफलताओं की जाँच करें और सुधार लागू करें:
@self_healing_test
def test_login_page(browser, known_failures=None):
browser.goto("https://app.com/login")
# Check if we've seen this page change before
if known_failures and known_failures.get("results"):
for failure in known_failures["results"]:
if "button moved" in failure["content"].lower():
# Use accessibility label instead of coordinates
browser.click(by_label="Login button")
return
# Default: use coordinates
browser.click(x=150, y=400)चरण 3: रिकवरी रणनीतियाँ
रिकवरी रणनीतियों को मेमोरी के रूप में स्टोर करें:
def store_recovery(failure_type, strategy):
requests.post(f"{URL}/memory",
headers={"Authorization": f"Bearer {MIND_KEY}",
"Content-Type": "application/json"},
json={
"category": "skill",
"key": f"recovery_{failure_type}",
"content": strategy,
"tags": ["test", "recovery", failure_type],
"priority": "high"
})
# Store recoveries for common failures
store_recovery("element_not_found",
"When element not found by ID, try by CSS class, then by XPath, "
"then by accessibility label. Take screenshot for debugging.")
store_recovery("timeout",
"Increase timeout to 30s. If still fails, check if page is loading "
"dynamically — wait for specific element instead of fixed time.")
store_recovery("stale_element",
"Re-find element before each interaction. Don't cache element references "
"across page transitions.")चरण 4: CI एकीकरण
# .gitlab-ci.yml
test:self-healing:
script:
- export SYNAPSE_MIND_KEY=$SYNAPSE_TEST_MIND_KEY
- pytest tests/ --self-healing
after_script:
# Summarize new failures
- python scripts/synapse_failure_summary.pyचरण 5: विफलता विश्लेषण डैशबोर्ड
# Get all test failures from the last week
r = requests.get(
f"{URL}/memory/search?q=test+failure",
headers={"Authorization": f"Bearer {MIND_KEY}"}
)
# Group by test name
failures = {}
for mem in r.json().get("results", []):
test_name = extract_test_name(mem["content"])
failures.setdefault(test_name, []).append(mem)
# Report
for test, fails in sorted(failures.items(), key=lambda x: -len(x[1])):
print(f"{test}: {len(fails)} failures")सर्वोत्तम अभ्यास
स्टोर करने के लिए सामान्य विफलता पैटर्न
| विफलता प्रकार | क्या स्टोर करें |
|---|---|
| Element not found | चयनकर्ता प्रयास किया गया, पृष्ठ स्थिति, स्क्रीनशॉट |
| Timeout | प्रतीक्षा समय, किसकी प्रतीक्षा की जा रही थी |
| Assertion failed | अपेक्षित बनाम वास्तविक मान |
| Network error | URL, स्टेटस कोड, रिस्पॉन्स बॉडी |
| Permission denied | आवश्यक अनुमति, वर्तमान उपयोगकर्ता भूमिका |