Copilot을 활용하여 테스트 자동화를 빠르게 리팩토링 | Maxwell Nyamunda | Scott Logic


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 파일에 적용해줘” 같은 프롬프트 사용

핵심 단계

  1. 편집할 관련 파일 찾기

  2. 편집할 관련 라인 찾기

  3. Page Object 클래스의 적용 가능한 메서드나 속성으로 라인 리팩토링

리소스/토큰 효율성

  • “컨텍스트 추가” 옵션 활용으로 더 적은 리소스/토큰 사용

  • 기본적으로 열린 파일들이 컨텍스트에 포함됨

  • 관련 테스트 및 Page Object 파일/폴더 지정으로 수동 범위 축소

  • 실수 확률 대폭 감소

모델 학습 효과

  • 테스트 리팩토링 방식을 모델에 지속적으로 학습시키는 효과

  • 처음에는 작은 실수가 있을 수 있으나, 적절한 컨텍스트/범위 축소로 반복 작업에서 매우 우수한 성능

자동 완성 기능

핵심 특징

  • 이전 액션을 기반으로 다음 라인 예측

  • 클래스 구성 시 복사/붙여넱기 작업 우회 가능

  • 절대적인 도움이 되는 기능

실제 사용 사례

1. 언어 변환 (Python → TypeScript)

방법

  • 인라인 챗봇: Ctrl+I로 실행

  • 별도 챗봇 창 사용 가능

  • 대상 코드 하이라이트 후 간단한 프롬프트 입력

프로세스

  1. 자동 변환 실행

  2. 검토 및 변경사항 승인 (매우 중요)

  3. 정확성 확인 필수 - 철자 오류나 구두점 누락 가능성

2. Page Object Model 변환

초기 설정

  • Page Object와 기능 템플릿 설정 프롬프트 사용

  • 지정된 파일과 폴더에 기본 Page Object와 fixtures 생성

  • 챗봇에서 코드 생성 후 코드베이스에 파일 생성 허용

반복 코드 식별

  • 핵심 프롬프트: “이 파일들에서 반복되는 코드를 식별하고 헬퍼 메서드를 제안해줘”

  • 주로 엘리먼트 가시성 체크가 반복됨

  • 테스트 길이 즉시 단축

  • 일반적으로 사용되는 단계 강조로 Page Object Model 메서드 구성에 도움

페이지 분할 전략

  • TCSE를 다중 페이지 애플리케이션이 아닌 여러 섹션으로 분할

  • 섹션 객체 형태로 페이지 분할

리팩토링 프로세스

  1. 테스트의 로케이터를 Page Object에 수동 매칭

  2. Page Object 파일과 e2e 스펙 파일을 컨텍스트로 추가

  3. 핵심 프롬프트: “이 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은 코드베이스 컨텍스트는 알지만 현재 수행 중인 작업은 모름

  • 매우 명시적인 프롬프트가 전체적으로 훨씬 나은 성능 제공

프롬프트 비교

  • :cross_mark: 모호함: “이 파일들을 적절히 리팩토링해줘”

  • :white_check_mark: 명시적: “이 Page Object에 속성과 메서드를 추출했으니, 첨부된 e2e 스펙 파일을 적절히 리팩토링해줘”

검증 필수

  • 자동 변환 후 반드시 검토 과정 필요

  • 철자 오류, 구두점 누락 등 정확성 확인 중요

결론

핵심 가치

  • 시간 소모적인 작업에 매우 유용한 도구

  • 자동화 업데이트가 필요하면서 동시에 테스트해야 할 작업 항목이 있는 상황에서 매우 효율적

성공 요인

  1. 타이트한 컨텍스트 유지

  2. 명시적이고 구체적인 프롬프팅

  3. 단계별 접근 (한 번에 하나씩)

  4. 지속적인 검토와 검증

최종 권장사항

  • 코드베이스 컨텍스트 활용은 뛰어나지만 현재 작업에 대한 명시적 설명 필수

  • 반복적인 대규모 리팩토링 작업에서 탁월한 성능 발휘

  • 적절한 범위 설정명확한 지시사항이 성공의 핵심