Pocket

おはようございます
1日11時間のプログラミング学習に打ち込んでいます。

Railsのテストコードについて学びましたので、忘れないようにアウトプット。
あと、何度かすげぇと唸ったので、それも書きたいと思います。

単体テストするための準備

  1. 何をチェックするか? テスト項目(example)を挙げておく。
  2. RSpecというGemを導入する
  3. Rails g rspec:installを実行 -> WebアプリケーションでもRspecが使えるようにする
  4. Rails g rspec:model ファイル名 -> テストコードを記述するファイルを生成する
  5. 生成された, ファイル名_spec.rbにコードを書く

単体テストのチェックポイント

MVC個々に動作確認を行うテストを単体テストと言います。
MVCによって、チェックポイントが異なりますので、以下ご覧ください。

  • 共通 : 検証用のインスタンスを生成しておく。

    FactoryBotを使って、テストする前にインスタンスを作っておくと、コードがすっきり!!

  • モデル : Validateした通りの挙動になるか??

  • コントローラー : とあるアクションにリクエストを送ったとき、想定通りのレスポンスを返してくれるか??

結合テストのチェックポイント

ユーザーがWebアプリケーションを利用したときに、とある一連の機能(例:新規登録をする)のstartからendまで、想定した動作をしてくれるかチェックするテストを結合テストと言います。

結合テストするための準備

  1. 何をチェックするか? テスト項目(example)を挙げておく。
  2. CapybaraというGemを導入する
  3. Rails g rspec:system ファイル名 -> テストコードを記述するファイルを生成する
  4. 生成された, ファイル名_spec.rbにコードを書く

テストを学んで思ったこと、唸ったこと

アプリケーションのこと熟知してないと、細かにexampleを挙げられない

エンジニア一発目の業務として、「テストコードを書くこと」が与えられると聞きましたが、確かに「ユーザー目線」で一つの機能を完了までさせるために考えなきゃいけないので、アプリケーション理解にはもってこいだと思いました。

テスト項目をexpect().matcher()構文で記述して、テストコマンドを実行すると?!

構文に書いたコードを自動でチェックしてくれる??!!
▼動画のように、テストコマンドを入力すると、コード通りに一連の操作チェック「自動」で行われる。

画面収録 2022-03-23 18.00.36

何が起きているかというと、まずテストコードで、下記ユーザーの操作を「コードで記述」します。

例) 新規登録機能をテストするときのテスト項目
1. トップページに移動する
2. トップページに新規登録ボタンがあることを確認する
3. ユーザー情報を入力する
4. ユーザー登録ボタンを押す
5. テーブルにレコードが増えたことを確認する
6. トップページに遷移する

▲のユーザーの行動を、コードで書くと▼

context 'ユーザー新規登録ができるとき' do 
    it '正しい情報を入力すればユーザー新規登録ができてトップページに移動する' do
      # トップページに移動する
      visit root_path
      # トップページにサインアップページへ遷移するボタンがあることを確認する
      expect(page).to have_content('新規登録')
      # 新規登録ページへ移動する
      visit new_user_registration_path
      # ユーザー情報を入力する
      fill_in 'Nickname', with: @user.nickname
      fill_in 'Email', with: @user.email
      fill_in 'Password', with: @user.password
      fill_in 'Password confirmation', with: @user.password_confirmation
      # サインアップボタンを押すとユーザーモデルのカウントが1上がることを確認する
      expect{find('input[name="commit"]').click}.to change{ User.count }.by(1)
      # トップページへ遷移することを確認する
      # binding.pry
      expect(current_path).to eq root_path
      # カーソルを合わせるとログアウトボタンが表示されることを確認する
      expect(find('.user_nav').find('span').hover).to have_content('ログアウト')
      # サインアップページへ遷移するボタンやログインページへ遷移するボタンが表示されていないことを確認する
      expect(page).to have_no_content('ログイン')
      expect(page).to have_no_content('新規登録')
    end
  end

ユーザーの行動コードで記述されています。例えば、ボタンをクリックする -> form().clickなど。

テストコマンドを入力すると、上から下まで、ブラウザ上でユーザーの行動を実行してくれて、エラーがないか返してくれるということです。

このテストを経て、Webアプリケーションの行動には問題なしとお墨がつけられて、リリースされていくんですね。