Rails4.2에서 SystemTestCase(시스템 스펙) 사용

13644 단어 Rails
"Rails 4.2에 소모된 너에게, 나에게..."

SystemTestCase 오류 사용 방법


Rails5.1에서 가져온 SystemTestCase는 E2E 테스트를 위한 것으로 간주되기 쉽다
위조 코드
describe 'jQueryがふんだんに使われた検索結果ページ' do
  before {
    FactoryBot.create(:job_offer, title: '優良案件です')
    FactoryBot.create(:job_offer, title: 'かせげるよ♪')
    JobOffer.__elaseicsearch__.import
  }

  context 'AI判定がOFFのとき' do
    before {
      allow_any_instance_of(IntelligentFilter).to receive(:filter).and_return(false)
    }

    it '検索結果ページに2件とも仕事が表示されること' do
      visit '/job_offers/search'

      find("li.search_result", wait: 2) # 検索結果がJSで非同期描画されるまで待つ

      expect(page).to have_content("優良案件です")
      expect(page).to have_content("かせげるよ♪")
    end
  end

  context 'AI判定で怪しい仕事が弾かれるとき' do
    before {
      allow_any_instance_of(IntelligentFilter).to receive(:filter) do |instance, job_offer|
        job_offer.title.include?("♪") # 音符を含んでいる仕事は弾く
      end
    }

    it '検索結果ページに優良案件だけが表示されること' do
      visit '/job_offers/search'

      find("li.search_result", wait: 2) # 検索結果がJSで非同期描画されるまで待つ

      expect(page).to have_content("優良案件です")
      expect(page).not_to have_content("かせげるよ♪")
    end
  end
end
위에서 말한 바와 같다
  • FactoryBot로 위조 데이터 제작
  • rspec-mock을 사용하여 모듈화
  • 동시에 JS의 전체 동작을 테스트할 수 있는 화면(뒷면에서 크롬과 Firefox의 테스트).
    분명히 이상한 사용법이지만'jQuery를 이용한 복잡한 화면을 대량으로 쓰는 테스트...'이럴 때 유용하다.

    이런 일이 있었죠?


    예를 들어 로그인한 후의 행동을 보고 싶은 웹 페이지가 있다고 가정해 보세요.
    def login(username, password)
      fill_in("username", with: username)
      fill_in("password", with: password)
      find('#login').click
    end
    
    예를 들어 상기 로그인의 보조 방법을 만들어 망라 모드의 테스트를 작성한다.
    시험의 관심사는 로그인 후의 행동, 로그인 화면의 DOM 구조가 바뀔 때 모든 스펙이 동시에 떨어진다.
    로그인 브랜치
    
      context '非ログイン状態でアクセス' do
        before {
          allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(nil)
        }
    
        # いろいろ試験
      end
    
      context 'ログイン状態でログインしてアクセス' do
        let(:current_user) { FactoryBot.create(:user) }
        before {
          allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(current_user)
        }
    
        # いろいろ試験
      end
    
      context '仕事管理者でログインしてアクセス' do
        let(:admin_user) { FactoryBot.create(:admin_user) }
        before {
          allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(admin_user)
        }
    
        # いろいろ試験
      end
    
      context '退会済みユーザでログインしてアクセス' do
        let(:inactivated_user) { FactoryBot.create(:user, :inactivated) }
        before {
          allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(inactivated_user)
        }
    
        # いろいろ試験
      end
    
    
    "어떤 로그인 화면이든 어쨌든 로그인만 하면 돼!"이런 상황에서 위와 같이 모듈화하면 시험이 압도적으로 효율적이고 쉽게 망가지지 않는 시험이다.
    이렇게
  • FactoryBot을 사용하여 다양한 패턴의 데이터를 모두 이야기대로 쓸 필요가 없음
  • 단일 테스트에서 품질을 보증할 수 있는 곳은 적극적인 모듈화를 통해 테스트 범위의 테스트를 작성할 수 있다
  • 그게 좋아요.

    하지만 SystemTestCase는 Rails5.1부터 사용할 수 있습니다.


    Rails6가 곧 발매되는 현재에도 Rails4 계열을 사용하는 회사가 적지 않다.
    • 패러다임이 많아 수동 테스트가 까다로움
    · 그렇지만 JS가 많이 사용되어 Spec을 쓸 수 없습니다
    이런 갈등이 격투하고 있겠지.
    → Rails5.1이면 SystemTestCase에 맛있는 음식 Spec을 써도 되나요?
    →하지만 Rails4→5를 업데이트하려면 시험이 필요한데...

    SystemTestCase는 Rails4로 후퇴할 수 없습니까??


    결론적으로 말하면 대충 괜찮다.
    완전히 이식할 수는 없지만 적절한 활동 상태를 유지할 수 있다.

  • https://github.com/rails/rails/pull/26703: SystemTestCase 등의 정의

  • https://github.com/rails/rails/pull/28083: Rspec 및 Rails 서버를 통해 DB 연결을 공유하는 스레드
  • 만약 이 두 포트를 Rails4.2(Monky 패치)로 되돌릴 수 있다면, Rails4.2에서 시스템 스펙도 이동할 수 있습니다.

    해봤어요.



    https://bitbucket.org/iwaki-i3/rails4_rspec_system_spec_mock_playground/src/master/backported_system_test_case/

    SystemTestCase 등의 정의


    참조https://github.com/rails/rails/pull/26703
    |- action_dispatch
        |- system_test_case.rb
        |- system_testing/
    
    Rails5.2 이후의 소스 파일을 복사합니다.

    Rspec 및 Rails 서버로 DB 연결 스레드 공유


    https://github.com/rails/rails/pull/28083 Rails4.2 코드를 기반으로 Monkey 패치를 제작하여 채웁니다.
    글씨가 좀 못생겼지만 이런 느낌.
    https://bitbucket.org/iwaki-i3/rails4_rspec_system_spec_mock_playground/src/master/backported_system_test_case/lib/backported_system_test_case/active_record_monkey_patching.rb

    로컬 Gem으로 가져오기

    bundle gem backported_system_test_case 에서 Gem의 템플릿을 제작한 위치에서 이전 SystemTestCase 클래스의 파일과 Monky 패치를 넣습니다.
    서비스 본체의 Gemfile
    Gemfile
    
    group :test do
     # 〜いろいろ〜
      gem 'backported_system_test_case', path: 'backported_system_test_case' # 追記
    end
    
    
    이렇게 줄을 추가합니다. 

    총결산


    "JQuery를 많이 사용해서 시험을 못 써..."이런 상황에서 시스템티스트케이스를 강제로 후퇴시키고 시험을 효율적으로 써서 안심감을 가지고 일찌감치 Rails5, Rails6로 높여보자.

    좋은 웹페이지 즐겨찾기