GitHub Copilot을 활용한 테스트 자동화 리팩토링
문제 상황
초기 테스트 자동화의 한계
-
처음에는 테스트 자동화가 경량화된 상태로 유지됨
-
소수의 플로우만 자동화되어 있으며, 매우 적은 수의 positive/negative 시나리오만 존재
-
회귀 테스트에 대한 빠른 신뢰도만 제공하는 수준
확장성 문제
-
애플리케이션 기능 보장을 위해 더 많은 시나리오 추가 필요성 대두
-
기존 테스트 자동화 스크립트를 새로운 시나리오에 맞게 적응시켜야 함
-
테스트가 쉽고 직관적으로 업데이트 가능하도록 해야 함
중요: Page Object Model 도입의 필요성
-
테스트 스위트가 일정 임계점에 도달하면 Page Object Model 사용이 필수
-
이를 적용하지 않으면 테스트 유지보수가 매우 어려워짐
-
결정이 늦어질수록 리팩토링에 매우 오랜 시간이 소요됨
프로젝트 사례: TCSE 추정기
-
17개의 e2e 시나리오가 리팩토링 필요
-
첫 번째 전환: Python 문법 → Node.js
-
애플리케이션과 동일한 환경 사용으로 GitHub Actions 설정 간소화
-
두 번째 전환: 기존 테스트 → Page Object Model
-
많은 자동화 영역과 미래 추가 기능 고려
GitHub Copilot 솔루션
Copilot의 핵심 장점
-
Page Object에서 다양한 메서드와 속성 생성 후, 17개 e2e 파일의 반복적인 복사/붙여넣기 작업 대폭 단축
-
VSCode와의 통합으로 코드베이스와 높은 수준의 프로젝트 컨텍스트 제공
온라인 챗봇 대비 우월성
-
Claude, ChatGPT 등 온라인 챗봇의 한계:
-
관련 파일이나 스니펫을 별도로 붙여넣어야 함
-
프로젝트 컨텍스트 부족
-
Copilot의 장점:
-
VSCode 통합으로 프로젝트 전체 컨텍스트 보유
-
재프롬프팅이나 추가 스니펫/파일 필요성 최소화
-
훨씬 빠른 솔루션 도달
컨텍스트 범위 축소 전략
다중 파일 처리
-
단순한 변환의 경우 여러 파일에 동시 적용 가능
-
채팅 슬라이드를 토글하여 파일/폴더를 컨텍스트로 추가
-
“이 새로운 Page Object를 관련 e2e 파일에 적용해줘” 같은 프롬프트 사용
핵심 단계
-
편집할 관련 파일 찾기
-
편집할 관련 라인 찾기
-
Page Object 클래스의 적용 가능한 메서드나 속성으로 라인 리팩토링
리소스/토큰 효율성
-
“컨텍스트 추가” 옵션 활용으로 더 적은 리소스/토큰 사용
-
기본적으로 열린 파일들이 컨텍스트에 포함됨
-
관련 테스트 및 Page Object 파일/폴더 지정으로 수동 범위 축소
-
실수 확률 대폭 감소
모델 학습 효과
-
테스트 리팩토링 방식을 모델에 지속적으로 학습시키는 효과
-
처음에는 작은 실수가 있을 수 있으나, 적절한 컨텍스트/범위 축소로 반복 작업에서 매우 우수한 성능
자동 완성 기능
핵심 특징
-
이전 액션을 기반으로 다음 라인 예측
-
클래스 구성 시 복사/붙여넱기 작업 우회 가능
-
절대적인 도움이 되는 기능
실제 사용 사례
1. 언어 변환 (Python → TypeScript)
방법
-
인라인 챗봇:
Ctrl+I
로 실행 -
별도 챗봇 창 사용 가능
-
대상 코드 하이라이트 후 간단한 프롬프트 입력
프로세스
-
자동 변환 실행
-
검토 및 변경사항 승인 (매우 중요)
-
정확성 확인 필수 - 철자 오류나 구두점 누락 가능성
2. Page Object Model 변환
초기 설정
-
Page Object와 기능 템플릿 설정 프롬프트 사용
-
지정된 파일과 폴더에 기본 Page Object와 fixtures 생성
-
챗봇에서 코드 생성 후 코드베이스에 파일 생성 허용
반복 코드 식별
-
핵심 프롬프트: “이 파일들에서 반복되는 코드를 식별하고 헬퍼 메서드를 제안해줘”
-
주로 엘리먼트 가시성 체크가 반복됨
-
테스트 길이 즉시 단축
-
일반적으로 사용되는 단계 강조로 Page Object Model 메서드 구성에 도움
페이지 분할 전략
-
TCSE를 다중 페이지 애플리케이션이 아닌 여러 섹션으로 분할
-
섹션 객체 형태로 페이지 분할
리팩토링 프로세스
-
테스트의 로케이터를 Page Object에 수동 매칭
-
Page Object 파일과 e2e 스펙 파일을 컨텍스트로 추가
-
핵심 프롬프트: “이 Page Object의 속성과 메서드를 기반으로 첨부된 e2e 스펙 파일을 리팩토링해줘”
리팩토링 예시
Page Object 코드
this.numberOfServers = page.getByLabel('Number of Servers:');
async selectNumberOfServers(text: string) {
await this.numberOfServers.click();
await this.numberOfServers.fill(text);
}
원본 e2e 테스트
await page.getByLabel('Number of Servers').click();
await page.getByLabel('Number of Servers').fill('20');
리팩토링 결과
await onPremSection.selectNumberOfServers('20');
실용적인 팁과 주의사항
컨텍스트 관리
-
더 타이트한 컨텍스트에서 매우 잘 작동
-
예: 한 번에 하나의 e2e 테스트 리팩토링
-
17개 테스트를 모두 한 번에 리팩토링하면 더 많은 실수 발생
명시적 프롬프팅의 중요성
-
Copilot은 코드베이스 컨텍스트는 알지만 현재 수행 중인 작업은 모름
-
매우 명시적인 프롬프트가 전체적으로 훨씬 나은 성능 제공
프롬프트 비교
-
모호함: “이 파일들을 적절히 리팩토링해줘”
-
명시적: “이 Page Object에 속성과 메서드를 추출했으니, 첨부된 e2e 스펙 파일을 적절히 리팩토링해줘”
검증 필수
-
자동 변환 후 반드시 검토 과정 필요
-
철자 오류, 구두점 누락 등 정확성 확인 중요
결론
핵심 가치
-
시간 소모적인 작업에 매우 유용한 도구
-
자동화 업데이트가 필요하면서 동시에 테스트해야 할 작업 항목이 있는 상황에서 매우 효율적
성공 요인
-
타이트한 컨텍스트 유지
-
명시적이고 구체적인 프롬프팅
-
단계별 접근 (한 번에 하나씩)
-
지속적인 검토와 검증
최종 권장사항
-
코드베이스 컨텍스트 활용은 뛰어나지만 현재 작업에 대한 명시적 설명 필수
-
반복적인 대규모 리팩토링 작업에서 탁월한 성능 발휘
-
적절한 범위 설정과 명확한 지시사항이 성공의 핵심