# सेल्फ-हीलिंग टेस्ट पाइपलाइन पारंपरिक टेस्ट सूट UI बदलने पर टूट जाते हैं। सेल्फ-हीलिंग टेस्ट पिछली विफलताओं से सीखने और ढलने के लिए Synapse मेमोरी का उपयोग करते हैं — फ्लेकी टेस्ट और रखरखाव बोझ कम करते हैं। ## अवधारणा ``` ┌─────────┐ fails ┌──────────┐ store ┌──────────┐ │ Test │ ───────▶ │ Synapse │ ───────▶ │ Memories │ │ Run │ │ Memory │ │ (failures)│ └─────────┘ └──────────┘ └──────────┘ ▲ │ │ recall │ │ before next run │ └─────────────────────┘ ``` 1. टेस्ट चलता है 2. यदि विफल हो, तो विफलता स्टोर करें (क्या गलत हुआ, क्यों, कैसे ठीक करें) 3. अगली बार: निष्पादित करने से पहले संबंधित विफलताएँ रिकॉल करें 4. ज्ञात सुधार स्वचालित रूप से लागू करें ## कार्यान्वयन ### चरण 1: टेस्ट रैपर प्रत्येक टेस्ट को मेमोरी रिकॉल/स्टोर के साथ रैप करें: ```python 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: अनुकूलनशील टेस्ट लॉजिक टेस्ट के अंदर, ज्ञात विफलताओं की जाँच करें और सुधार लागू करें: ```python @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: रिकवरी रणनीतियाँ रिकवरी रणनीतियों को मेमोरी के रूप में स्टोर करें: ```python 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 एकीकरण ```yaml # .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: विफलता विश्लेषण डैशबोर्ड ```python # 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") ``` ## सर्वोत्तम अभ्यास > [!TIP] > - **ट्रेसबैक स्टोर करें** — उनमें ठीक वही पंक्ति होती है जो विफल हुई > - **टेस्ट नाम से टैग करें** — तेज़ फ़िल्टरिंग सक्षम बनाता है > - **`mistake` श्रेणी का उपयोग करें** — नियमित मेमोरीज़ से अलग रखता है > - **`high` प्राथमिकता सेट करें** — विफलताएँ कभी न भूलें > - **आवधिक सफ़ाई** — हल किए गए मुद्दों की मेमोरीज़ हटाएँ > - **संवेदनशील डेटा स्टोर न करें** — क्रेडेंशियल, PII ## स्टोर करने के लिए सामान्य विफलता पैटर्न | विफलता प्रकार | क्या स्टोर करें | |--------------|---------------| | Element not found | चयनकर्ता प्रयास किया गया, पृष्ठ स्थिति, स्क्रीनशॉट | | Timeout | प्रतीक्षा समय, किसकी प्रतीक्षा की जा रही थी | | Assertion failed | अपेक्षित बनाम वास्तविक मान | | Network error | URL, स्टेटस कोड, रिस्पॉन्स बॉडी | | Permission denied | आवश्यक अनुमति, वर्तमान उपयोगकर्ता भूमिका | ## अगले कदम - [Automated iOS Testing](/docs/guides/automated-testing-ios) - [Memory Best Practices](/docs/guides/memory-best-practices) - [Error Recovery Cookbook](/docs/llm-cookbook/error-recovery)