Kendinden İyileşen Test İş Hatları
Synapse belleği kullanarak başarısızlıklardan öğrenen ve otomatik uyum sağlayan test iş hatları oluşturun.
Kendinden İyileşen Test İş Hatları
Geleneksel test suiteleri UI değiştiğinde kırılır. Kendinden iyileşen testler, geçmiş başarısızlıklardan öğrenmek ve uyum sağlamak için Synapse belleğini kullanır — titrek testleri ve bakım yükünü azaltır.
Kavram
┌─────────┐ fails ┌──────────┐ store ┌──────────┐
│ Test │ ───────▶ │ Synapse │ ───────▶ │ Memories │
│ Run │ │ Memory │ │ (failures)│
└─────────┘ └──────────┘ └──────────┘
▲ │
│ recall │
│ before next run │
└─────────────────────┘- Test çalışır
- Başarısız olursa, başarısızlığı sakla (neyin yanlış gittiği, neden, nasıl düzeltileceği)
- Sonraki çalıştırma: yürütmeden önce ilgili başarısızlıkları geri çağır
- Bilinen düzeltmeleri otomatik olarak uygula
Uygulama
Adım 1: Test Sarmalayıcı
Her testi bellek geri çağırma/saklama ile sarın:
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"
})Adım 2: Uyarlamalı Test Mantığı
Testin içinde, bilinen başarısızlıkları kontrol edin ve düzeltmeleri uygulayın:
@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)Adım 3: Kurtarma Stratejileri
Kurtarma stratejilerini bellek olarak saklayın:
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.")Adım 4: CI Entegrasyonu
# .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.pyAdım 5: Başarısızlık Analiz Panosu
# 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")En İyi Uygulamalar
Saklanacak Yaygın Başarısızlık Desenleri
| Başarısızlık Tipi | Saklanacak |
|---|---|
| Öğe bulunamadı | Denenen seçici, sayfa durumu, ekran görüntüsü |
| Zaman aşımı | Bekleme süresi, ne bekleniyordu |
| Onaylama başarısız | Beklenen ve gerçek değer |
| Ağ hatası | URL, durum kodu, yanıt gövdesi |
| İzin reddedildi | Gerekli izin, mevcut kullanıcı rolü |