홈으로 돌아가기

QA에서 AI 어시스턴트를 위한 테스트 피라미드

이 기사는 테스트 생성을 위해 AI 어시스턴트를 사용할 때 테스트 피라미드가 왜 아키텍처 요구사항이 되는지 설명합니다. 피라미드의 다양한 수준에서의 작업 분해와 테스트 생성 실전 예제를 살펴봅니다.

QA에서 AI: 테스트 피라미드 없이는 안 되는 이유
Advertisement 728x90

QA에서 AI 어시스턴트를 위한 아키텍처 제약으로서의 테스트 피라미드

언어 모델이 테스트 설계자가 되면, 고전적인 테스트 피라미드가 단순한 권장 사항이 아닌 엄격한 기술적 요구사항으로 바뀝니다. 이유는 간단합니다: LLM의 컨텍스트 창은 복잡한 기능(Feature)의 전체 설명, 수십 개의 사용자 스토리(User Stories)와 태스크(Tasks)를 물리적으로 수용할 수 없기 때문입니다. "한 번에 모든 걸 넣어주기" 시도는 품질 저하나 생성 실패로 이어집니다.

왜 피라미드가 컨텍스트 문제를 해결하는가

테스트 피라미드는 태스크를 자연스럽게 분해하는 방법을 제공합니다. 전체 IT 솔루션 설명을 모델에 로드하는 대신, 레벨별로 작업합니다:

  • 태스크 레벨 (컴포넌트) — 하나의 마이크로서비스에 대한 API 계약과 비즈니스 규칙만.
  • 사용자 스토리 레벨 (시스템) — 단일 정보 시스템 내 프론트엔드와 백엔드 통합.
  • 기능 레벨 (E2E) — 시스템 간 상호작용과 엔드투엔드 비즈니스 프로세스.

각 레벨은 고유한 컨텍스트를 필요로 합니다. 그리고 격리된 상태로 제공될 때 LLM 한계 내에 맞습니다. 이건 이론이 아닙니다—실제적인 필수사항입니다.

Google AdInline article slot

예시: "주문 결제 시 프로모 코드" 기능은 3개의 사용자 스토리와 9개의 태스크로 구성됩니다. 모형(mockups), API 명세, 테스트 데이터 등을 포함한 전체 설명은 ~150K 토큰을 차지합니다. 200K 토큰 창을 가진 Claude 3 Opus는 기술적으로 처리할 수 있지만—상위 레벨의 "노이즈"로 인해 하위 레벨 테스트 품질이 떨어집니다. 레벨별로 분해하면 요청당 8–15K 토큰으로 줄고, 품질이 극적으로 향상됩니다.

AI 어시스턴트가 피라미드 레벨을 사용하는 방법

QA Assist 시스템에서 각 테스트 레벨은 전담 에이전트가 처리합니다. 아키텍처는 다음과 같습니다:

  • Unit/API 에이전트 — 하나의 엔드포인트나 컴포넌트 명세를 받습니다. 경계 값, 부정 시나리오, 하위 호환성 검사를 커버하는 단위 테스트와 API 테스트를 생성합니다.
  • 시스템 에이전트 — 관련 컴포넌트 인터페이스와 사용자 스토리 설명을 받습니다. 통합과 사용자 시나리오를 검증하는 시스템 테스트를 생성합니다.
  • E2E 에이전트 — 기능 맵과 사용자 스토리 상태를 받습니다. 시스템 간 데이터 일관성을 확인하는 엔드투엔드 테스트를 생성합니다.

핵심은 각 에이전트의 컨텍스트가 자신의 레벨로 엄격히 제한된다는 점입니다. Unit 에이전트는 관리 패널을 모릅니다. 시스템 에이전트는 주문 이력을 보지 않습니다. 이건 제한이 아니라 LLM 능력에 맞춘 최적화입니다.

Google AdInline article slot

구체적 예시: 각 레벨에서 AI가 생성하는 것

태스크 예시: 프로모 코드 적용 백엔드 API (POST /orders/apply-promo).

Unit/API 에이전트가 받는 것:

  • 엔드포인트 명세 (입력 매개변수, 출력 필드, 오류 코드).
  • 할인 계산 비즈니스 규칙 (고정 금액, 퍼센트, 결합 할인).
  • 제약 조건 (사용 제한, 만료일, 지리적 제한).

에이전트가 생성하는 것:

Google AdInline article slot
# Example sgenerirovannogo test
@pytest.mark.parametrize("promo_code, expected_discount", [
    ("SALE10", 10.0),      # Protsentnaya skidka
    ("FIXED50", 50.0),     # Fiksirovannaya sum
    ("COMBO", 60.0),       # Kombinirovannaya (10% + 50 rubles)
])
def test_valid_promo_codes(api_client, promo_code, expected_discount):
    response = api_client.post("/orders/apply-promo", json={"code": promo_code})
    assert response.status_code == 200
    assert response.json()["discount"] == expected_discount

