Rails 테스트 설정

20929 단어 testingrubyrails
테스트를 위해 Rails 프로젝트를 설정하는 방법은 무엇입니까?본고에서 우리는 RSpec와 다른 도구를 사용하는 테스트 세트가 무엇인지 탐색하여 강력한 개발자 체험을 얻을 것이다.본고는 나의 테스트 도구 방법을 토론했다. 왜냐하면 나는 줄곧 RSpec를 배우는 데 전념했기 때문이다.
야, code 가져와.

기본 항목 설정.


우선, 레일스 프로젝트를 시작해야 합니다.우리는 기본 -T 대신 RSpec를 선택하기 때문에 minitest 스위치를 사용하여 테스트를 배제할 것입니다.우리의 데이터베이스도 기본적으로 Postgres입니다.이것은 필수적인 것이 아니라 단지 나의 선호일 뿐이다.
rails new rails_testing_setup -T --database=postgresql
데이터베이스 생성 및 마이그레이션
rails db:prepare && rails db:migrate
rails server을 시작하고 익숙한 Rails 시작 화면을 볼 수 있습니다.

기본 테스트


테스트를 구축하기 위해 RSpec를 사용할 것입니다. RSpec 사이트에 따르면 "루비의 행위 구동 개발. TDD를 효율적이고 재미있게 합니다."나는 이 모든 것을 확신하지 못하지만, 이것은 우리가 설정하고 있는 것이다.
기본 RSpec 설정
우리는 개발 및 테스트 그룹에 당신의 Gemfile에 두 개의 GEM, RSpec와 Capybara를 추가할 것입니다. 이것은 실제 사용자가 당신의 응용 프로그램과 어떻게 상호작용하는지 모의하여 웹 응용 프로그램을 테스트하는 데 도움이 됩니다.
group :development, :test do
  ...
  gem "capybara", ">= 2.15"
  gem "rspec-rails"
  ...
end
rails 설정에서 테스트 프레임워크를 제외하는 것을 잊어버리면 test 디렉터리를 삭제하십시오.이것은 어떠한 피해도 주지 않지만, 두 개의 테스트 디렉터리를 포함하지 않는 것이 가장 좋다.그런 다음 RSpec: rails g rspec:install을 설정합니다.이것은 spec 디렉터리와 몇 개의 조수 파일을 설치할 것입니다.
이제 rails_helper.rb 파일에 설정을 추가하고 정리해야 합니다.나는 모든 평론을 지우기 시작했지만, 그것은 단지 나였다.그리고 RSpec.configuration 블록을 업데이트합니다.
RSpec.configure do |config|
  config.use_transactional_fixtures = true
  config.infer_spec_type_from_file_location!
  config.filter_rails_from_backtrace!
end
rails for capybara 아래의 파일 맨 위에 require을 추가합니다.
require "rspec/rails"
require "capybara/rails"
만약 네가 rspec을 운행한다면, 모든 것은 녹색이어야 한다. 왜냐하면 우리는 테스트를 하지 않았기 때문이다.
데이터베이스 청소기는 테스트 데이터베이스가 깨끗하다는 것을 확보하고 싶습니다. 따라서gemdatabase_cleaner을 개발과 테스트 그룹에 추가해야 합니다. 지금은 이렇게 보일 것입니다.
group :development, :test do
  gem 'byebug', platforms: %i[mri mingw x64_mingw]
  gem "capybara", ">= 2.15"
  gem 'database_cleaner'
  gem 'rspec-rails'
end
bundle install을 실행하고 rails\u 지원을 구성합니다.rb 다시:
RSpec.configure do |config|
  config.use_transactional_fixtures = true
  config.before(:suite) { DatabaseCleaner.clean_with(:truncation) }
  config.before(:each) { DatabaseCleaner.strategy = :transaction }
  config.before(:each, js: true) { DatabaseCleaner.strategy = :truncation }
  config.before(:each) { DatabaseCleaner.start }
  config.before(:each) { DatabaseCleaner.clean }
  config.infer_spec_type_from_file_location!
  config.filter_rails_from_backtrace!
end
만약 네가 rspec을 운행한다면, 모든 것은 녹색이어야 한다. 왜냐하면 우리는 테스트를 하지 않았기 때문이다.
공장.
따라서 공장은 하나의 장치 대체품으로 간단한 정의 문법을 가지고 다양한 구축 정책(저장된 실례, 저장되지 않은 실례, 속성 해시와 메모리 대상)을 지원하며 같은 종류의 여러 공장(사용자, 관리자 사용자 등)을 지원하는데 공장 계승을 포함한다.
Factory Girl을 대체하기 위해 Factory Bot의 Rails 버전을 설치합니다.따라서 우리는 gmfactory_bot_rails을 개발과 테스트 그룹에 추가해야 한다. 지금은 이렇게 보일 것이다.
group :development, :test do
  gem 'byebug', platforms: %i[mri mingw x64_mingw]
  gem 'database_cleaner'
  gem "factory_bot_rails", git: "http://github.com/thoughtbot/factory_bot_rails"
  gem 'rspec-rails'
