테스트 및 디버깅
Verdent로 테스트하고 디버깅하는 워크플로
Verdent for VS Code는 여러 차례의 생성-테스트-수정 사이클, 오류 분석, 자동화된 테스트 커버리지 개선을 통해 포괄적인 테스트를 작성하고 문제를 디버깅할 수 있게 도와줍니다. 프로젝트의 테스트 프레임워크와 스타일에 맞는 단위, 통합, 엔드투엔드 테스트를 생성합니다.
배울 내용
- 엣지 케이스와 기대 동작을 다루는 단위 테스트 생성
- 주요 테스트 프레임워크(Jest, Pytest, JUnit 등)와 함께 작업
- 여러 컴포넌트가 함께 동작하는 워크플로를 검증하는 통합 테스트 작성
- 테스트되지 않은 코드 경로를 찾아 테스트하여 커버리지 개선
- 오류 메시지 분석과 실행 추적으로 문제 디버깅
- 스택 트레이스, 오류 로그, 예상과 다른 동작으로부터 버그 진단
사전 준비
Verdent로 테스트하고 디버깅하기 전에 다음을 준비합니다.
- Verdent 확장이 설치된 Visual Studio Code
- VS Code에서 열려 있는 코드베이스 또는 프로젝트 워크스페이스
- 사용 가능한 크레딧이 있는 활성 Verdent 구독
- 프로젝트에 설정된 테스트 프레임워크(테스트 생성에는 선택 사항)
단위 테스트 작성
Verdent는 프로젝트의 테스트 프레임워크와 스타일에 맞는 단위 테스트를 생성합니다. 기존 테스트를 분석해 패턴을 이해한 뒤, 적절한 설정, 어설션, 모킹이 포함된 테스트를 생성합니다.
예시:
Write unit tests for the calculateDiscount functionVerdent는 다음을 수행합니다.
calculateDiscount함수 구현 검토- 입력 매개변수와 반환값 식별
- 기존 테스트를 분석해 규칙(테스트 구조, 어설션 스타일, 이름 지정 패턴)에 맞춤
- 다음을 다루는 테스트 생성:
- 정상 경로: 유효한 입력과 기대 출력
- 엣지 케이스: 경계값, 0, 음수, 최댓값
- 잘못된 입력: null, undefined, 잘못된 타입
- 기대 동작: 비즈니스 로직 검증
생성되는 테스트 구조:
Verdent는 프로젝트의 패턴을 따르는 테스트를 만듭니다.
- 테스트 스위트 구성: Describe 블록, 테스트 클래스 또는 모듈 구조
- 설정 및 정리: 기존 테스트에 맞는 before/after 훅
- 어설션: 프로젝트의 어설션 라이브러리 사용(expect, assert, should 등)
- 모킹: 모킹 패턴에 맞춤(jest.mock, sinon, unittest.mock)
- 이름 지정 규칙: 이미 정한 스타일을 따르는 테스트 이름
여러 차례의 생성-테스트-수정 사이클:
포괄적인 테스트를 위해 Verdent는 여러 차례의 사이클을 사용합니다.
- 생성: 초기 테스트 스위트 작성
- 실행: 테스트를 실행해 정상 동작 확인
- 수정: 실패한 테스트를 고치거나 커버리지 개선
- 반복: 테스트가 통과하고 커버리지가 충분할 때까지 반복
이를 통해 테스트가 단순히 작성되는 데 그치지 않고, 실제로 코드베이스에서 올바르게 동작하도록 보장합니다.
Verdent는 기존 테스트를 분석해 규칙에 맞춥니다. 기존 테스트 패턴이 일관적일수록 Verdent가 생성하는 테스트도 프로젝트 스타일에 더 잘 맞습니다.
지원되는 테스트 프레임워크
Verdent는 추가 설정 없이 다양한 프로그래밍 언어와 기술 스택의 주요 테스트 프레임워크를 모두 지원합니다.
단위 테스트 프레임워크:
test('sum returns correct result', () => {
expect(sum(2, 3)).toBe(5);
});const assert = require('assert');
describe('sum', () => {
it('returns correct result', () => {
assert.strictEqual(sum(2, 3), 5);
});
});import { describe, it, expect } from 'vitest';
it('sum returns correct result', () => {
expect(sum(2, 3)).toBe(5);
});describe('sum', () => {
it('returns correct result', () => {
expect(sum(2, 3)).toEqual(5);
});
});프레임워크별 테스트:
- React Testing Library - 사용자 중심 React 컴포넌트 테스트
- Vue Test Utils - 공식 Vue.js 테스트 라이브러리
엔드투엔드 테스트:
- Cypress - 엔드투엔드 및 컴포넌트 테스트
- Playwright - 크로스 브라우저 엔드투엔드 테스트
- Puppeteer - Headless Chrome 테스트
- Pytest - 가장 많이 쓰이는 Python 테스트 프레임워크
- unittest - Python 내장 테스트 프레임워크
- nose2 - 플러그인으로 unittest를 확장
- doctest - 문서 문자열에 포함된 테스트
Verdent는 Python 테스트 스타일에 맞는 적절한 fixture, 매개변수화, 어설션 패턴으로 테스트를 생성합니다.
- JUnit - 표준 Java 테스트 프레임워크(JUnit 4, JUnit 5)
- TestNG - 고급 기능을 갖춘 테스트 프레임워크
- Mockito - Java용 모킹 프레임워크
- AssertJ - 유창한 문법의 어설션 라이브러리
Verdent는 Java 테스트 규칙을 따르는 어노테이션, 라이프사이클 메서드, 어설션으로 테스트를 만듭니다.
- RSpec (Ruby) - 동작 주도 개발 프레임워크
- PHPUnit (PHP) - PHP용 단위 테스트 프레임워크
- Go testing (Go) - Go 내장 테스트 패키지
- xUnit (C#/.NET) - .NET용 테스트 프레임워크
- Catch2 (C++) - 현대적인 C++ 테스트 프레임워크
Verdent는 언어별 테스트 관용구에 맞춰 프로젝트 규칙에 맞는 테스트를 생성합니다.
Verdent는 프로젝트 설정과 기존 테스트에서 테스트 프레임워크를 인식하고, 설정에 맞는 테스트를 자동으로 생성합니다.
통합 테스트 생성
Verdent는 여러 컴포넌트, 서비스 또는 모듈이 함께 어떻게 동작하는지 검증하는 통합 테스트를 생성합니다. API 상호작용, 데이터베이스 작업, 인증 흐름, 여러 단계의 사용자 여정을 포함한 실제 워크플로를 시뮬레이션하는 테스트를 만듭니다.
예시:
Write integration tests for the user registration flowVerdent는 전체 흐름을 검증하는 테스트를 생성합니다.
- 폼 제출: 사용자가 유효한 데이터로 등록 폼 제출
- 검증: 백엔드가 이메일 형식, 비밀번호 강도, 데이터 완전성 검증
- 데이터베이스 삽입: 데이터베이스에 사용자 레코드 생성
- 이메일 발송: 확인 이메일 발송(모킹 또는 실제 발송)
- 성공적인 로그인: 새 사용자가 자격 증명으로 즉시 로그인 가능
통합 테스트 구조:
Verdent는 다음을 포함한 통합 테스트를 만듭니다.
- 테스트 설정: 데이터베이스 시딩, 서비스 초기화, 테스트 데이터 생성
- 워크플로 시뮬레이션: 여러 단계의 작업을 순서대로 실행
- 상태 검증: 데이터베이스 상태, API 응답, 부수 효과 확인
- 외부 서비스 모킹: 이메일 서비스, 결제 APIs, 서드파티 연동
- 테스트 정리: 테스트 데이터 정리, 데이터베이스 롤백, 서비스 종료
테스트 시나리오 예시:
Write integration tests for the checkout and payment processVerdent는 다음을 테스트합니다.
- 장바구니에 항목 추가
- 할인 코드 적용
- 세금과 배송비를 포함한 합계 계산
- 결제 처리(모킹된 결제 게이트웨이 사용)
- 데이터베이스에 주문 레코드 생성
- 확인 이메일 발송
- 재고 업데이트
테스트 격리:
Verdent는 통합 테스트가 올바르게 격리되도록 보장합니다.
- 각 테스트는 깨끗한 데이터베이스 상태에서 시작
- 부수 효과를 막기 위해 외부 서비스 호출 모킹
- 테스트 간 의존성 없이 어떤 순서로도 실행 가능
- 테스트가 실패해도 정리 수행
통합 테스트에는 격리된 테스트 환경이 유용하며, Verdent가 데이터베이스 fixture 설정과 외부 서비스 모킹을 도와줄 수 있습니다.
통합 테스트는 컴포넌트들이 함께 올바르게 동작하는지 검증합니다. 단위 테스트보다 복잡하지만, 실제 워크플로가 기대대로 작동한다는 더 높은 확신을 제공합니다.
테스트 커버리지 개선
Verdent는 코드베이스를 분석해 테스트되지 않은 함수, 분기, 엣지 케이스를 찾고, 커버리지를 개선하기 위한 테스트를 생성합니다. 기존 테스트 스위트를 검토해 실행되지 않은 코드 경로가 있는 빈틈을 찾아냅니다.
예시:
Analyze test coverage and write tests for uncovered code paths in the payment moduleVerdent는 다음을 수행합니다.
- 기존 테스트 분석: 현재 무엇이 테스트되고 있는지 검토
- 커버리지 빈틈 식별: 테스트가 부족한 특정 함수, 조건 분기, 오류 처리 경로, 엣지 케이스 찾기
- 누락된 테스트 생성: 커버되지 않은 코드를 대상으로 테스트 작성
- 커버리지 개선 확인: 테스트를 실행해 커버리지가 증가했는지 확인
Verdent가 식별하는 항목:
- 테스트되지 않은 함수: 테스트 커버리지가 전혀 없는 함수
- 조건 분기: 한쪽 분기가 테스트되지 않은 if/else 문
- 오류 처리 경로: 실패 테스트가 없는 try/catch 블록 또는 오류 콜백
- 엣지 케이스: 경계값, null/undefined 처리, 타입 강제 변환
- 통합 지점: API 호출, 데이터베이스 작업, 외부 서비스 상호작용
커버리지 개선 예시:
Improve test coverage for the UserService classVerdent는 다음을 식별합니다.
getUserById에는 유효한 ID 테스트는 있지만 잘못된 ID 테스트는 없음updateUser에는 검증 실패 테스트가 없음deleteUser에는 권한 확인 테스트가 없음createUser의 오류 처리 경로가 테스트되지 않음
그런 다음 이러한 빈틈을 직접 겨냥한 테스트를 생성해 커버리지를 65%에서 95%로 높입니다.
커버리지 지표:
Verdent는 더 높은 커버리지 비율에 도달하고, 이전에 테스트되지 않은 코드에서 잠재적인 버그를 찾을 수 있게 도와줍니다.
- 라인 커버리지: 테스트로 실행된 코드 라인의 비율
- 분기 커버리지: 테스트된 조건 분기의 비율
- 함수 커버리지: 하나 이상의 테스트가 있는 함수의 비율
- 문장 커버리지: 실행된 문장의 비율
Verdent로 디버깅
Verdent는 오류 메시지 분석, 실행 흐름 추적, 근본 원인 식별, 수정 제안을 통해 디버깅을 도와줍니다. 오류 로그를 붙여 넣거나, 예상과 다른 동작을 설명하거나, Verdent에게 특정 문제를 조사해 달라고 요청합니다.
무엇이 잘못되었고 무엇을 기대했는지 설명합니다.
This function returns undefined instead of the user object. Debug it.Verdent는 다음을 수행합니다.
- 함수 구현 읽기
- 실행 흐름 추적
- 코드 경로가 잘못되는 지점 식별(누락된 return 문, 잘못된 조건문, async/await 문제)
- 설명과 함께 수정안 제안
- 회귀를 방지할 테스트 케이스 제안
예시:
The login form redirects to the home page even when credentials are invalidVerdent는 다음을 수행합니다.
- 로그인 폼 제출 로직 검토
- 인증 흐름 추적
- 버그 식별(비동기 검증이 끝나기 전에 리디렉션 발생)
- 수정안 제안(리디렉션 전에 검증을 await)
성능 분석을 요청합니다.
The product search is slow when the database has 10,000+ productsVerdent는 다음을 수행합니다.
- 검색 쿼리 구현 분석
- 비효율 식별(N+1 쿼리, 누락된 데이터베이스 인덱스, 비효율적인 알고리즘)
- 최적화 제안(데이터베이스 인덱스 추가, 쿼리 배치 처리, 결과 캐싱)
성능 디버깅은 애플리케이션을 느리게 만드는 알고리즘, 데이터베이스 쿼리 또는 API 응답의 병목을 찾는 데 도움이 됩니다.
코드가 어떻게 실행되는지 이해합니다.
Why does this API endpoint return a 500 error when the email parameter is missing?Verdent는 다음을 수행합니다.
- 엔드포인트에서 검증, 데이터베이스까지 요청 처리 흐름 추적
- 오류 발생 위치 식별(undefined의 속성 접근)
- 오류가 발생하는 이유 설명(속성 접근 전에 null 확인 누락)
- 방어적 수정 제안(사용 전에 매개변수 검증)
실행 흐름 추적은 코드가 어떤 경로를 거치는지, 그리고 어디에서 기대 동작에서 벗어나는지 이해하는 데 도움이 됩니다.
오류 메시지나 스택 트레이스를 채팅에 직접 붙여 넣습니다. Verdent가 오류를 분석하고, 문제가 있는 코드를 찾고, 특정 파일 경로와 줄 번호를 포함해 무엇이 잘못되었는지 설명합니다.
오류 메시지와 로그로 진단하기
오류 메시지, 스택 트레이스 또는 로그 파일을 채팅에 직접 붙여 넣습니다. Verdent가 오류를 분석하고, 소스 파일과 줄 번호를 식별하고, 원인을 설명하고, 수정안을 제안합니다.
오류 메시지와 스택 트레이스를 붙여 넣습니다.
TypeError: Cannot read property 'name' of undefined
at UserProfile.render (UserProfile.jsx:45)
at processComponent (react-dom.js:2103)이것을 Verdent에 붙여 넣습니다.
I'm getting this error: [paste stack trace]Verdent는 다음을 수행합니다.
- 오류 타입 식별(null/undefined 접근으로 인한 TypeError)
- 정확한 줄 찾기(
UserProfile.jsx:45) - 해당 위치의 코드 읽기
- 왜 발생하는지 설명(데이터가 로드되기 전에 user 객체가 undefined임)
- 수정안 제안:
- null 확인 추가:
if (!user) return <Loading /> - optional chaining 사용:
user?.name - 컴포넌트를 렌더링하기 전에 데이터가 로드되도록 보장
- null 확인 추가:
분석할 로그 파일이나 콘솔 출력을 붙여 넣습니다.
Analyze these logs and tell me why the API requests are failing:
[paste 50 lines of log output]Verdent는 다음을 수행합니다.
- 로그에서 오류 패턴 스캔
- 인증 실패, 네트워크 타임아웃 또는 데이터베이스 오류 식별
- 실패로 이어지는 이벤트 순서 추적
- 오류 패턴에 기반해 수정안 제안
로그 분석은 여러 실패에서 반복되는 패턴을 찾고, 오류로 이어지는 이벤트 순서를 이해하는 데 도움이 됩니다.
복잡한 문제의 경우 Verdent는 여러 단계의 디버깅을 사용합니다.
- 오류 로그 분석으로 실패 지점 식별
- 관련 코드 읽기로 구현 이해
- 실행 흐름 추적으로 문제가 발생하는 위치 찾기
- 코드 예시와 함께 수정안 제안
- 테스트 생성으로 회귀 방지
예시:
The shopping cart total is sometimes incorrect. Here are the error logs: [paste logs]Verdent는 다음을 수행합니다.
- 로그를 분석하고 버그가 발생하는 시점 식별(할인 코드가 적용될 때)
- 할인 계산 로직 읽기
- 버그 식별(할인이 세금 이후가 아니라 세금 전에 계산됨)
- 수정안 제안(계산 단계 순서 변경)
- 테스트 케이스 제안(할인이 있는 장바구니, 세금이 있는 장바구니, 둘 다 있는 장바구니)
모범 사례
테스트를 일찍 생성하세요
기능 개발이 끝난 뒤가 아니라 개발하는 동안 테스트를 작성합니다. Verdent는 새 함수나 컴포넌트를 만든 직후 테스트를 생성할 수 있습니다.
기존 테스트를 스타일 가이드로 사용하세요
Verdent는 프로젝트의 테스트 패턴에 맞춥니다. 일관된 테스트 구조를 유지하면 Verdent가 규칙에 맞는 테스트를 생성합니다.
엣지 케이스 테스트를 명시적으로 요청하세요
Verdent에게 경계 조건, 오류 시나리오, 특이한 입력을 테스트해 달라고 요청합니다. "잘못된 입력과 경계값에 대한 엣지 케이스를 포함해 테스트를 작성해 주세요."
오류 메시지를 직접 붙여 넣으세요
오류를 바꿔 말하지 마세요. 정확한 진단과 빠른 해결을 위해 전체 스택 트레이스를 붙여 넣습니다.
기대 동작과 실제 동작을 설명하세요
디버깅할 때 무엇이 일어나길 기대했는지와 실제로 무엇이 일어났는지를 명확히 적습니다. 이 컨텍스트는 Verdent가 근본 원인을 찾는 데 도움이 됩니다.
복잡한 기능에는 여러 차례의 테스트를 사용하세요
중요한 기능의 경우 여러 차례의 사이클을 포함한 포괄적인 테스트 생성을 요청합니다. "결제 모듈에 대한 포괄적인 테스트를 생성하고 모두 통과하는지 확인해 주세요."
리팩터링 후 테스트하세요
코드를 리팩터링한 뒤에는 기능이 유지되는지 확인하는 테스트를 요청합니다. "리팩터링한 인증 모듈이 올바르게 작동하는지 검증하는 테스트를 생성해 주세요."
디버깅과 테스트 생성을 함께 사용하세요
버그를 수정한 뒤에는 회귀를 막는 테스트를 요청합니다. "이 버그가 다시 발생하지 않도록 보장하는 테스트를 작성해 주세요."