@pytest.mark.parametrize("invalid_code", ["EXPIRED", "OVERUSED", "INVALID_FORMAT"])
def test_invalid_promo_codes(api_client, invalid_code):
    response = api_client.post("/orders/apply-promo", json={"code": invalid_code})
    assert response.status_code == 400
    assert "error" in response.json()

이제 사용자 스토리 예시: "사용자가 주문 결제 시 프로모 코드 적용".

시스템 에이전트가 받는 것:

  • 시나리오 설명 (사용자 아이템 추가, 프로모 코드 입력, 할인 확인, 주문 완료).
  • 프론트엔드와 백엔드 인터페이스 (입력 폼, API 호출, 총액 표시).
  • UX 요구사항 (클라이언트 측 검증, 오류 메시지, 로딩 상태).

에이전트가 생성하는 것:

// Example Playwright-test
test('User applies valid promo code during checkout', async ({ page }) => {
  await page.goto('/cart');
  await page.fill('#promo-code', 'SALE10');
  await page.click('#apply-promo');
  
  // Checking otobrazhenie skidki
  await expect(page.locator('.discount-amount')).toHaveText('-10%');
  
  // Checking pereschyot itogovoy summy
  const originalTotal = await page.locator('.original-total').innerText();
  const discountedTotal = await page.locator('.final-total').innerText();
  expect(parseFloat(discountedTotal)).toBeLessThan(parseFloat(originalTotal));
  
  // Oformlyaem zakaz
  await page.click('#checkout-button');
  await expect(page).toHaveURL('/order-confirmation');
});

왜 LLM이 상위 레벨에서 더 고전하는가

언어 모델은 고수준 추상화에서 예측 가능한 품질 저하를 보입니다:

  • 기능/E2E 레벨 — 명시적으로 형식화되지 않은 비즈니스 로직 이해가 필요합니다. 모델은 잘못된 가정을 할 수 있습니다.
  • 시스템/사용자 스토리 레벨 — 더 낫지만, 여러 소스(프론트엔드, 백엔드, UX)의 지식 통합이 요구됩니다.
  • 태스크/Unit 레벨 — LLM 강점에 이상적: 명확한 명세, 형식 규칙, 예측 가능한 입력/출력.

경험적 규칙: 피라미드 레벨이 낮을수록 AI 어시스턴트의 테스트 생성 정확도가 높습니다. 실제로 이는:

  • Unit/API 테스트—AI를 거의 완전히 신뢰 (90–95% 커버리지).
  • 시스템 테스트—복잡한 통합에 대한 검토 실시 (70–80% 커버리지).
  • E2E 테스트—상당한 인간 수정이 필요한 초안을 생성만 (50–60% 커버리지).

AI 어시스턴트 아키텍처 교훈

테스트 생성 AI 시스템을 구축한다면 테스트 피라미드를 무시하는 건 실패의 지름길입니다. QA Assist에 적용한 핵심 원칙:

  • 레벨별 분해 — 필수. 전체 기능을 한 번에 덤핑하는 프롬프트 금지.
  • 격리된 컨텍스트 — 각 에이전트는 자신의 레벨만. 레벨 간 정보는 구조화된 데이터로 전달, 텍스트 컨텍스트 아님.
  • 인간 루프 참여 — 특히 상위 레벨. AI가 초안 생성, 인간이 다듬고 승인.
  • 피드백 루프 — 테스트 실행 결과를 에이전트 미세 조정에 사용. AI가 경계 케이스를 놓치면 훈련 세트에 추가.

이 원칙 없이 가장 강력한 LLM조차 그럴듯해 보이지만 실제 버그를 잡지 못하는 테스트를 생산합니다.

주요 교훈

  • 테스트 피라미드는 단순한 방법론이 아니라 효과적인 AI 어시스턴트의 기술적 요구사항입니다.
  • LLM 컨텍스트 창은 복잡한 기능을 전체 처리할 때 품질 손실 없이 불가능합니다.
  • 레벨별 분해 (태스크 → 사용자 스토리 → 기능)만 모든 레벨에서 품질 테스트를 생산합니다.
  • AI는 하위 피라미드 레벨(Unit/API)에서 탁월하고 상위(E2E)에서 고전합니다.
  • 인간은 특히 시스템과 E2E 테스트 검토 및 다듬기에 필수적입니다.

— Editorial Team

Advertisement 728x90

다음 읽기