end
bundle install을 실행합니다.만약 네가 rspec을 운행한다면, 모든 것은 녹색이어야 한다. 왜냐하면 우리는 테스트를 하지 않았기 때문이다.

테스트 추가


테스트를 추가하겠습니다.진정한 테스트 드라이브 개발에서, 우리는 홈페이지를 보여주는 루트 경로를 검사하기 위한 테스트를 만들 것이다.우리는 특성 테스트를 만들 것이다.RSpec는 일련의 생성기를 제공합니다. 특징 생성기를 사용합니다. features 디렉터리와 저희가 명명한 테스트를 만들 것입니다.
rails g rspec:feature static
사용자가 /에서 정적 페이지에 접근하는 것을 모의하는 기능 테스트를 만들 것입니다.고맙습니다. capybara 때문입니다.static_spec.rb 편집:
require 'rails_helper'

RSpec.feature 'Statics', type: :feature do
  scenario do
    visit "/"

    expect(page.status_code).to eq(200)
  end
end
이 테스트는 홈 페이지에 사용할 컨트롤러가 필요하기 때문에 실패할 것이다.프로젝트의 다른 정적 페이지에 사용할 정적 컨트롤러를 만듭니다.규정 home을 통해 컨트롤러 방법과 홈 보기를 생성합니다.
rails g controller static home
불행하게도, 테스트는 여전히 실패할 것이다. 왜냐하면 우리는 config/routes.rb에서 지정한 루트가 없기 때문이다.다음을 추가합니다.
root 'static#home'
현재 우리의 테스트는 녹색이고 통과되었다.

자동화 테스트


지금까지 우리는 완전히 받아들일 수 있는 테스트 환경을 가지고 있다.그러나 나는 테스트를 자동화하고 싶다. 이렇게 하면 우리는 rspec 명령을 실행할 필요가 없다.
경비원guard-rspec이라는 gem를 사용합니다. 스펙 파일을 자동으로 실행합니다.개발팀에 gem 파일 몇 개를 추가합니다.
group :development do
  gem 'guard'
  gem 'guard-rspec'
  gem 'listen', '~> 3.2'
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
  gem 'web-console', '>= 3.3.0'
end
Guard을 초기화해야 합니다. 이것은 프로필을 만들 것입니다. bundle exec guard init.새로 만든 Guardfile을 변경해야 합니다.Linux 시스템에 libnotify을 설정했습니다. guard가 테스트 세트를 실행할 때마다 팝업된 시스템 알림을 받습니다.업데이트, 이메일 알림 등 다른 시스템 작업을 좋아할 수도 있지만, 규범 파일을 편집할 때마다 이 팝업 알림을 볼 수 있어서 미치겠어요.따라서 Guardfile의 끝에 다음 내용을 추가하여 Guard의 알림을 중지합니다. notification: off.
진행 상태 보고기
또 다른 내가 좋아하는 기능.minitest을 공부할 때 저는 minitest_reporter이 제공하는 더욱 뚜렷한 진도표를 좋아합니다.우리는 fuubar이라는 보석을 통해 같은 기능을 누릴 수 있다.
개발팀에 gem을 추가합니다.
group :development do
  bem 'fuubar'
  gem 'guard'
  gem 'guard-rspec'
  gem 'listen', '~> 3.2'
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
  gem 'web-console', '>= 3.3.0'
end
require 'fuubar' 파일의 맨 위에 rails_helper.rb 파일을 추가하고 구성 블록에 추가해야 합니다.
RSpec.configure do |config|
  config.use_transactional_fixtures = true
  config.before(:suite) { DatabaseCleaner.clean_with(:truncation) }
  config.before(:each) { DatabaseCleaner.strategy = :transaction }
  config.before(:each, js: true) { DatabaseCleaner.strategy = :truncation }
  config.before(:each) { DatabaseCleaner.start }
  config.before(:each) { DatabaseCleaner.clean }
  config.infer_spec_type_from_file_location!
  config.filter_rails_from_backtrace!
  config.fuubar_progress_bar_options = { format: 'Completed Tests <%B> %p%% %a' }
