Автоматизированное тестирование iOS-приложений
Использование Synapse + Computer Control API для автоматизации тестирования iOS-приложений через Simulator.
Автоматизированное тестирование iOS-приложений
Объедините систему памяти Synapse с Computer Control API для создания LLM-управляемых тестов iOS-приложений. LLM запоминает тестовые сценарии, учится на прошлых сбоях и адаптируется к изменениям UI.
Архитектура
┌──────────────┐ commands ┌──────────────┐ screenshots ┌──────────────┐
│ LLM Agent │ ─────────────▶│ Synapse │ ────────────────▶ │ iOS Sim │
│ (Claude) │ │ Computer │ ◀──────────────── │ (via agent) │
└──────────────┘ │ Control │ results └──────────────┘
│ └──────────────┘
│ store/recall
▼
┌──────────────┐
│ Memories │ (test scenarios, past failures, UI patterns)
└──────────────┘Предварительные требования
- Аккаунт Synapse + Mind Key
- MCP-сервер Synapse настроен в Claude Desktop
- iOS Simulator с установленным
screen-remote-agent - Компьютер зарегистрирован в Synapse (см. Computer Control API)
Шаг 1: регистрация компьютера-симулятора
На Mac, где запущен iOS Simulator:
# Get install code from Synapse
curl -X POST https://synapse.schaefer.zone/computers/install-code \
-H "Authorization: Bearer YOUR_MIND_KEY" \
-d '{"computer_name":"ios-sim"}'
# → { "install_code": "ic_..." }
# Run screen-remote-agent on the Mac
# (uses the install code to register)Шаг 2: сохранение тестовых сценариев в памяти
Сохраняйте повторно используемые тестовые сценарии как воспоминания:
import requests
def store_test_scenario(name, steps, app):
requests.post(f"{URL}/memory",
headers={"Authorization": f"Bearer {MIND_KEY}"},
json={
"category": "skill",
"key": f"test_scenario_{name}",
"content": f"App: {app}\nSteps:\n" + "\n".join(steps),
"tags": ["test", "ios", app],
"priority": "high"
})
store_test_scenario("login_flow", [
"Launch app",
"Tap email field",
"Type test@example.com",
"Tap password field",
"Type password123",
"Tap Login button",
"Verify home screen appears"
], "MyApp")Шаг 3: выполнение тестов под управлением LLM
В Claude Desktop (с настроенным Synapse MCP):
Run the login_flow test scenario on the iOS Simulator.
Take a screenshot after each step and verify the expected UI.
If any step fails, store the failure as a memory so we can
avoid it next time.Claude выполнит:
- Вызовет
memory_search, чтобы найти воспоминаниеtest_scenario_login_flow - Вызовет
computer_screenshot, чтобы увидеть текущее состояние - Выполнит каждый шаг через
computer_command_queue(click, type) - Проверит результаты через снимки экрана
- Сохранит сбои как воспоминания категории
mistake
Шаг 4: самовосстанавливающиеся тесты
При сбое теста сохраните сбой и восстановление:
def store_test_failure(scenario, step, error, recovery):
requests.post(f"{URL}/memory",
headers={"Authorization": f"Bearer {MIND_KEY}"},
json={
"category": "mistake",
"key": f"failure_{scenario}_{step}",
"content": f"Scenario: {scenario}\nStep: {step}\nError: {error}\nRecovery: {recovery}",
"tags": ["test", "failure", "ios", scenario],
"priority": "high"
})
# Example
store_test_failure("login_flow", "tap_login",
"Login button not found at expected coordinates",
"Button moved due to new logo. Search by accessibility label instead.")В следующий раз LLM отзовёт сбой и применит восстановление автоматически.
Шаг 5: отслеживание результатов тестов
Отслеживайте запуски тестов как задачи:
def track_test_run(scenario, status, duration):
requests.post(f"{URL}/mind/task",
headers={"Authorization": f"Bearer {MIND_KEY}",
"Content-Type": "application/json"},
json={
"title": f"Test: {scenario}",
"description": f"Status: {status}, Duration: {duration}s",
"priority": "normal"
})Частые команды
| Действие | Команда |
|---|---|
| Запуск Simulator | xcrun simctl launch booted com.example.app |
| Снимок экрана | computer_screenshot (через Synapse MCP) |
| Тап по (x,y) | computer_command_queue {type:"click", payload:{x,y}} |
| Ввод текста | computer_command_queue {type:"type", payload:{text:"..."}} |
| Нажать Home | computer_command_queue {type:"key", payload:{keys:["Cmd","Shift","H"]}} |