 ## 目次💻 - サービスの開発工程を知ろう! - テストのメリット - テストのデメリット - RSpecとは? - RSpecの種類 - メインとなるSpec - Model Spec - System Spec - Request Spec - 事前準備 - Model Specを書いてみよう! - System Specを書いてみよう! - Rspecの難しいところは? - 書き方が自由があるところ - 現場によってはルールが異なる - 基本を押さえよう! - テストのグルーピングをする - コードを省略して書こう! ## サービスの開発工程を知ろう!  ### 基本設計とは? - どういう機能が必要かを考える - ex. 掲示板(ログイン機能、投稿機能、更新機能、削除機能) ### 詳細設計とは? - 機能に対してどんなテーブル、データが必要か考える - ex.ログイン機能 => name, emailは必要だな〜、空だとダメだな〜 - ex.投稿機能 => title, contentは必要だな〜、5文字未満は入力制限かけようかなぁ ### テストとは? - 基本設計、詳細設計の内容が正しいかどうかを再確認すること - 例えばゲームの例で考える(寺尾さんThanks!!!) ### 単体テストとは? - 詳細設計の内容が正しいかどうかを再確認すること - Model Spec ### 結合テストとは?(システムテスト?) - 基本設計の内容が正しいかどうかを再確認すること - System Spec ## テストのメリット💻 - バグを発見しやすくなる - リファクタリングしやすくなる ## テストのデメリット💻 - 開発の工数が膨らむ - スピード VS 安全性 ## RSpecとは?💻 - Railsのテストフレームワーク(枠組み)の一つ - test-unit、Minitest、RSpec... ## RSpecの種類💻 #### システムテスト、結合テスト - **System Spec(Feature Spec)** - **Request Spec** #### 単体テスト - **Model Spec** - Controller Spec - Routing Spec - View Spec - Helper Spec - Mailer Spec - Job Spec ## Model Spec 事前準備💻 - gem 'rspec-rails' - rails generate rspec:install ``` create .rspec create spec create spec/spec_helper.rb create spec/rails_helper.rb ``` - .rspec / --format documentation ## Model Specを書いてみよう!💻 - Model Spec - rails g rspec:model モデル名 ``` require 'rails_helper' RSpec.describe User, type: :model do end ``` - バリデーション、クラスメソッド、インスタンスメソッドについてテスト - バリデーションに通るデータ(データが入力されている状態)のケース - バリデーションに通らないデータ(データが入力されている状態)のケース - メソッドが期待通り動作すること - テストは1つのテストケースにつき1exmpleという単位でまとめられる - example = it - 一つのテストケースにたいして一つの結果 ``` it "2と1を足すと3になること" do expect(2 + 1).to eq 3 end expect(1 + 2).to eq 3 1 + 2が3に等しくなることを期待する ``` ### モデルスペックにおける大事なステップ - 1. どんなデータが必要か? - 2. テストケースにたいして必要なデータを準備する - 3. データを元に有効かどうかのテストを行う ### 今回のケースで言うと - 1. Userモデルのレコードが全て値が入っている状態 - 2. user = User.new() - 3. be_valid (バリデーションが通るかどうか) ### マッチャとは? - 期待される結果と実際の結果を比較するために使用されるメソッド ### FactoryBotでテストデータを作ってみよう! - gem 'factory_bot_rails' - rails g factory_bot:model モデル名 - 省略系にしてみよう! ``` spec/rails_helper.rb RSpec.configure do |config| config.include FactoryBot::Syntax::Methods end ``` ### before do ~ end で共通化してみよう! - 全テストに関わる部分を共通化できる ### describeとcontext でグループ化してみよう! - describe => どんな機能か? - context => どんな条件か? - it => どんな結果が期待されるか? ### 【中級編】letで書き換えてみよう! - before do に処理がどんどん溜まっていくので、可読性が悪い - it 内部に データを作る部分とテストを評価している式が溜まっている - @user は itの中でしか書けない ## System Specを書いてみよう!💻 - 実際に期待通りの動作を実装できているかシュミレーションすること ### 事前準備 - gem 'capybara' - rails g rspec:system モデル名 - create spec/system/users_spec.rb ### システムスペックにおける大事なステップ 1. どんなユーザが必要か?(ユーザー?、管理者?) 2. そのユーザはどんな手順を踏むか 3. 手順通りの場合、どんな結果(出力が欲しいか?) ### 今回のケースで言うと 1.1 build(:user) 2.1 ユーザがトップページに遷移、 2.2 Sign inボタンを押す 2.3 フォームに値を入力する 2.4 Sign inボタンを押す 3.1 一覧ページで、フラッシュメッセージが確認される ### describeとcontext でグループ化してみよう! - describe => どんな機能か? - context => どんな条件か? - it => どんな結果が期待されるか? ### 【中級編】letで書き換えてみよう! ## Rspecの難しいところは?💻 - 書き方が自由があるところ - 現場によってはルールが異なる ## 基本を押さえよう!💻 - 泥臭く書こう!綺麗に書くのはそのあとから! - 何をテストしたいのかを意識しよう! - コードを省略して書こう! ## 参考資料💻 ### 入門〜中級おすすめ! https://qiita.com/jnchito/items/42193d066bd61c740612 https://qiita.com/jnchito/items/2e79a1abe7cd8214caa5 https://qiita.com/jnchito/items/640f17e124ab263a54dd https://qiita.com/jnchito/items/a4a51852c2c678b57868 https://github.com/willnet/rspec-style-guide https://www.youtube.com/watch?v=n0epZM-lZvw&feature=youtu.be https://speakerdeck.com/willnet/clean-test-code-revised https://zenn.dev/yuji_developer/articles/52cc0e356b3748
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up