end
진도표 옵션은 사용자의 취향에 따라 설정할 수 있습니다..rspec 파일 편집:
--require spec_helper
--format Fuubar
--color
그렇다면 그것은 어떻게 일을 합니까?
  • 시동 보호: bundle exec guard
  • 레벨 라이브러리 파일을 편집하면,guard는rspec로 편집하고 있는 파일을 자동으로 실행합니다.
  • 전체 테스트 세트를 실행하려면 명령 프롬프트에서 enter를 누르십시오.
  • 포바가 좋은 진도표를 대체할 것이다.

  • 주의, 우리는 테스트를 통과했습니다. 진도표는 완성된 테스트로 기록되었고, fuubar 설정에서 이 테스트를 정의했습니다.

    코드 덮어쓰기


    다음은 simplecov의gem로 코드 커버율을 추가하고 싶습니다.simplecov의 자술 파일에 따라:

    SimpleCov is a code coverage analysis tool for Ruby. It uses Ruby's built-in Coverage library to gather code coverage data, but makes processing its results much easier by providing a clean API to filter, group, merge, format, and display those results, giving you a complete code coverage suite that can be set up with just a couple lines of code. SimpleCov/Coverage track covered ruby code, gathering coverage for common templating solutions like erb, slim and haml is not supported.


    설정이 간단합니다.gem 파일에서 테스트 그룹에 새 gem을 추가했습니다.
    group :test do
      gem 'selenium-webdriver'
      gem 'simplecov', require: false
      gem 'webdrivers'
    end
    
    spec_helper.rb 파일의 맨 위에 다음 내용을 추가합니다.
    require 'simplecov'
    SimpleCov.start
    
    필터를 추가해야 하기 때문에simplecov는 rails_helper.rb을 건너뜁니다.
    작성: .simplecov 및 다음을 추가합니다.
    require 'simplecov'
    
    SimpleCov.start do
      add_filter 'spec/rails_helper.rb'
    end
    
    프로젝트 경로 루트 디렉터리에 저장된 새로운 coverage 디렉터리에 덮어쓰기 보고 경로가 있습니다.이렇게 하면 우리는 코드 커버율을 분석할 수 있다.웹 브라우저에서 열 수 있습니다.

    코드 스타일


    마지막으로, 나는 rubocop을 설치하여 우리의 코드 표시 품질을 관리하고 싶다.세 개의 GEM을 설치하여 개발 그룹에 추가합니다.
    group :development do
      ...
      gem "rubocop"
      gem "rubocop-rails", require: false
      gem "rubocop-rspec"
      ...
    end
    
    IDE/편집기의 확장을 사용하면 Rubocop을 사용하여 일관된 코드 품질에 대한 조언을 얻을 수 있습니다.우리는 당신의 필요에 따라 스타일 대체를 위한 프로필을 만들 수 있습니다.다음은 저의 간단한 구성 .rubocop.yml입니다.
    require:
      - rubocop-rails
      - rubocop-rspec
    
    AllCops:
      Exclude:
        - bin/**/*
        - config/**/*
        - db/schema.rb
        - db/migrate/*.rb
        - node_modules/**/*
        - tmp/**/*
        - vendor/**/*
    
    #################### Bundler ###########################
    
    Bundler/OrderedGems:
      Description: >-
        Gems within groups in the Gemfile should be alphabetically sorted.
      Enabled: true
      ConsiderPunctuation: true
    
    #################### Layout ###########################
    
    Layout/LineLength:
      Description: 'Checks that line length does not exceed the configured limit.'
      AutoCorrect: true # this is false by default
      Exclude:
        - Gemfile
    
    #################### Style ###############################
    
    Style/StringLiterals:
      Description: 'Checks if uses of quotes match the configured preference.'
      StyleGuide: '#consistent-string-literals'
      Enabled: true
      EnforcedStyle: double_quotes
      ConsistentQuotesInMultiline: true
    
    #################### RSpec cops from rubocop-rspec #######
    # https://github.com/rubocop-hq/rubocop-rspec/blob/master/config/default.yml
    
    RSpec/DescribeClass:
      Description: Check that the first argument to the top level describe is a constant.
      Enabled: true
      StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/DescribeClass
      Exclude:
        - 'spec/requests/**/*'
        - 'spec/system/**/*'
        - 'spec/tasks/**/*'
    
    RSpec/ExampleLength:
      Description: Checks for long examples.
      Enabled: true
      Max: 15
      StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/ExampleLength
    
    RSpec/MultipleExpectations:
      Description: Checks if examples contain too many `expect` calls.
      Enabled: true
      Max: 8
      StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/MultipleExpectations
    
    이것은 내가 나의 모든 보조 프로젝트에 사용하기 시작한 테스트 프레임워크 설정이다.나는 이것이 어느 정도 다른 사람을 도울 수 있기를 바란다.

    각주


    이것은 매우 재미있다.메시지를 남기거나 DM을 보내주세요.
    파렴치한 플러그인: 만약 당신이 위대한 회사에서 일한다면, 당신은 시장의 소프트웨어 개발자와 각종 기능과 생활 경험을 가지고 저에게 소식을 주고 저를 검사합니다.

    좋은 웹페이지 즐겨찾기