コジマです。
以前こんな記事を書いたんですよ。
「プロを目指す人のためのRuby入門」が流行ってるので便乗紹介しよう
流行りの本を紹介したのですが、その中でテストを先に作ってからエラーを潰すようにコーディングするやで。
と教えて頂きましたので、実際そうしていきたいと思います。
【Rails#10】slimで画面作っていきたいぞー!#gamewith_moku2
これの続きになります。
作成しているusersテーブルのテストを書きます。
今回から技術的な話題の時は対象読者も書いていこうかなと思います。
(もちろんそのほかの人も見ていいのよ!)
対象読者
- Progate終わったけどテストの方法も覚えたい、って人
- Railsでテスト作る時どう考えりゃいいんだ?って人
- Fixtureやminitest復習したい人
では進んでいこう。
Gemfileを書いていくよ
まずはテストにあたりあると便利なGemfileを入れていこう。
今回はRailsチュートリアル準拠で書いていきます。
Gemfileに書きを追加していきます。
group :test do gem 'rails-controller-testing', '1.0.2' gem 'minitest-reporters', '1.1.14' gem 'guard', '2.13.0' gem 'guard-minitest', '2.4.4' end
テストに使うGemって大きくRSpecとminitestがあるんだけど、
今回はminitestです。
理由としては
- 公式のチュートリアルを参考にできる
- Rubyっぽく書ける(Rubyなんだけど)
の2点です。ここでは自動化までは行わないのでguardはこの記事でこれ以降触れないです。
そしたらbundle installしてください。
$ bundle install (色々省略して依存関係分かりやすく書き直した) Using rails-controller-testing 1.0.2 Using activesupport 5.1.6 Using actionview 5.1.6 Using actionpack 5.1.6 Using minitest-reporters 1.1.14 Using ansi 1.5.0 Using builder 3.2.3 Using minitest 5.11.3 Using ruby-progressbar 1.9.0 Using guard 2.13.0 Using formatador 0.2.5 Using listen 3.1.5 Using lumberjack 1.0.13 Using nenv 0.3.0 Using notiffany 0.1.1 Using pry 0.11.3 Using shellany 0.0.1 Using thor 0.20.0 Using guard-minitest 2.4.4 Using guard-compat 1.2.1 Using minitest 5.11.3<=minitest-reportersの依存gemでもある
ちゃんと依存関係含めてinstallされましたね。
(ちなみに依存の正しい読み方は「いそん」なんですよ)
テストを書く前に…
仕様をコメントで書いていくことにします。
どんなデータを用意すればいいか明確にするためです。
私が作成したusersテーブル
カラム名、型、概要、バリデーション(箇条書き)
login_id: string,ログインに使用するID
・重複なし
・半角英数字
・not nil
・4〜20文字
display_name: string,画面の表示名
・not nil
・1〜20文字
password_digest: string,ハッシュ化されたパスワード
・半角英数字
・not nil
・4〜20文字
email: string,メールアドレス
・重複なし
・メールフォーマット(詳細別途記載)
・not nil
authority_flag: string,管理者フラグ
・not nil
・「0」(一般利用者)か「1」(管理者)
モデルにバリデーションを与えていないですが、この条件を確認できるようなテストデータとテストを考えていきます。
require 'test_helper' class UserTest < ActiveSupport::TestCase # test "the truth" do # assert true # end #login_id(正常系) #4文字 #10文字 #20文字 #login_id(異常系) #重複する2ユーザー #記号を含む #全角文字を含む #nil #3文字 #21文字 #display_name(正常系) #1文字(全角) #10文字(全角+半角) #20文字(全角+半角+記号) #display_name(異常系) #nil #21文字 #password(正常系) #4文字 #10文字 #20文字 #password(異常系) #記号を含む #全角文字を含む #nil #3文字 #21文字 #email(正常系) #適当なメールアドレス #email(異常系) #重複する2ユーザー #@がない #nil文字含む #null #authority_flag(正常系) #0 #1 #authority_flag(異常系) #nil #2 #全然関係ない文字 end
こんな感じ。
- 正常系と異常系に分ける
- 境界値確かめる
- 文字の方もチェック
- not nullのカラムにnullは許さん
というのを意識しました。
Fixtureを作っていくよ
Fixtureってなーに?
Fixtureはテストデータのことで、
テスト用のDBを構築して、テスト用のDBにマイグレーションして使います。
テスト用のDBを作る
テスト環境を指定してマイグレーションをします。
rails db:migrate RAILS_ENV=test
これでOK
確認してみる
テスト環境を指定してdbconsoleを実行します。
$ rails dbconsole test SQLite version 3.6.20 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> select * from users; 298486374|MyString|MyString|MyString|MyString|MyString|2018-06-01 15:36:00.431927|2018-06-01 15:36:00.431927 980190962|MyString|MyString|MyString|MyString|MyString|2018-06-01 15:36:00.431927|2018-06-01 15:36:00.431927 sqlite> .quit
こんな感じ。お試しにselect実行してみたのですが、
なんかデータが入ってますよね。このなんか入ってるデータが定義されているファイルを編集していきます。
test/fixturesの下にあるusers.ymlがそれにあたります。
# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html one: login_id: MyString display_name: MyString password_digest: MyString email: MyString authority_flag: MyString two: login_id: MyString display_name: MyString password_digest: MyString email: MyString authority_flag: MyString
デフォルトはこんな感じ。
詳しくは
http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
これを見ろって書いてある。優しい。
書き方としては、文字列を””で囲うことがない。インデント気をつける。
使い方としては、テストの中でクラス変数とメソッドのような書き方ができる。
って感じかな。(ざっくりすぎてごめんね)
Fixtureつくりましょう
Fixtureはあらかじめ入れておくデータなので重複用のデータを入れることにします。
#重複チェック用ユーザー #ログインIDとメールアドレスのテスト用 duplication_check_user: login_id: test display_name: test password_digest: test email: test@email.com authority_flag: 0
データを反映させていく
以下のようにコマンドを実行し、反映と確認を行います。
$ rails db:migrate RAILS_ENV=test $ rails dbconsole test SQLite version 3.6.20 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> select * from users; 423289796|test|test|test|test@email.com|0|2018-06-02 01:12:41.729715|2018-06-02 01:12:41.729715 sqlite> .quit
テスト用のDBにusers.ymlの内容が反映されました。
結構なげえ。。。
ほんとはテスト完了まで1記事にまとめたかったのですが、
テストの実装とバグ潰しは
次の記事でやりたいと思います!
以上、コジマでした。