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 install후bin/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.rb에World(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.rb에When("I click {string}")과 같은 공통 스텝을 모아 관리하는 것이 좋습니다.
디버깅 및 CI/CD 통합
-
디버깅:
VISIBLE_BROWSER=true bundle exec cucumber명령어로 브라우저를 가시 모드로 실행하고,debugger키워드를 스텝 정의에 삽입하여 특정 지점에서 테스트를 일시 정지시켜 UI 상태를 직접 확인할 수 있습니다. -
스크린샷 자동 저장:
features/support/hooks.rb파일에After훅을 설정하여 테스트 실패 시 자동으로 스크린샷을 캡처하고, 시나리오 정보를 포함한 의미 있는 파일명으로 저장하여 디버깅에 활용합니다. -
CI/CD 통합: GitHub Actions와 같은 CI 파이프라인에 Cucumber 테스트를 포함하여 코드 푸시 시 자동으로 테스트를 실행하고, 실패 시 스크린샷 아티팩트를 업로드하여 신속하게 문제를 파악하고 회귀를 방지합니다.