오늘 포스트에서는 Rails 6의 시스템 테스트를 살펴보겠습니다. 시스템 테스트는 사용자 인터페이스의 Javascript를 포함하여 사용자가 애플리케이션과 상호 작용하는 방식을 자동 테스트하기 위한 것입니다. Rails의 기본 테스트 프레임워크인 Minitest는 시스템 테스트에 매우 적합합니다. Rails가 처리하는 모든 구성을 통해 첫 번째 테스트를 시작하고 실행하기 전에 몇 단계만 거치면 됩니다.
시스템 테스트는 Rails 5.1의 Rails 스택에 추가되었습니다. 사용하기 시작했을 때 RSpec에 대한 정보가 아닌 관련 최신 정보를 수집하기가 어려웠습니다. 다음은 Minitest로 시스템 테스트 작업을 하면서 수집한 모든 최신 정보와 가장 뛰어난 정보입니다.
시스템 테스트 소개
Rails 전문 용어에서 시스템 테스트는 "전체 시스템으로 애플리케이션 테스트"를 나타냅니다. 이는 테스트에서 브라우저를 사용하여 수행됩니다. 별도의 부분을 테스트하는 대신 시스템 테스트를 사용하여 JavaScript 부분을 포함하여 사용자가 앱과 상호 작용하는 동안 거치는 것과 같은 전체 '워크플로'를 테스트할 수 있습니다. 실제로는 시스템 테스트가 if 사용자가 버튼을 클릭하면 데이터베이스에 레코드가 생성됩니다. 새 레코드가 화면에 나타나는지 테스트하기만 하면 됩니다. 이러한 종류의 사용자 상호 작용 테스트를 기능 테스트 또는 수락 테스트라고도 합니다. 통합 테스트와 다릅니다. 통합 테스트는 특히 앱의 모든 부분을 함께 테스트하지만 사용자 인터페이스를 통하지 않는 동작을 테스트하기 위한 것입니다.
구성
구성이 너무 간단하여 거의 혼란스럽습니다.
Capybara gem은 브라우저와 상호 작용하는 데 사용됩니다. Capybara를 통해 테스트가 페이지를 방문하고, 양식을 채우고, 링크와 버튼을 클릭하도록 할 수 있습니다. 이전에 Capybara로 작업한 적이 있다면 데이터베이스 정리 전략 및 브라우저 구성과 함께 작동하도록 조정해야 하는 모든 사항을 알고 있을 것입니다. Hooray for Rails 시스템 테스트 설정:즉시 사용 가능한 Capybara와 함께 작동하는 데 필요한 모든 구성을 처리합니다. 따라서 실제 테스트 작성에 집중할 수 있습니다. 기본적으로 Selenium 드라이버를 사용합니다.
문서에서:"기본적으로 ActionDispatch::SystemTestCase는 Chrome 브라우저와 브라우저 크기가 1400x1400인 Selenium 드라이버에 의해 구동됩니다." Selenium 드라이버는 Capybara의 기본 드라이버와 다르며 Javascript와 함께 작동하기 때문에 선택됩니다.
모든 설정은 application_system_test_case.rb
를 통해 사용할 수 있습니다. . 각 테스트 파일에서 이것을 요구하기만 하면 됩니다.
#application_system_test_case.rb (default)
require "test_helper"
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
driven_by :selenium, using: :chrome, screen_size: [1400, 1400]
end
Rails 6으로 새 앱을 생성했다면 이것이 정말로 필요한 전부입니다. 의미:인터넷이 사용자 인터페이스 테스트 또는 RSpec의 기능 테스트를 위해 표시하는 Selenium 드라이버를 설정하는 방법에 대한 모든 조언을 건너뛸 수 있습니다.
기존 앱에서 스캐폴드를 생성하면 application_system_test_case.rb
가 자동으로 생성됩니다. 시스템 테스트에 필요한 모든 것
Eileen Uchitelle이 시스템 테스트를 도입했을 때 FF가 Selenium과 잘 작동하지 않았기 때문에 Firefox보다 Chrome이 선택되었습니다. 이는 이후 버전의 Firefox에서 수정되었습니다. 그래서 다음과 같이 Chrome을 FF로 바꿉니다.
#application_system_test_case.rb (change driver to Firefox)
require "test_helper"
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
driven_by :selenium, using: :firefox, screen_size: [1400, 1400]
end
(처음에는 $ rails db:test:prepare after
를 실행했습니다. 깨끗한 시작을 보장하기 위해 드라이버를 전환하지만 새 테스트 러너도 이를 처리합니다. 테스트를 호출하면 :prepare.
가 자동 실행됩니다. )
Rails 6의 새로운 기능
5.1에서 시스템 테스트가 도입된 이후로 chromedriver-helper gem은 더 이상 사용되지 않습니다. 새로운 Rails 6 앱에서는 webdrivers gem으로 대체되었습니다. Rails 5 앱에서 아직 하지 않았다면 chromedriver-helper를 webdrivers gem으로 교체해야 합니다. webdrivers gem이 있으면 selenium-webdriver gem도 필요하지 않습니다. webdrivers는 그것도 처리합니다. 재미있는 사실:Rails 6은 selenium-webdriver gem과 webdrivers gem을 모두 제공합니다.
온전성 검사:더 이상 필요하지 않은 것
Capybara를 설정하는 것은 고통스러웠습니다. 올바른 데이터베이스 정리 전략 찾기, capybara-webkit gem의 종속성 및 테스트 작성을 시작하기 전에 파악해야 하는 모든 종류의 예기치 않은 요구 사항을 포함하여 처음부터 설정하는 데 필요한 것이 명확하지 않았습니다. 이제 Rails가 우리가 필요로 하는 모든 것을 제공하므로 지금은 사용되지 않는 가이드와 문서에서 사용할 수 있는 모든 정보가 혼란스러운 유일한 부분을 찾았습니다. 다음은 지금 무시할 수 있는 몇 가지 사항입니다.
첫째, 미리 요리된 Rails 설정은 minitest-rails-capybara와 같이 테스트와 관련하여 자주 언급되는 더 많은 보석이나 Minitest의 추가 기능(유색 출력, 빠르게 실패하는 테스트 및 한 줄/테스트 실행)을 생략할 수 있음을 의미합니다. 이러한 Minitest 기능은 Rails 5.0에 도입된 테스트 러너에 있습니다.
더 이상 database_cleaner gem이 필요하지 않습니다. Rails가 정리('트랜잭션 테스트')를 수행합니다.
Rails는 Capybara 기본값 대신 Selenium을 사용하기 때문에 capybara-webkit이 필요하지 않으며 Javascript 요소 테스트를 포함하기 위해 추가 작업을 수행할 필요가 없습니다.
Capybara의 save_and_open_screenshot
을 사용할 필요도 없습니다. , Rails는 take_screenshot
을 제공하기 때문에 방법. /tmp
에 스크린샷을 저장합니다. 쉽게 액세스할 수 있도록 테스트 출력에 링크를 제공합니다.
실제 브라우저와 헤드리스 브라우저 중 선택
브라우저에서 실행되는 시스템 테스트를 보고 모든 링크가 클릭되는 방식, 양식이 채워지는 방식 등을 보는 것만으로는 충분하지 않습니다. 하지만 느립니다. 테스트 실행 속도를 높이기 위해 '헤드리스' 브라우저를 사용할 수 있습니다. 즉, 일반 브라우저와 앱에 대한 액세스 권한이 동일하지만 그래픽 사용자 인터페이스가 없는 브라우저입니다. 의미:동일하게 작동하지만 헤드리스 드라이버가 실제 브라우저 창을 열지 않기 때문에 실제로 작동하는 테스트를 볼 수 없습니다.
헤드리스로 전환하고 싶다면 headless_chrome
이 있습니다. 및 headless_firefox
. 이를 사용하려면 한 가지 작은 변경 사항이 필요합니다.
# To change driver to headless_*
#application_system_test_case.rb (change driver to headless_*:)
require "test_helper"
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
driven_by :selenium, using: :headless_firefox
end
참고:Rails 문서와 내가 찾은 여러 기사에서 Poltergeist는 드라이버의 옵션으로 명명되었습니다. Capybara용 - headless - PhantomJS 드라이버로 인기가 있었습니다. PhantomJS는 폐기되었습니다. 따라서 세부 사항에 대해 자세히 설명할 필요가 없습니다. 여기에서 언급한 이유는 Poltergeist와 PhantomJS가 여전히 Rails 문서에 언급되어 있기 때문입니다.
더 많은 사용자 정의를 할 수 있지만 시작하려면 이것만 있으면 됩니다.
테스트 실행
$ rails test
시스템 테스트를 제외한 모든 테스트를 실행합니다. $ rails test:system
을 명시적으로 실행해야 합니다. . (재미있는 사실:$ rails
명령은 항상 bin/rails를 통해 실행됩니다. $ bin/rails
를 입력할 필요가 없습니다. 더 이상.)
- 모든 시스템 테스트 실행:
$ rails test:system
- 특정 파일에서 테스트 실행(여기:users_test.rb)
$ rails test/system/users_test
- ... 또는 하나의 특정 테스트:
$ rails test test/system/users_test.rb:21
- 모든 테스트를 실행하려면:먼저 시스템 테스트를 실행하세요.
$ rails test:system test
참고:옵션 플래그는 test:system
에서 작동하지 않습니다.; -f
와 같은 플래그를 사용하려는 경우 (빠른 실패의 경우) 또는 -v
(자세한 정보의 경우) $ rails test test/system -v -f
사용
테스트 대상(안됨)
시스템 테스트는 단위 테스트를 대체하는 것이 아니라 보완합니다. 행복한 경로를 테스트하고 오류 메시지 또는 리디렉션이 있는 하나의 경로를 테스트합니다. 시스템 테스트는 브라우저의 모든 엣지 케이스를 테스트하기 위한 것이 아닙니다. 주요 기능만 다룹니다.
테스트 대상을 선택할 때 사용자가 앱을 사용하는 방식을 반영하는 테스트할 엔터티를 찾으려고 합니다. 테스트 이름을 지정하기 위해 GitLab의 ROLE_ACTION_test.rb라는 이름 지정 규칙을 차용했는데, 이는 이 접근 방식에 잘 맞습니다. 예:user_shares_card_test.rb
.
일반 도움말 및 요령
- 인증을 위해 Devise를 사용하는 경우 Devise 통합 도우미를 사용하여 테스트 사용자를 로그인 및 로그아웃할 수 있습니다.
include Devise::Test::IntegrationHelpers
추가 테스트 클래스에 추가하거나test_helper.rb
에 추가 모든 테스트에서 사용할 수 있도록 파일을 만듭니다. 이제 사용자를 만들고sign_in(@user)
할 수 있습니다. .setup
에 넣으면 방법을 사용하면 분해 시 사용자를 로그아웃할 필요가 없습니다. Rails는 설정 방법에 있는 내용을 정리합니다. - 양식으로 작업할 때 Rails가
click_on
에 대한 모델 이름 + 필드 이름 및 버튼 유형에서 자동으로 생성하는 ID를 참조하고 싶을 수 있습니다. 에스. (fill_in "user_email"
,click_on :commit
). 그러나 시스템 테스트는 사용자가 실제로 보는 것에 관한 것이기 때문에 화면에서 보이는 요소, 즉 텍스트를 사용하는 것이 합리적입니다. 합리적인 옵션은 i18n 로케일 파일에 참조 키를 갖고 끊임없이 변경되는 리터럴 텍스트 대신 해당 키를 사용하는 것입니다. (fill_in :user_email
). Capybara는 전체 I18n 구문으로만 텍스트를 찾습니다.assert_selector "h1", text: I18n.t("activerecord.models.things")
. - 경로 도우미는 기본적으로 포함됩니다. 일부 라이브러리의 경우 테스트 클래스에 도우미를 포함해야 합니다(예:
include ActionMailer::TestHelper
). ,assert_emails
사용 방법. - 다양한 화면 크기에서 테스트를 실행하기 위해 맞춤 클래스를 만듭니다. 가이드를 확인하세요.
- 스크린샷 기능을 사용하여 문서 및 홍보 자료의 스크린샷을 찍을 수도 있습니다. 스크린캐스트로 만들고 재생 속도를 늦추면 몇 분 안에 제품 동영상이 완성됩니다!
- Rails는 시스템 테스트를 위한 생성기를 제공합니다.
- Minitest in Rails는 Minitest 자체와 약간 다르며 Rails 고유의 메서드와 어설션도 추가합니다. Minitest 문서보다 먼저 Rails 문서를 확인하세요.
저는 시스템 테스트를 재미있게 즐겼고, 무엇보다 바로 사용할 수 있어서 너무 편리했습니다.
결론
이 게시물에서 우리는 Rails가 즉시 제공하는 구성과 추가할 수 있는 최소한의 사용자 정의를 살펴보았습니다. Minitest는 시스템 테스트를 작성하는 데 적합합니다. 몇 가지 팁과 트릭은 첫 번째 시스템 테스트를 시작하고 실행하는 데 도움이 될 것입니다. 그들이 브라우저에서 마법을 부리는 모습을 지켜보세요!