AI 에이전트가 API를 테스트하게 하세요: two-go의 AI 레이어와 MCP 서버
요약
Node.js 환경에서 HTTP API 테스트를 간소화하는 zero-dependency 라이브러리 'two-go'를 소개합니다. AI 레이어와 MCP 서버를 통해 AI 에이전트가 테스트 스위트 초안 작성, 실패 원인 분석, 적대적 페이로드 생성 등을 수행할 수 있도록 지원합니다.
핵심 포인트
- 의존성 없는 체이닝 가능한 API로 간편한 HTTP 테스트 가능
- AI 레이어를 통한 테스트 스위트 자동 생성 및 응답 검토
- OpenAI, Anthropic 등 다양한 LLM과 호환되는 설계
- 테스트 실패 원인 설명 및 퍼징을 위한 페이로드 생성 지원
모든 프로젝트에는 작동하는 엔드포인트(endpoint)가 생겼을 때, 테스트를 작성해야 한다는 것을 알고 있으면서도, 의미 있는 검사를 단 하나라도 작성하기 전에 HTTP 클라이언트(HTTP client), 어설션 라이브러리(assertion library), 그리고 수십 개의 작은 헬퍼(helpers)들을 연결하는 데 다음 한 시간을 소비하게 될 것임을 알고 있는 순간이 있습니다.
저는 그 순간이 지긋지긋했습니다. 그래서 two-go를 만들었습니다. Node에서 HTTP API를 테스트하기 위한 작고 의존성이 없는(zero-dependency) 라이브러리입니다. 체이닝 가능한 API(chainable API)로 요청을 생성하고, 원하는 검사(checks)를 부착한 뒤, await 하면 됩니다.
import { go } from "two-go";
await go("https://api.example.com")
...
이 단일 체인(chain)이 요청을 보내고 세 가지 검사를 모두 실행합니다. 만약 하나라도 실패하면 예외(throw)를 발생시키므로, 별도로 구성해야 할 러너(runner)가 없습니다. 자체적으로 작동하며, 플러그인 없이 node:test, Jest, Vitest 또는 Mocha에 바로 적용할 수 있습니다.
이것이 핵심입니다. 하지만 제가 이 포스트에서 실제로 이야기하고 싶은 부분은 제가 시작했을 당시 API 테스트 라이브러리에는 존재하지 않았던 부분입니다. 바로 AI 에이전트(AI agent)가 당신을 대신해 테스트 작업을 수행하게 하는 것입니다. two-go는 이를 위해 두 가지를 제공합니다: 선택적인 AI 레이어(AI layer)와 MCP 서버(MCP server)입니다.
왜 굳이 AI 레이어가 필요한가요?
API 테스트에서 발생하는 마찰의 대부분은 어설션(assertions)을 작성하는 것이 아닙니다. 그것은 바로 _응답을 빤히 바라보며 무엇을 검증할지 결정하는 것_입니다. 이 응답은 어떤 상태 코드(status)를 반환해야 할까요? data[0]의 형태(shape)는 무엇인가요? 어떤 필드가 유출될 수 있을까요? 어떤 이상한 페이로드(payloads)가 시스템을 망가뜨릴까요?
이것들은 바로 언어 모델(language model)이 초안을 잡기에 매우 적합한 질문들입니다. 따라서 two-go는 다음과 같은 기능을 수행할 수 있는 선택적인 two-go/ai 엔트리 포인트(entry point)를 제공합니다:
- 라이브 엔드포인트(live endpoint) 또는 샘플 응답(sample response)으로부터 테스트 스위트(test suite) 초안 작성
- 테스트가 실패한 이유 설명
- 발생 가능한 버그를 확인하기 위한 응답 검토
- 엔드포인트를 퍼징(fuzz)하기 위한 적대적 페이로드(adversarial payloads) 생성
중요한 설계 선택: AI 레이어는 코어(core)를 절대 건드리지 않습니다. two-go는 여전히 런타임 의존성(runtime dependencies)이 전혀 없습니다. AI 모듈은 사용자의 키를 사용하여 fetch를 통해 제공자(provider)와 통신하며, OpenAI, Anthropic 또는 로컬 모델을 포함한 모든 호환 가능한 엔드포인트와 작동합니다.
실제 엔드포인트로부터 테스트 스위트 초안 작성하기
export OPENAI_API_KEY=sk-...
two-go ai gen https://api.example.com/users -o test/users.twogo.mjs
...
또는 코드에서:
import { aiGenerateTests } from "two-go/ai";
const code = await aiGenerateTests({
...
출력물은 일반적인 *.twogo.mjs 파일입니다. 이는 다른 파일들과 마찬가지로 git에 포함되고 CI(지속적 통합)에서 실행됩니다. 이를 _초안(first draft)_으로 취급하세요. 초안은 상용구(boilerplate)와 명백한 체크 사항들을 처리해 주며, 여러분은 그 지점부터 어설션(assertions)을 강화해 나가면 됩니다.
실패 원인 설명하기 (사후에 수행하며, 결과는 절대 변경하지 않음)
테스트가 실패했을 때, 모델에게 무엇이 잘못되었을 가능성이 높은지 물어볼 수 있습니다. 이는 권고 사항(advisory)입니다. 이는 실패가 발생한 후에 실행되며, 통과(pass) 또는 실패(fail) 결과를 절대 변경하지 않습니다.
import { explainFailure } from "two-go/ai";
try {
...
검토 및 퍼징(fuzzing)
aiReview는 응답을 살펴보고 발생 가능한 문제 목록을 반환합니다: 유출된 토큰, 잘못된 타입, 존재해서는 안 될 필드 등이 해당됩니다. aiFuzz는 여러분이 일반 클라이언트로 보낼 수 있는 적대적 페이로드(adversarial payloads)를 생성합니다.
import { aiReview, aiFuzz } from "two-go/ai";
const res = await api.get("/me");
...
둘 다 권고 사항입니다. aiReview는 발견 사항을 제공하고, aiFuzz는 입력값을 제공하며, 그것들을 어떻게 처리할지는 여러분이 결정합니다. 모델은 제안하고, 여러분의 어설션(assertions)이 결정합니다.
MCP 서버: 에이전트에게 도구 전달하기
위에서 설명한 AI 레이어는 two-go가 모델을 호출하는 방식입니다. MCP 서버는 그 방향을 뒤집습니다. 이는 Claude와 같은 에이전트가 두-고(two-go)를 일련의 도구(tools)로서 직접 제어할 수 있게 해줍니다.
아직 접해보지 못하셨다면, MCP (Model Context Protocol)는 AI 에이전트에게 도구(tools)를 노출하기 위한 개방형 표준입니다. two-go는 의존성, URL, 계정, API 키 없이 stdio를 통해 실행되는 MCP 서버를 탑재하고 있습니다. 모든 과정은 로컬에서 이루어집니다.
two-go-mcp 명령어를 PATH에 등록할 수 있도록 한 번만 설치하세요:
npm install -g two-go
그 다음 클라이언트에 연결하세요. Claude Code의 경우:
claude mcp add two-go two-go-mcp
Claude Desktop, Cursor, Windsurf, Copilot CLI 또는 Kiro의 경우, 클라이언트의 MCP 설정에 다음을 추가하세요:
{
"mcpServers": {
"two-go": { "command": "two-go-mcp" }
...
(VS Code는 최상위 servers 키와 `
- HTTP 클라이언트 + 인라인 검사 (inline checks):
expectStatus,expectJson,expectHeader,expectJsonSchema,expectSorted및 기타 긴 목록의 검사 기능. - 모든 값에 대한
expect():.not,.resolves,.rejects를 포함한 Jest 스타일의 매처 (matchers). - 소프트 어서션 (Soft assertions): 실행 중 발생하는 모든 실패를 수집한 뒤, 마지막에 한 번에 오류를 발생시킴.
- 폴링 (Polling): 느리거나 최종적 일관성 (eventually-consistent)을 가진 엔드포인트를 위한
eventually/pollUntil. - 스냅샷 (Snapshots),
{{token}}체이닝을 통한 세션 (sessions), 가짜 데이터 생성기 (fake-data generator), 비동기 헬퍼 (async helpers) (parallelLimit,mapLimit,waterfall), 약 170개의 함수로 구성된 유틸리티 벨트 (utility belt), 그리고 JSON 스키마 검증기 (validator) + 추론 (inference). - 임포터 (Importers): OpenAPI 문서나 Postman 컬렉션을 시작용 테스트 스위트로 변환하며, CLI를 제공함:
two-go gen openapi ./openapi.json -o test/api.twogo.mjs.
이 모든 기능은 직접 작성된 TypeScript 타입과 함께 제공되며, 런타임 의존성 (runtime dependencies)이 전혀 없습니다. Node 18 이상(내장 fetch 사용)이 필요하며, ESM 전용입니다.
현실적인 전체 흐름 (A realistic flow, end to end)
실제 환경에서 각 구성 요소가 어떻게 결합되는지는 다음과 같습니다:
- 엔드포인트와 OpenAPI 문서가 준비되어 있습니다.
two-go gen openapi를 실행하여 스켈레톤 스위트 (skeleton suite)를 생성합니다. - 에이전트(MCP 서버를 통해)에게 라이브 엔드포인트를 호출하고 문서와 일치하지 않는 부분(drift)을 찾아내라고 요청합니다.
- 샘플 응답에 대해
aiReview를 실행하여 데이터 유출 (leaks) 및 타입 불일치 (type mismatches)를 드러냅니다. - 생성된 검사 항목들을 수동으로 다듬어 실제 어서션 (assertions)으로 만듭니다.
*.twogo.mjs파일들을 커밋합니다. 이 파일들은 다른 테스트와 마찬가지로 CI에서 실행됩니다.
AI는 지루한 첫 번째 단계인 보일러플레이트 (boilerplate), 명백한 검사, "이 부분이 이상해 보입니다"와 같은 작업을 수행합니다. 판단은 사용자가 내립니다. AI 레이어는 핵심적인 하중을 견디는 구조 (load bearing)가 아닙니다. AI 레이어를 제거하더라도 핵심 기능은 정확히 동일하게 작동합니다.
사용해 보기
npm install two-go --save-dev
로드맵(JUnit/JSON 리포터, GraphQL 헬퍼, 쿠키 저장소(cookie jar), 요청 레벨 재시도(request-level retry))은 이슈(issues)에 공개되어 있습니다. 이것으로 무언가를 만드시거나, 혹은 오류를 발견하신다면 꼭 알려주세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기