자체 제작 된 Rails 플러그인 Gem을 여러 버전 환경에서 자동 테스트

자체 제작된 Rails 플러그인을 Gem으로 게시할 때 여러 버전의 Rails를 지원하고 싶을 수 있습니다. 이러한 경우에는, 지원하는 Ruby나 Rails등 의존 Gem의 버젼을 조합해, 복수 환경에서의 테스트를 자동화할 수가 있습니다. 그 방법을 정리합니다.

Travis CI



CI에는 여러 가지 유형이 있지만 Travis CI을 사용하면 설정만으로 여러 Ruby 및 Gem 버전을 결합하여 테스트를 자동화 할 수 있습니다. Travis CI의 기본적인 사용법이나 Github 리포지토리와의 연계 방법 등에 대해서는 많은 정보가 있으므로 여기에서는 생략합니다.

여러 Ruby 버전에서 테스트


.travis.ymlrvm에서 대상 Ruby 버전을 정의합니다.

travis.yml
rvm:
  - 2.1.10
  - 2.2.7
  - 2.3.4
  - ruby-head

matrix:
  # ruby-headはテストの失敗を許容する
  allow_failures:
    - rvm: ruby-head

위의 예에서는 Ruby의 2.1계, 2.2계, 2.3계를 테스트의 대상으로 하고 있습니다. ruby-head는 개발중인 Ruby 버전이므로 테스트가 실패하는 경우가 있습니다. 따라서 allow_failures 실패를 허용합니다.

여러 종속 Gem 버전에서 테스트



예를 들어 여러 Rails 버전을 테스트 대상으로 합니다.
먼저 Gem이 지원하는 버전을 정의한 gemspec 파일과 종속 Gem 버전마다 Gem 파일을 준비합니다.

mygem.gemspec
  # Rubyのバージョンを指定する
  s.required_ruby_version = '>= 2.1.0'

  # Gemに本当に必要なモジュールのみをgemspecに記述する
  s.add_dependency 'railties', '>= 4.2.0', '< 5.1'
  s.add_dependency 'activerecord', '>= 4.2.0'

gemfiles/Gemfile.rails-5.0
source 'https://rubygems.org'
gemspec path: '../'
gem 'rails', '~> 5.0.0'

gemfiles/Gemfile.rails-4.2
source 'https://rubygems.org'
gemspec path: '../'
gem 'rails', '~> 4.2.0'

그런 다음 .travis.ymlgemfile에 대상 Gem 파일을 정의합니다.

travis.yml
gemfile:
  - Gemfile
  - gemfiles/Gemfile.rails-5.0
  - gemfiles/Gemfile.rails-4.2

matrix:
  exclude:
    - rvm: 2.1.10
      gemfile: gemfiles/Gemfile.rails-5.0

위의 예에서는 Rails의 4.2계와 5.0계를 테스트의 대상으로 하고 있습니다. Rails5.0은 Ruby2.2계 이상에 의존하기 때문에 exclude 에 의해 Ruby2.1계와 Rails5.0계의 조합을 테스트 대상에서 제외하고 있습니다.

로컬 테스트



Gem 버전에 의존하는 처리를 개발할 때는 로컬 개발 환경에서도 여러 버전의 테스트가 통과하는지 확인해야 합니다. 이 때 환경 변수에 Gem 파일을 지정하여 테스트를 실행할 수 있습니다.
※이하는 테스트에 RSpec를 사용하고 있는 경우의 예입니다. 적당히 읽어 주세요.
# Rails 5.0でのテスト
BUNDLE_GEMFILE=gemfiles/Gemfile.rails-5.0 bundle exec rspec
# Rails 4.2でのテスト
BUNDLE_GEMFILE=gemfiles/Gemfile.rails-4.2 bundle exec rspec

여러 환경 변수(ORM 등)에서의 테스트


ActiveRecordMongoid와 같은 여러 ORM을 지원하는 Gem은 각 ORM에 대해 테스트를 돌릴 수 있습니다. 이 경우 .travis.ymlenv에 환경 변수를 설정하여 테스트 환경을 정의합니다.

travis.yml
env:
  - MYGEM_ORM=active_record
  - MYGEM_ORM =mongoid

matrix:
  exclude:
    - env: MYGEM_ORM =mongoid
      gemfile: Gemfile

services:
  - mongodb

테스트 코드에서 환경 변수에 따라 Gem에 ORM을 env로 설정합니다. rvmgemfile와 마찬가지로 Matrix에서 조건 조합을 정의할 수 있습니다. 응용 프로그램 내에서 환경 변수 MYGEM_ORM에 따라 사용할 ORM을 전환하는 프로세스가 필요합니다. .travis.ymlservicesmongodb 라고 기술하면 CI 상에서 MongoDB 를 사용할 수 있게 됩니다.

테스트 결과



최종적으로 기술되는 .travis.yml 는 다음과 같이 됩니다.

travis.yml
language: ruby

rvm:
  - 2.1.10
  - 2.2.7
  - 2.3.4
  - ruby-head

gemfile:
  - Gemfile
  - gemfiles/Gemfile.rails-5.0
  - gemfiles/Gemfile.rails-4.2

env:
  - MYGEM_ORM=active_record
  - MYGEM_ORM=mongoid

matrix:
  exclude:
    - rvm: 2.1.10
      gemfile: gemfiles/Gemfile.rails-5.0
    - rvm: 2.1.10
      gemfile: Gemfile
    - env: MYGEM_ORM=mongoid
      gemfile: Gemfile
  allow_failures:
    - rvm: ruby-head
  fast_finish: true

services:
  - mongodb

# 中略

script: bundle exec rspec

소스 코드가 Github 리포지토리에 푸시되면 Travis CI에서 여러 환경에서 자동으로 테스트가 실행됩니다.

좋은 웹페이지 즐겨찾기