본문으로 건너뛰기

Rails 애플리케이션에서 Cucumber를 활용한 지속 가능한 기능 테스트

Sustainable Feature Testing in Rails with Cucumber

작성자
Rails Upgrade News
발행일
2025년 12월 18일

핵심 요약

  • 1 Cucumber는 Gherkin 문법을 사용하여 비기술인도 이해할 수 있는 평이한 언어로 테스트 시나리오를 작성하게 하여, RSpec+Capybara 대비 가독성과 협업 효율성을 크게 향상시킵니다.
  • 2 Cucumber는 Capybara, Cuprite, FactoryBot, Devise 등 기존 Rails 테스트 스택과 쉽게 통합되며, 데이터 테이블, 헬퍼 메서드 등을 통해 복잡한 시나리오와 데이터 설정을 간결하게 관리할 수 있습니다.
  • 3 기능 테스트의 디버깅을 위해 VISIBLE_BROWSER 환경 변수와 debugger를 활용하고, CI/CD 파이프라인에 스크린샷 자동 저장 기능을 추가하여 실패 시 신속한 문제 파악 및 회귀 방지를 지원합니다.

도입

오랜 기간 운영된 웹 애플리케이션은 사용자 관점에서의 엔드-투-엔드 테스트가 필수적입니다. RSpec과 Capybara 같은 도구로 시스템 테스트를 작성할 수 있지만, 프로젝트가 커질수록 테스트 코드가 복잡해지고 가독성이 떨어져 유지보수가 어려워지는 경향이 있습니다. 이러한 문제에 대한 해결책으로 Cucumber가 제시됩니다. Cucumber는 고수준의 의도를 저수준의 구현으로부터 분리하여, 개발자와 비기술 직군 모두가 쉽게 이해할 수 있는 평이한 언어로 테스트를 작성할 수 있도록 돕습니다. 본 글에서는 데모 Rails 앱인 'Book Review Demo'를 통해 Cucumber가 테스트 스위트의 가독성과 유지보수성을 어떻게 향상시키는지 구체적인 예시와 함께 설명합니다.

Cucumber 개요 및 장점

Cucumber는 애플리케이션 동작을 평이한 언어로 기술할 수 있게 하는 테스트 도구입니다. Selenium WebDriver와 달리 브라우저 자동화 스택 위에 위치하여, Gherkin 문법(Feature, Background, Scenario, Given, When, Then)을 사용하여 사용자 중심의 행동을 묘사합니다. 각 스텝은 실제 테스트 로직을 수행하는 Ruby 코드에 매핑됩니다. 이는 비기술 직군도 테스트 내용을 쉽게 이해할 수 있게 하며, RSpec+Capybara만 사용하는 경우보다 ‘무엇을’ 테스트하는지에 대한 의도를 명확히 드러냅니다.

Cucumber 환경 설정

기존 Rails 프로젝트에 Cucumber를 설정하는 과정은 다음과 같습니다.

  • Gemfile 업데이트: capybara, cuprite, cucumber-rails, database_cleaner 등을 :test 그룹에 추가합니다. Cuprite는 Selenium WebDriver 대신 사용되는 headless 브라우저 드라이버입니다.

  • 설치 및 초기화: bundle installbin/rails generate cucumber:install 명령어를 실행하여 features/ 디렉토리 구조를 생성합니다.

  • 드라이버 설정: features/support/cuprite.rb에서 Capybara의 기본 드라이버를 Cuprite로 설정하고, headless 모드, 윈도우 크기 등을 구성합니다.

  • 데이터 클리너: features/support/database_cleaner.rb에서 DatabaseCleaner.strategy = :truncation을 설정하여 각 테스트 간 데이터 상태를 깨끗하게 유지합니다.

  • FactoryBot 통합: features/support/factory_bot.rbWorld(FactoryBot::Syntax::Methods)를 추가하여 스텝 정의에서 FactoryBot 메서드를 직접 사용할 수 있게 합니다.

  • Fast Login: Devise를 사용하는 경우 features/support/warden.rb를 통해 Warden 테스트 헬퍼를 설정하여 로그인 과정을 UI 상호작용 없이 빠르게 처리합니다.

  • 보고서 서비스 비활성화: config/cucumber.yml에서 --publish-quiet 옵션을 추가하여 불필요한 보고서 발행 메시지를 숨깁니다.

기능 테스트 작성 및 관리

Cucumber는 authentication.feature와 같은 .feature 파일에 시나리오를 정의하고, step_definitions/ 디렉토리 내 .rb 파일에 각 스텝에 대한 Ruby 코드를 구현합니다.

  • 데이터 테이블 활용: Given the following books exist:와 같이 데이터 테이블을 사용하여 여러 레코드의 테스트 데이터를 한 번에 생성하고 관리할 수 있어 시나리오의 가독성과 유지보수성을 높입니다.

  • 헬퍼 메서드: features/support/review_helpers.rb와 같이 사용자 정의 헬퍼 모듈을 만들어 World에 포함시키면 스텝 정의 간 코드 중복을 줄일 수 있습니다.

  • 스텝 정의 구성: authentication_steps.rb, book_steps.rb, review_steps.rb와 같이 도메인 개념별로 스텝 파일을 분리하고, common_steps.rbWhen("I click {string}")과 같은 공통 스텝을 모아 관리하는 것이 좋습니다.

디버깅 및 CI/CD 통합

  • 디버깅: VISIBLE_BROWSER=true bundle exec cucumber 명령어로 브라우저를 가시 모드로 실행하고, debugger 키워드를 스텝 정의에 삽입하여 특정 지점에서 테스트를 일시 정지시켜 UI 상태를 직접 확인할 수 있습니다.

  • 스크린샷 자동 저장: features/support/hooks.rb 파일에 After 훅을 설정하여 테스트 실패 시 자동으로 스크린샷을 캡처하고, 시나리오 정보를 포함한 의미 있는 파일명으로 저장하여 디버깅에 활용합니다.

  • CI/CD 통합: GitHub Actions와 같은 CI 파이프라인에 Cucumber 테스트를 포함하여 코드 푸시 시 자동으로 테스트를 실행하고, 실패 시 스크린샷 아티팩트를 업로드하여 신속하게 문제를 파악하고 회귀를 방지합니다.

결론

Cucumber는 복잡한 사용자 흐름을 테스트하는 데 있어 구조와 명확성을 제공하는 강력한 도구입니다. 이는 테스트 코드를 구현 세부 사항이 아닌 행동에 초점을 맞추게 하여, 개발자와 비기술 직군 간의 협업을 촉진하고 테스트 스위트의 가독성과 유지보수성을 크게 향상시킵니다. Capybara와 같은 브라우저 자동화 도구, 그리고 CI/CD 파이프라인과 결합될 때 Cucumber는 사용자 경험에 영향을 미치는 회귀를 사전에 방지하는 데 필수적인 역할을 수행합니다. 올바른 설정과 체계적인 스텝 정의 관리는 Cucumber를 활용한 지속 가능한 기능 테스트 전략의 핵심이며, 이는 장기적인 프로젝트 성공에 기여할 것입니다.

댓글0

댓글 작성

댓글 삭제 시 비밀번호가 필요합니다.

이미 계정이 있으신가요? 로그인 후 댓글을 작성하세요.

0/1000
정중하고 건설적인 댓글을 작성해 주세요.