げんきちの秘密基地

エンジニアリングが世の中の思いを実現してきた歴史に気づき、29歳未経験からWEBエンジニアとして転生!【Danger】綺麗事を割と本気で言ってきます【GitHub】https://github.com/0840kg【Twitter】https://twitter.com/0840kg

五箇条の御誓文!テストコードを書く際の原則

ぞす!げんきちです!\\\\٩( 'ω' )و ////

 

「いや、誰だよ」って方は、下記リンクを見てやってください。

  1. はじめまして!げんきちです! - げんきちの秘密基地

  2. 僕がエンジニアになりたい理由 - げんきちの秘密基地

目次〜

f:id:Genkichi:20190302164443j:plain

テストについて学習していたので、要点をまとめてみます!

 

単体テストとは

特定の機能・バリデーションなど、単独で予測した仕様になっているかのテスト。

 

単体テストの例

messagesコントローラでメッセージ一覧を表示するアクションのテスト

require 'rails_helper'

describe MessagesController do
  let(:group) { create(:group) }
  let(:user) { create(:user) }

  describe '#index' do

    context 'log in' do
      before do
        login user
        get :index, params: { group_id: group.id }
      end

      it 'assigns @message' do
        expect(assigns(:message)).to be_a_new(Message)
      end

      it 'assigns @group' do
        expect(assigns(:group)).to eq group
      end

      it 'redners index' do
        expect(response).to render_template :index
      end
    end

    context 'not log in' do
      before do
        get :index, params: { group_id: group.id }
      end

      it 'redirects to new_user_session_path' do
        expect(response).to redirect_to(new_user_session_path)
      end
    end
  end
end

 

単体テストコードを書く際の原則

①各exampleで期待する値は1つ

#2つ以上含めてしまうと、どちらのエクスペーションでエラーが出たのか判別できないため。

②期待する結果をはっきりわかりやすく記述

# it "〜" doの"〜"の部分。コミュニケーションミスを減らすため。

③起きて欲しいことと起きて欲しくないことを両方テストする

#予期せね動作が残るのを防ぐため。

④境界値をテストする

#6文字以上でバリデーションに引っかかる条件の場合

「5文字以上まで正常」と「6文字以上なら異常」を確認。

予期せぬ動作を防ぐため。

⑤可読性を考えつつ、適度にDRYにする

#分かりづらくなってテストの見落としが起きるのを防ぐため。

 

統合テストとは

ユーザーが実際にアプリケーションを操作する様子を再現して行われるテスト。

 

統合テストの例

ブラウザ上でユーザーがログインして投稿するまでのテスト

require 'rails_helper'

feature 'tweet', type: :feature do
  let(:user) { create(:user) }

  scenario 'post tweet' do
    # ログイン前には投稿ボタンがない
    visit root_path
    expect(page).to have_no_content('投稿する')

    # ログイン処理
    visit new_user_session_path
    fill_in 'user_email', with: user.email
    fill_in 'user_password', with: user.password
    find('input[name="commit"]').click
    expect(current_path).to eq root_path
    expect(page).to have_content('投稿する')

    # ツイートの投稿
    expect {
      click_link('投稿する')
      expect(current_path).to eq new_tweet_path
      fill_in 'image', with: 'https://s.eximg.jp/expub/feed/Papimami/2016/Papimami_83279/Papimami_83279_1.png'
      fill_in 'text', with: 'フィーチャスペックのテスト'
      find('input[type="submit"]').click
    }.to change(Tweet, :count).by(1)
  end
end

統合テストコードを書く際の注意点

①一部の記述の名前が単体テストと異なる

# it => scenario

before => background

dexcribe => feature

let => given、などなど。

エイリアスメソッドなので、内部的な実装は全く同じ。

②複数のexpectが同一テスト内に記述される

#ユーザーの1つの動作の結果として、複数のexpectを期待する場合があるため。

 

テストあるある

Finished in 9.96 seconds (files took 5.16 seconds to load)
15 examples, 0 failures

気持ちいい...

 

<一日一新>

Bunkamuraデビュー。展示会を定期的に開催しているみたいです。

 

<学習進捗>

学習開始からの期間 :83日
今日までの合計時間:822h
今日までに到達すべき目標時間:757h
目標との解離:65h
10,000時間」まで、

 

残り・・・9,178時間!」

 

以上です。

読んでくれた方々、ありがとうございました!((_ _ (´ω` )ペコ。

genkichi.hateblo.jp

genkichi.hateblo.jp

 

f:id:www08056561815:20190224095507g:plain

twitter.com