Minitestを使用したRailsでのシステムテストの開始
今日の投稿では、Rails 6のシステムテストについて説明します。システムテストは、ユーザーインターフェイスのJavascriptを含め、ユーザーがアプリケーションを操作する方法を自動テストすることを目的としています。 RailsのデフォルトのテストフレームワークであるMinitestは、システムテストに最適です。 Railsが処理するすべての構成により、最初のテストを開始して実行する前に必要な手順はわずかです。
Rails5.1のRailsスタックにシステムテストが追加されました。座って使い始めたとき、RSpecに関するものではない、関連性のある最新の情報を収集するのは難しいと感じました。これが、Minitestを使用したシステムテストでの作業で収集した最新かつ最高のものです。
システムテストの概要
Railsの専門用語では、システムテストは「システム全体としてのアプリケーションのテスト」を指します。これは、テストでブラウザを使用して行われます。システムテストを使用して個別のパーツをテストする代わりに、JavaScriptパーツを含め、ユーザーがアプリを操作しているときに実行するのと同じように、「ワークフロー」全体をテストできます。実際には、システムテストで ifをチェックしたくないということです。 ユーザーがボタンをクリックすると、データベースにレコードが作成されます。その新しいレコードが画面に表示されるかどうかをテストするだけです。これらの種類のユーザーインタラクションテストは、機能テストまたは受け入れテストとも呼ばれます。これらは統合テストとは異なります。統合テストは、特にアプリのすべての部分の動作をテストするためのものですが、ユーザーインターフェースを介したものではありません。
構成
構成はとても単純なので、ほとんど混乱します。
カピバラの宝石は、ブラウザとの対話に使用されます。カピバラを通じて、テストでページにアクセスしたり、フォームに入力したり、リンクやボタンをクリックしたりできます。以前にCapybaraを使用したことがある場合は、データベースのクリーニング戦略とブラウザー構成で機能させるために調整する必要があるすべてのことを知っています。 Hooray for the 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.
が自動実行されます。 )
Rails6の新機能
5.1でシステムテストが導入されて以来、chromedriver-helpergemは非推奨になりました。新しいRails6アプリでは、webdriversgemに置き換えられています。 Rails 5アプリでは、まだ行っていない場合は、chromedriver-helperをwebdriversgemに置き換える必要があります。 webdrivers gemがあれば、selenium-webdrivergemも必要ありません。 webdriversもそれを処理します。おもしろい事実:Rails 6は、selenium-webdrivergemとwebdriversgemの両方を提供します。
健全性チェック:もう必要ないもの
カピバラの設置は、かつては苦痛でした。正しいデータベースクリーニング戦略、capybara-webkit gemの依存関係、テストの作成を開始する前に把握する必要のあるあらゆる種類の予期しない要件を見つけるなど、最初からセットアップする必要があるものが明確ではありませんでした。 Railsが必要なものすべてを提供するようになったので、現在廃止されているガイドとドキュメントで利用可能なすべての情報が唯一の紛らわしい部分であることがわかりました。ここに、今無視できることがいくつかあります。
まず、事前に調理されたRailsセットアップは、minitest-rails-capybaraのように、テストに関してよく言及されるgemや、Minitestの追加機能(同じ色の出力、高速で失敗するテスト、1行/テストの実行)を省略できることを意味します。これらのミニテスト機能は、Rails5.0で導入されたテストランナーに含まれています。
database_cleanergemはもう必要ありません。 Railsがクリーンアップを行います(「トランザクションテスト」)。
RailsはCapybaraのデフォルトの代わりにSeleniumを使用するため、capybara-webkitは必要ありません。また、Javascript要素のテストを含めるために追加の作業を行う必要もありません。
Capybaraのsave_and_open_screenshot
を使用する必要はありません。 、Railsがtake_screenshot
を提供しているため 方法。スクリーンショットを/tmp
に保存します 簡単にアクセスできるように、テスト出力にリンクを提供します。
実際のブラウザとヘッドレスブラウザのどちらを選択するか
ブラウザで実行されているシステムテストを十分に見て、すべてのリンクがクリックされているか、フォームに入力されているかなどを確認できません。しかし、時間がかかります。テストの実行を高速化するために、「ヘッドレス」ブラウザーを使用できます。これは、通常のブラウザーと同じようにアプリにアクセスできるブラウザーですが、グラフィカルユーザーインターフェイスはありません。意味:同じように機能しますが、ヘッドレスドライバーは実際のブラウザーウィンドウを開かないため、テストが実際に機能していることはわかりません。
ヘッドレスにしたい場合は、headless_chrome
があります およびheadless_firefox
。それらを使用するには、1つの小さな変更が必要です:
# 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のドキュメントと私が見つけたいくつかの記事では、ドライバーのオプションとしてポルターガイストが指定されていました。以前は、カピバラの-ヘッドレス-PhantomJSドライバーとして人気がありました。 PhantomJSは廃止されました。したがって、詳細に飛び込む必要はありません。ここで言及する理由は、ポルターガイストとPhantomJSがまだRailsのドキュメントで言及されているためです。
実行できるカスタマイズは他にもありますが、開始するには、これが本当に必要なすべてです。
テストの実行
$ rails test
システムテストを除くすべてのテストを実行します。 $ rails test:system
を明示的に実行する必要があります 。 (おもしろい事実:$ rails
コマンドは常にbin/railsを介して実行されます。 $ bin/rails
と入力する必要はありません もう。)
- すべてのシステムテストを実行します:
$ rails test:system
- 特定のファイル(ここではusers_test.rb)でテストを実行します
$ rails test/system/users_test
- ...または1つの特定のテスト:
$ rails test test/system/users_test.rb:21
- すべてのテストを実行するには:最初にシステムテストを実行します:
$ rails test:system test
注:オプションフラグはtest:system
では機能しません; -f
のようなフラグを使用したい場合 (フェイルファストの場合)または-v
(詳細な場合)、$ rails test test/system -v -f
を使用します
何を(しないで)テストするか
システムテストは単体テストを補完するものであり、代替ではありません。これは、ハッピーパスに加えて、エラーメッセージまたはリダイレクトを含む1つのパスをテストするために行われます。システムテストは、ブラウザのすべてのエッジケースをテストすることを目的としたものではありません。主な機能をカバーするだけです。
テスト対象を選択するときは、ユーザーがアプリをどのように使用しているかを反映したテスト対象のエンティティを見つけようとします。テストの命名には、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を参照したくなります。 s。 (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はシステムテスト用のジェネレーターを提供します。
- RailsのMinitestは、Minitest自体とは少し異なり、Rails固有のメソッドとアサーションも追加します。 Minitestドキュメントの前に、まずRailsドキュメントを確認してください。
私はシステムテストをとても楽しんでいました。それは、ほとんどの場合、すぐに使用できるのがいかに簡単だったかのおかげです。
結論
この投稿では、Railsがすぐに使用できる構成と、追加する必要のある最小限のカスタマイズについて説明しました。 Minitestは、システムテストを作成するのに最適です。いくつかのヒントとコツは、最初のシステムテストを起動して実行するのに役立つはずです。彼らがブラウザで魔法をかけるのを見てください!
-
ウェブ用の Android メッセージの使用を開始する
Google は 1 つの巨大なプラットフォームであり、疑いの余地はありません。しかし、最高の検索エンジンの 1 つであるだけでなく、日常生活を楽にするさまざまなサービスも提供しています。 Google は最近、どの Web ブラウザからでもテキスト メッセージを送受信できる Android メッセージ アプリのアップデートをリリースしました。このサービスを使用すると、Android ユーザーは任意の PC または Mac に簡単にメッセージを送信できます。 開始するには、Android メッセージ アプリの更新バージョンが必要です。それが終わったら、Web サービスで Android メッ
-
Xen 仮想化の開始
Zで綴られるZenは、8時間保持した後、雪の中でおしっこをしているときに頭頂部にある典型的な感覚です. Xen は X で綴られており、KVM と同様に、企業市場を対象としていますが、家庭でもビジネスでもセットアップを検討できるオープンソースの仮想化テクノロジです。 KVM に関するいくつかのチュートリアルがあり、導入記事、ストレージとネットワーク (ブリッジ ネットワークを含む) のセットアップと構成の方法、および VirtualBox との競合の解決方法をカバーしています。ここで、Xen についてもう少し学びましょう。同様に、仮想マシンをインストールして実行するために必要な最初の手順、