테스트
OpenClaw 에는 세 가지 Vitest 스위트(unit/integration, e2e, live)와 소규모 Docker 러너 세트가 있습니다. 이 문서는 “어떻게 테스트하는가”에 대한 가이드입니다:- What each suite covers (and what it deliberately does not cover)
- 일반적인 워크플로(로컬, 푸시 전, 디버깅)에 실행할 명령
- live 테스트가 자격 증명을 발견하고 모델/프로바이더를 선택하는 방식
- 실제 모델/프로바이더 이슈에 대한 회귀 테스트를 추가하는 방법
빠른 시작
대부분의 경우:- 전체 게이트(푸시 전 기대됨):
pnpm build && pnpm check && pnpm test
- 커버리지 게이트:
pnpm test:coverage - E2E 스위트:
pnpm test:e2e
- Live 스위트(모델 + Gateway(게이트웨이) 도구/이미지 프로브):
pnpm test:live
테스트 스위트(어디서 무엇이 실행되는가)
스위트는 “현실성 증가”(그리고 불안정성/비용 증가)로 생각하십시오:Unit / integration (기본값)
- 명령:
pnpm test - 설정:
scripts/test-parallel.mjs(vitest.unit.config.ts,vitest.extensions.config.ts,vitest.gateway.config.ts실행) - 파일:
src/**/*.test.ts - 범위:
- 순수 유닛 테스트
- 프로세스 내 통합 테스트(Gateway(게이트웨이) 인증, 라우팅, 도구, 파싱, 구성)
- 알려진 버그에 대한 결정적 회귀 테스트
- 기대 사항:
- CI 에서 실행됨
- 실제 키 불필요
- 빠르고 안정적이어야 함
- 풀 참고:
- OpenClaw는 더 빠른 유닛 샤드를 위해 Node 22/23에서 Vitest
vmForks를 사용합니다. - Node 24 이상에서는 Node VM 링크 오류(
ERR_VM_MODULE_LINK_FAILURE/module is already linked)를 방지하기 위해 OpenClaw가 자동으로 일반forks로 대체합니다. OPENCLAW_TEST_VM_FORKS=0(forks강제) 또는OPENCLAW_TEST_VM_FORKS=1(vmForks강제)로 수동 설정할 수 있습니다.
- OpenClaw는 더 빠른 유닛 샤드를 위해 Node 22/23에서 Vitest
E2E (Gateway(게이트웨이) 스모크)
- 명령:
pnpm test:e2e - 구성:
vitest.e2e.config.ts - 파일:
src/**/*.e2e.test.ts - 런타임 기본값:
- 더 빠른 파일 시작을 위해 Vitest
vmForks를 사용합니다. - 적응형 워커를 사용합니다(CI: 2-4, 로컬: 4-8).
- 콘솔 I/O 오버헤드를 줄이기 위해 기본적으로 무음 모드로 실행됩니다.
- 더 빠른 파일 시작을 위해 Vitest
- 유용한 재정의 옵션:
- 워커 수를 강제하려면
OPENCLAW_E2E_WORKERS=<n>을 사용하세요(최대 16). - 자세한 콘솔 출력을 다시 활성화하려면
OPENCLAW_E2E_VERBOSE=1을 사용하세요.
- 워커 수를 강제하려면
- 범위:
- 다중 인스턴스 Gateway(게이트웨이) 엔드투엔드 동작
- WebSocket/HTTP 표면, 노드 페어링, 더 무거운 네트워킹
- 기대 사항:
- 파이프라인에서 활성화된 경우 CI 에서 실행
- 실제 키 불필요
- 유닛 테스트보다 구성 요소가 많음(느릴 수 있음)
Live (실제 프로바이더 + 실제 모델)
- 명령:
pnpm test:live - 구성:
vitest.live.config.ts - 파일:
src/**/*.live.test.ts - 기본값:
pnpm test:live에 의해 활성화(OPENCLAW_LIVE_TEST=1설정) - 범위:
- “이 프로바이더/모델이 오늘 실제 자격 증명으로 실제로 동작하는가?”
- 프로바이더 포맷 변경, 도구 호출 특이점, 인증 이슈, 레이트 리밋 동작 포착
- 기대 사항:
- 설계상 CI 에 안정적이지 않음(실제 네트워크, 실제 프로바이더 정책, 할당량, 장애)
- 비용 발생 / 레이트 리밋 사용
- “전체” 대신 좁힌 부분 집합 실행 권장
- Live 실행은 누락된 API 키를 수집하기 위해
~/.profile를 소스함 - Anthropic 키 로테이션:
OPENCLAW_LIVE_ANTHROPIC_KEYS="sk-...,sk-..."(또는OPENCLAW_LIVE_ANTHROPIC_KEY=sk-...) 또는 여러ANTHROPIC_API_KEY*변수를 설정; 테스트는 레이트 리밋 시 재시도함
Which suite should I run?
다음 결정 표를 사용하십시오:- 로직/테스트 편집:
pnpm test실행(많이 변경했다면pnpm test:coverage도) - Gateway(게이트웨이) 네트워킹 / WS 프로토콜 / 페어링 수정:
pnpm test:e2e추가 - “봇이 다운됨” 디버깅 / 프로바이더별 실패 / 도구 호출: 좁힌
pnpm test:live실행
Live: 모델 스모크(프로파일 키)
Live 테스트는 실패를 분리하기 위해 두 계층으로 나뉩니다:- “직접 모델”은 주어진 키로 프로바이더/모델이 응답 가능한지 확인합니다.
- “Gateway(게이트웨이) 스모크”는 해당 모델에 대해 전체 Gateway(게이트웨이)+에이전트 파이프라인이 동작하는지 확인합니다(세션, 히스토리, 도구, 샌드박스 정책 등).
레이어 1: 직접 모델 완료(Gateway(게이트웨이) 없음)
- 테스트:
src/agents/models.profiles.live.test.ts - 목표:
- 발견된 모델 열거
- 보유한 자격 증명에 맞는 모델을 선택하기 위해
getApiKeyForModel사용 - 모델당 작은 완료 실행(필요 시 타겟 회귀)
- 활성화 방법:
pnpm test:live(또는 Vitest 를 직접 호출하는 경우OPENCLAW_LIVE_TEST=1)
- 실제로 이 스위트를 실행하려면
OPENCLAW_LIVE_MODELS=modern(또는 최신 별칭인all)을 설정; 그렇지 않으면pnpm test:live를 Gateway(게이트웨이) 스모크에 집중시키기 위해 건너뜁니다 - 모델 선택 방법:
- 최신 allowlist 실행:
OPENCLAW_LIVE_MODELS=modern(Opus/Sonnet/Haiku 4.5, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.1, Grok 4) OPENCLAW_LIVE_MODELS=all는 최신 allowlist 의 별칭- 또는
OPENCLAW_LIVE_MODELS="openai/gpt-5.2,anthropic/claude-opus-4-6,..."(쉼표 allowlist)
- 최신 allowlist 실행:
- 프로바이더 선택 방법:
OPENCLAW_LIVE_PROVIDERS="google,google-antigravity,google-gemini-cli"(쉼표 allowlist)
- 키 출처:
- 기본값: 프로파일 스토어 및 환경 변수 폴백
- 프로파일 스토어만 강제하려면
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1설정
- 존재 이유:
- “프로바이더 API 가 깨짐 / 키가 유효하지 않음”과 “Gateway(게이트웨이) 에이전트 파이프라인이 깨짐”을 분리
- 작고 고립된 회귀 포함(예: OpenAI Responses/Codex Responses 추론 재생 + 도구 호출 플로)
레이어 2: Gateway(게이트웨이) + 개발 에이전트 스모크(“@openclaw” 실제 동작)
- 테스트:
src/gateway/gateway-models.profiles.live.test.ts - 목표:
- 프로세스 내 Gateway(게이트웨이) 기동
agent:dev:*세션 생성/패치(실행별 모델 오버라이드)- 키가 있는 모델을 순회하며 다음을 검증:
- “의미 있는” 응답(도구 없음)
- 실제 도구 호출이 동작함(읽기 프로브)
- 선택적 추가 도구 프로브(exec+read 프로브)
- OpenAI 회귀 경로(도구 호출만 → 후속)가 계속 동작
- 프로브 상세(실패를 빠르게 설명하기 위함):
read프로브: 테스트가 워크스페이스에 nonce 파일을 쓰고 에이전트에게 이를read하여 nonce 를 되돌려 달라고 요청exec+read프로브: 테스트가 에이전트에게 nonce 를 임시 파일에exec-쓰기 하도록 요청한 뒤 이를read하여 반환- 이미지 프로브: 생성된 PNG(cat + 무작위 코드)를 첨부하고 모델이
cat <CODE>를 반환할 것을 기대 - 구현 참고:
src/gateway/gateway-models.profiles.live.test.ts및src/gateway/live-image-probe.ts
- 활성화 방법:
pnpm test:live(또는 Vitest 를 직접 호출하는 경우OPENCLAW_LIVE_TEST=1)
- 모델 선택 방법:
- 기본값: 최신 allowlist(Opus/Sonnet/Haiku 4.5, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.1, Grok 4)
OPENCLAW_LIVE_GATEWAY_MODELS=all는 최신 allowlist 의 별칭- 또는
OPENCLAW_LIVE_GATEWAY_MODELS="provider/model"(또는 쉼표 목록)으로 좁힘
- 프로바이더 선택 방법(“OpenRouter 전부” 방지):
OPENCLAW_LIVE_GATEWAY_PROVIDERS="google,google-antigravity,google-gemini-cli,openai,anthropic,zai,minimax"(쉼표 allowlist)
- 도구 + 이미지 프로브는 이 live 테스트에서 항상 활성화됨:
read프로브 +exec+read프로브(도구 스트레스)- 모델이 이미지 입력 지원을 광고하면 이미지 프로브 실행
- 플로(상위 수준):
- 테스트가 “CAT” + 무작위 코드가 있는 작은 PNG 생성(
src/gateway/live-image-probe.ts) - 이를
agentattachments: [{ mimeType: "image/png", content: "<base64>" }]로 전송 - Gateway(게이트웨이)가 첨부 파일을
images[](src/gateway/server-methods/agent.ts+src/gateway/chat-attachments.ts)으로 파싱 - 내장 에이전트가 멀티모달 사용자 메시지를 모델로 전달
- 단언: 응답에
cat+ 코드가 포함됨(OCR 허용 오차: 경미한 오류 허용)
- 테스트가 “CAT” + 무작위 코드가 있는 작은 PNG 생성(
provider/model id)를 보려면 다음을 실행하십시오:
Live: Anthropic setup-token 스모크
- 테스트:
src/agents/anthropic.setup-token.live.test.ts - 목표: Claude Code CLI setup-token(또는 붙여넣은 setup-token 프로파일)이 Anthropic 프롬프트를 완료할 수 있는지 검증
- 활성화:
pnpm test:live(또는 Vitest 를 직접 호출하는 경우OPENCLAW_LIVE_TEST=1)OPENCLAW_LIVE_SETUP_TOKEN=1
- 토큰 출처(하나 선택):
- 프로파일:
OPENCLAW_LIVE_SETUP_TOKEN_PROFILE=anthropic:setup-token-test - 원시 토큰:
OPENCLAW_LIVE_SETUP_TOKEN_VALUE=sk-ant-oat01-...
- 프로파일:
- 모델 오버라이드(선택):
OPENCLAW_LIVE_SETUP_TOKEN_MODEL=anthropic/claude-opus-4-6
Live: CLI 백엔드 스모크(Claude Code CLI 또는 기타 로컬 CLI)
- 테스트:
src/gateway/gateway-cli-backend.live.test.ts - 목표: 기본 구성에 손대지 않고 로컬 CLI 백엔드를 사용해 Gateway(게이트웨이) + 에이전트 파이프라인을 검증
- 활성화:
pnpm test:live(또는 Vitest 를 직접 호출하는 경우OPENCLAW_LIVE_TEST=1)OPENCLAW_LIVE_CLI_BACKEND=1
- 기본값:
- 모델:
claude-cli/claude-sonnet-4-5 - 명령:
claude - 인자:
["-p","--output-format","json","--dangerously-skip-permissions"]
- 모델:
- 오버라이드(선택):
OPENCLAW_LIVE_CLI_BACKEND_MODEL="claude-cli/claude-opus-4-6"OPENCLAW_LIVE_CLI_BACKEND_MODEL="codex-cli/gpt-5.3-codex"OPENCLAW_LIVE_CLI_BACKEND_COMMAND="/full/path/to/claude"OPENCLAW_LIVE_CLI_BACKEND_ARGS='["-p","--output-format","json","--permission-mode","bypassPermissions"]'OPENCLAW_LIVE_CLI_BACKEND_CLEAR_ENV='["ANTHROPIC_API_KEY","ANTHROPIC_API_KEY_OLD"]'- 실제 이미지 첨부를 전송하려면
OPENCLAW_LIVE_CLI_BACKEND_IMAGE_PROBE=1(경로는 프롬프트에 주입됨) - 이미지 파일 경로를 프롬프트 주입 대신 CLI 인자로 전달하려면
OPENCLAW_LIVE_CLI_BACKEND_IMAGE_ARG="--image" IMAGE_ARG설정 시 이미지 인자 전달 방식을 제어하려면OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE="repeat"(또는"list")- 두 번째 턴을 보내고 재개 플로를 검증하려면
OPENCLAW_LIVE_CLI_BACKEND_RESUME_PROBE=1
- Claude Code CLI MCP 구성을 활성화 상태로 유지하려면
OPENCLAW_LIVE_CLI_BACKEND_DISABLE_MCP_CONFIG=0(기본값은 임시 빈 파일로 MCP 구성을 비활성화)
권장 live 레시피
좁고 명시적인 allowlist 가 가장 빠르고 가장 안정적입니다:-
단일 모델, 직접(게이트웨이 없음):
OPENCLAW_LIVE_MODELS="openai/gpt-5.2" pnpm test:live src/agents/models.profiles.live.test.ts
-
단일 모델, Gateway(게이트웨이) 스모크:
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.2" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
-
여러 프로바이더에 걸친 도구 호출:
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.2,anthropic/claude-opus-4-6,google/gemini-3-flash-preview,zai/glm-4.7,minimax/minimax-m2.1" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
-
Google 중심(Gemini API 키 + Antigravity):
- Gemini(API 키):
OPENCLAW_LIVE_GATEWAY_MODELS="google/gemini-3-flash-preview" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts - Antigravity(OAuth):
OPENCLAW_LIVE_GATEWAY_MODELS="google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-pro-high" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
- Gemini(API 키):
google/...는 Gemini API(API 키)를 사용합니다.google-antigravity/...는 Antigravity OAuth 브리지(Cloud Code Assist 스타일 에이전트 엔드포인트)를 사용합니다.google-gemini-cli/...는 로컬 Gemini CLI 를 사용합니다(별도의 인증 + 도구 특이점).- Gemini API vs Gemini CLI:
- API: OpenClaw 가 Google 호스팅 Gemini API 를 HTTP 로 호출(API 키 / 프로파일 인증); 대부분 사용자가 말하는 “Gemini”.
- CLI: OpenClaw 가 로컬
gemini바이너리를 호출; 자체 인증을 가지며 동작이 다를 수 있음(스트리밍/도구 지원/버전 편차).
Live: 모델 매트릭스(다루는 범위)
고정된 “CI 모델 목록”은 없지만(live 는 옵트인), 키가 있는 개발 머신에서 정기적으로 커버할 것을 권장하는 모델들입니다.최신 스모크 세트(도구 호출 + 이미지)
계속 동작해야 하는 “공통 모델” 실행입니다:- OpenAI(비 Codex):
openai/gpt-5.2(선택:openai/gpt-5.1) - OpenAI Codex:
openai-codex/gpt-5.3-codex(선택:openai-codex/gpt-5.3-codex-codex) - Anthropic:
anthropic/claude-opus-4-6(또는anthropic/claude-sonnet-4-5) - Google(Gemini API):
google/gemini-3-pro-preview및google/gemini-3-flash-preview(구형 Gemini 2.x 모델 회피) - Google(Antigravity):
google-antigravity/claude-opus-4-6-thinking및google-antigravity/gemini-3-flash - Z.AI(GLM):
zai/glm-4.7 - MiniMax:
minimax/minimax-m2.1
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.2,openai-codex/gpt-5.3-codex,anthropic/claude-opus-4-6,google/gemini-3-pro-preview,google/gemini-3-flash-preview,google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-flash,zai/glm-4.7,minimax/minimax-m2.1" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
베이스라인: 도구 호출(Read + 선택적 Exec)
프로바이더 패밀리당 최소 하나 선택:- OpenAI:
openai/gpt-5.2(또는openai/gpt-5-mini) - Anthropic:
anthropic/claude-opus-4-6(또는anthropic/claude-sonnet-4-5) - Google:
google/gemini-3-flash-preview(또는google/gemini-3-pro-preview) - Z.AI(GLM):
zai/glm-4.7 - MiniMax:
minimax/minimax-m2.1
- xAI:
xai/grok-4(또는 최신 사용 가능 모델) - Mistral:
mistral/… (pick one “tools” capable model you have enabled) - Cerebras:
cerebras/…(접근 권한이 있는 경우) (if you have access) (if you have access) - LM Studio:
lmstudio/… LM Studio:lmstudio/…(로컬; 도구 호출은 API 모드에 따라 다름)
비전: 이미지 전송(첨부 → 멀티모달 메시지)
이미지 프로브를 실행하기 위해OPENCLAW_LIVE_GATEWAY_MODELS 에 이미지 가능 모델을 최소 하나 포함하십시오(Claude/Gemini/OpenAI 비전 가능 변형 등). to exercise the image probe.
집계기 / 대체 게이트웨이
키가 활성화되어 있다면 다음을 통한 테스트도 지원합니다:- OpenRouter:
openrouter/...(수백 개 모델; 도구+이미지 가능 후보를 찾으려면openclaw models scan사용) - OpenCode Zen:
opencode/...(인증:OPENCODE_API_KEY/OPENCODE_ZEN_API_KEY)
- 내장:
openai,openai-codex,anthropic,google,google-vertex,google-antigravity,google-gemini-cli,zai,openrouter,opencode,xai,groq,cerebras,mistral,github-copilot models.providers(커스텀 엔드포인트) 경유:minimax(클라우드/API), 그리고 OpenAI/Anthropic 호환 프록시(LM Studio, vLLM, LiteLLM 등)
discoverModels(...) 가 반환하는 것 + 사용 가능한 키입니다.
자격 증명(절대 커밋 금지)
Live 테스트는 CLI 와 동일한 방식으로 자격 증명을 발견합니다. 실무적 의미:- CLI 가 동작하면 live 테스트도 동일한 키를 찾아야 합니다.
-
live 테스트가 “자격 증명 없음”이라고 하면
openclaw models list/ 모델 선택을 디버깅하는 것과 같은 방식으로 디버깅하십시오. -
프로파일 스토어:
~/.openclaw/credentials/(권장; 테스트에서 말하는 “프로파일 키”의 의미) -
구성:
~/.openclaw/openclaw.json(또는OPENCLAW_CONFIG_PATH)
~/.profile 에서 export), source ~/.profile 이후 로컬 테스트를 실행하거나 아래 Docker 러너를 사용하십시오(컨테이너에 ~/.profile 를 마운트 가능).
Deepgram live(오디오 전사)
- 테스트:
src/media-understanding/providers/deepgram/audio.live.test.ts - 활성화:
DEEPGRAM_API_KEY=... DEEPGRAM_LIVE_TEST=1 pnpm test:live src/media-understanding/providers/deepgram/audio.live.test.ts
Docker 러너(선택적 “Linux 에서 동작” 확인)
리포 Docker 이미지 안에서pnpm test:live 를 실행하며, 로컬 구성 디렉토리와 워크스페이스를 마운트합니다(마운트된 경우 ~/.profile 를 소스):
- 직접 모델:
pnpm test:docker:live-models(스크립트:scripts/test-live-models-docker.sh) - Gateway(게이트웨이) + 개발 에이전트:
pnpm test:docker:live-gateway(스크립트:scripts/test-live-gateway-models-docker.sh) - 온보딩 마법사(TTY, 전체 스캐폴딩):
pnpm test:docker:onboard(스크립트:scripts/e2e/onboard-docker.sh) - Gateway(게이트웨이) 네트워킹(두 컨테이너, WS 인증 + 헬스):
pnpm test:docker:gateway-network(스크립트:scripts/e2e/gateway-network-docker.sh) - 플러그인(커스텀 확장 로드 + 레지스트리 스모크):
pnpm test:docker:plugins(스크립트:scripts/e2e/plugins-docker.sh)
OPENCLAW_CONFIG_DIR=...(기본값:~/.openclaw) →/home/node/.openclaw에 마운트OPENCLAW_WORKSPACE_DIR=...(기본값:~/.openclaw/workspace) →/home/node/.openclaw/workspace에 마운트OPENCLAW_PROFILE_FILE=...(기본값:~/.profile) →/home/node/.profile에 마운트되고 테스트 실행 전 소스됨- 실행을 좁히려면
OPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=... - 자격 증명이 환경 변수가 아닌 프로파일 스토어에서 오도록 보장하려면
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1
Docs sanity
문서 편집 후 문서 체크 실행:pnpm docs:list.
오프라인 회귀(CI 안전)
실제 프로바이더 없이 “실제 파이프라인” 회귀:- Gateway(게이트웨이) 도구 호출(mock OpenAI, 실제 Gateway(게이트웨이) + 에이전트 루프):
src/gateway/gateway.tool-calling.mock-openai.test.ts - Gateway(게이트웨이) 마법사(WS
wizard.start/wizard.next, 구성 작성 + 인증 강제):src/gateway/gateway.wizard.e2e.test.ts
에이전트 신뢰성 평가(skills)
이미 “에이전트 신뢰성 평가”처럼 동작하는 CI 안전 테스트가 일부 있습니다:- 실제 Gateway(게이트웨이) + 에이전트 루프를 통한 mock 도구 호출(
src/gateway/gateway.tool-calling.mock-openai.test.ts). - 세션 와이어링과 구성 효과를 검증하는 엔드투엔드 마법사 플로(
src/gateway/gateway.wizard.e2e.test.ts).
- 의사결정: 프롬프트에 skills 가 나열될 때 에이전트가 올바른 skill 을 선택하는가(또는 관련 없는 것을 회피하는가)?
- 컴플라이언스: 사용 전
SKILL.md를 읽고 요구되는 단계/인자를 따르는가? - 워크플로 계약: 도구 순서, 세션 히스토리 전달, 샌드박스 경계를 단언하는 멀티턴 시나리오.
- mock 프로바이더를 사용하는 시나리오 러너로 도구 호출 + 순서, skill 파일 읽기, 세션 와이어링을 단언.
- skill 중심 시나리오의 소규모 스위트(사용 vs 회피, 게이팅, 프롬프트 인젝션).
- CI 안전 스위트가 준비된 이후에만 선택적 live 평가(옵트인, 환경 변수 게이팅).
회귀 추가(가이드)
Live 에서 발견된 프로바이더/모델 이슈를 수정할 때:- 가능하면 CI 안전 회귀를 추가(mock/stub 프로바이더, 또는 정확한 요청 형태 변환 캡처)
- 본질적으로 live 전용인 경우(레이트 리밋, 인증 정책) live 테스트를 좁게 유지하고 환경 변수로 옵트인
- 버그를 포착하는 가장 작은 레이어를 선호:
- 프로바이더 요청 변환/재생 버그 → 직접 모델 테스트
- Gateway(게이트웨이) 세션/히스토리/도구 파이프라인 버그 → Gateway(게이트웨이) live 스모크 또는 CI 안전 Gateway(게이트웨이) mock 테스트