rails mini testの概要や書き方

前書き

rails でwebアプリを作成しようとしているのですがテスト駆動開発で作成しようと思いました。ただ「テストってなんの意味があるんだっけ?」「そもそもどうやってかくんだっけ?」となったので私のように困っている人の参考になれば幸いです。

目次

①テストとは.
②テストの導入.
③testの書き方.

①テストとは.

⇨自分の作成したプログラムが期待通りに動いているのかを確かめることによって開発を効率的に行う。 例えば、下のようなメモアプリがあったとして、右上のログインボタンを押してログインするとちゃんと次のページに画面が切り替わるかどうか気になった際に、いちいちrails server を起動⇨自分でログイン⇨ページが切り替わったか確認する。めんどくさいですね。ページ数が増えた際にいちいち自分で確認するのは膨大な時間を使います。そこで人の代わりにpcに上記の確認をしてもうのが『テスト』です。

②テストの導入.

railsを使用する場合testがデフォルトで入っているのでgemの追加の操作などを行う必要なし。厳密には以下のコマンドを入力するとtestディレクトリが作成される.

rails new アプリケーション名 

テストの書き方.

具体的に「テストを書く場所」、「テストの書き方」、「テストの流れ」について述べたいと思います.
テストを書く場所.
⇨testディレクトリの中の該当するディレクトリの中のファイルに記載する.

rails new アプリケーション名

をすると同時にtestディレクトリが作成されます。testディレクトリの中のディレクトリは次のようになっています。 上から順に.
channelsディレクトリ→Action Cableのコネクションやチャネルのテストのしたい時に記載.
contorollers→コントローラ/ルーティング/ビューのテストを書きたい時.
fixtures⇨データベースに架空のデータを入れてテストしたい時.
helper→ビューヘルパーのテスト.
integration→全体的なテストを書く.
mailer→メール内容に特定の要素は存在するかなどを確認する.
models→モデルのバリデーションがうまく機能しているかなどを確認する.

テストの書き方.

test "任意のテストのタイトル" do
テストしたい内容 
end 

上の書き方は↓で書いた時と同じ意味です.

def test_the_truth
  テストしたい内容 
end

例. urlの語尾に「/users」を足してindexページにちゃんと画面が遷移するかどうかを調べるテストです

 test "go to index?" do
    get users_path /ルーティングのusersでリクエストを送る
    assert_response :success /index.htmlが表示されたか確認している。
  end 

↓routing

get '/users', to: 'users#index'

users controllerのアクション

def index 

end 

デェフォルトではindex.htmlを開く.
ここでテストしたい内容と実際自分が書いたコードに差異がない場合はテストが成功し、差異がある場合は失敗する。テストを調べたい時はターミナルでrails testと入力すると↓テストが走る ↓テストが成功した場合は「.」←緑のドッドが記載される。 ↓失敗した時は「F」と表示される

テストの流れ ①失敗するコードを書く。 ②成功するコードを書く。 理由テストコードの記載漏れを防ぐ. もし成功するコードを書いた後にテストを書くと,テストコードが間違っていたら自分のコードが間違っていても全てテストが成功し、テストできていないことになる。

bootstrapの導入〜初期設定まで

前書き

今プログラミングの教材使いながらruby on rails を学習しているのですが一人で1からアプリを作ろうとしたときに『どうやってこれ使うんだっけ?』と思うことが多いので、今回は私のように1からアプリを作ろうとしている方の参考になればと思い記事に残したいと思います。言語はrubyでgemとして導入してみます。

目次

①bootstrapの導入の仕方全体像.
githubの説明を読んでコマンドで導入〜初期設定までやってみよう.

①bootstrapの導入の仕方全体像.

手順1 githubでgemの使い方(導入の仕方〜実際の使い方まで)を見る.
手順2 コマンド操作でパソコンに導入.

githubの説明を読んでコマンドで導入〜初期設定までやってみよう.

github.com

Installation

Please see the appropriate guide for your environment of choice:

Ruby on Rails 4+ or other Sprockets environment.
Other Ruby frameworks not on Rails.

どうやらruby on railsに導入するときとrails 以外のrubyフレームワークで導入するときで導入のやり方が違うことがわかる。 今回はruby on railsに導入するときのやり方で導入してみます。 bootstrapの導入

Add bootstrap to your Gemfile:

gem 'bootstrap', '~> 5.2.2'

gemfileに上記を追加する.
gemfileのどこに書けばいいの?という疑問があると思います(私はありました)⇨どこにでも書いていいわけではなく 開発、テスト、本番環境でインストールさせたいgemはgroup分けされているdo.. end内のそれぞれの場所に、全ての環境でgemをインストールさせたければそれ以外の場所に書く.

group :development, :test do #開発とテスト環境

end
group :development do #開発環境

end
group :test do #テスト環境

end
group :production do #本番環境(添付画像にはありませんが)

end

上記以外の場所に書かれたgemは全体で使用可能なgemです.

このようにそれぞれの環境でgemのインストールを分ける目的は、 →本番環境で動かないという問題を減らすため。 アプリケーション開発する際3つの環境を用意し、開発、検証、運用させます。 それが上記で出てきた、開発環境、テスト環境、本番環境です。 開発環境(手元のパソコン)で作業しアプリケーションを作成し、 テスト環境は疑似本番環境で、本番のようにアプリケーションを動かします。(即本番の場に出すと問題があった際、利用者様に迷惑がかかるため) その後、本番環境に移して実際にアプリケーションを使います。 アプリを開発するときの場所、問題ないか確認する場所、本番の場所というイメージ。 話をbootstrapの導入後に戻します.

gemfileにgemを追加した後bundle installします.
``` bundle install

bootsrapの初期設定.  
まずapp/assets/stylesheets/application.css⇨app/assets/stylesheets/application.scssに名前を変更する.  
その後application.scss内に

@import "bootstrap";

を入力
最後にapp/assets/javascripts/application.js内に

// Bootstrap4 //= require jquery3 //= require popper //= require bootstrap-sprockets

と入力し保存する






 

プログラミング言語について

前書き.

今転職を理由にrubyを学習して半年ほど経ちそろそろ一人で1からwebアプリを作成し面接に進もうと考えています。そこで面接官からなぜその技術を使用してアプリを作ったのかという質問が想定されるので、そこに明確に答えるために今回言語選定に関して復習をし記事を残します。 この記事が同じような転職者の少しでも参考になれば幸いです。

目次

  1. プログラミング言語の選び方.
  2. プログラミング言語の種類.

プログラミング言語の選び方.

結論「作りたい物や自分の置かれている状況によってにどの言語で作るかは変わる」。 例えば 作りたいものがiphoneで動くアプリなら⇨swiftを使うなど.
webアプリ⇨python, php,ruby.
ネイティブアプリ⇨swift, java,kotlin.
デスクトップアプリ→c# ,Visual Basic.
など作りたいものである程度絞る.
さらに自分の置かれている状況でどの言語で作るのかを絞る.
⇨1人でアプリを作ろうとしているのか10人でアプリ作ろうとしているのかで言語の選定は変わる。 例えば、1つのウェブアプリを10人のエンジニアで作る場合、10人中8人php普段触っている、残りの2人はrubyというチームの場合で開発を進める場合、言語はpython,ruby, phpの3種類あるがphpを選んだ方が効率よくアプリが作れそうと判断できる. もちろん1人で作成する場合どんな言語で作っても良い.
つまりこのプログラミング言語の選び方が一番良いみたいなのはない。

プログラミング言語の種類.

モチベーションについて

前書き

日々プログラミングを勉強する中でモチベーションが下がる瞬間が訪れることがあります(長時間エラーが解決できなかったり、勉強が目的になってしまい何のための学習をしているのかわからんくなったり)。 そこでもう一度、目標、目的、学習計画について自分で見つめ直し、目的意識の持った勉強をすることで効率よく(無駄なことを省く)目標達成できるようにしたいと思います。この記事は同じような境遇の方に少しでも有益になればと思い記事にさせていただきます。

目次

  1. 目的、目標、学習計画とは.
  2. 目的、目標、学習計画それぞれのメリット.

1. 目的、目標、学習計画とは.

目的とは「こうありたいという姿、つまり理想像の設定」.
例 他人から羨ましがられるような体型になりたいなど.

目標とは、目的を達成するためのするべき具体的な行動。要は何をするのか。数値目標や達成期限を設けるとよし。
例. 1ヶ月食事制限と運動をして3kg体重を落とすなど.

学習計画.
⇨目標に対してさらに具体的に今日何をするのか、1週間あたり何をするのか.
例 今日3食高タンパクの食事をとる.
1日1時間運動をする.

ここまでのまとめ.
下の山登りの例で例えると.
山登りの目的、綺麗な景色を見たい 目標、5日後に山頂到達.
計画、1日で1つの赤い丸のとこまで進む

2. 目的、目標、学習計画それぞれのメリットや理由.

①目的を設定する理由.
⇨正しく努力するために必要. 要は目的がないと正しい目標が設定できない

例えばダイエットの例でいくと 目的なしに目標、学習計画を立てた場合 目標を設定するために何をすればいいのかわからない。 運動?食事制限?どれをどの程度やればいいのかわからない。要はやるべきこととやらんでいいことの区別がつかない。

目的ある場合、 みんなが羨むような体型になりたい。

目標 1ヶ月後体重−5kg など

②目標設定の理由.
①目的達成のために何をしたらよいのか具体化するため。 そうすることでいつまでにどんなことをすべきか明確になるので一歩を踏み出しやすくなる。 要は理想の自分(他人から羨ましがられるような体型になりたいなど)と現状との距離を測り、道を作る作業。

②学習計画の振り返りがしやすい 学習計画を作成し実行したあとには、どのくらい実行できたかという振り返りが必要。問題がある点は改善し、次の学習計画に活かせる。

例 1ヶ月で3kg体重を落とすという目標を掲げ、

①1月10日−1kg ②1月20日合計-2kg ③1月31日合計-3kg と設定したとして 1月21日に-2.2kgだったら このままのペースで継続すれば目標達成できるなぁとか、このままではまずいから計画を修正しようとか判断しやすい.

③学習計画を設定する理由.
⇨進歩状況の把握がしやすい.

例10日間で1kg痩せるという目標があるとすると、1日100g痩せようと計画を立てた場合、 5日後に-200gしか減らせてないということに気がつけば、残り5日間で800g減らせばいいから、1日あたり160g明日から減らそうのように修正が効くし、現状が目標に対してどのくらい進んでいるのかもわかる.

rubyのデバックのやり方

前書き

rubyを学習して数ヶ月経つ初心者なのですが、毎回エラーに遭遇すると非効率に時間を費やしてしまい学習効率を落とします。その原因として、エラーの原因より解決策をネットで探し回り、また同じエラーに遭遇すると「このエラー見たことあるけどなんでこのエラーは起きるんだろうと」思いながらまた、ネットで解決策を探し回ります。少なからず私のような学習者はいると思いますので、今回はエラーの原因がわかり、エラー遭遇から解決までの時間を短縮できるようにエラーの解決手順についての記事を残します。

目次

  1. エラーを解決するためにやるべきこと3つ.
  2. 見方や 使い方.

1. エラーを解決するためにやるべきこと3つ.

①バックトレースの確認.
バックトレースとは.
⇨プログラムが実行されてエラーが発生するまでの間のメソッドの呼び出し履歴を示した情報.
要は「どういう手順でプログラムを動かそうとしたかがわかる情報」.
メリット:エラー解決のための時間が短縮できる。理由は「エラーが起きている箇所を特定しやすい」.

②pデバッグ.
pデバッグとは.
⇨pメソッドをプログラムに埋め込んでプログラムを実行し、ターミナルに出力される値を確認して不具合の原因を探る方法. 要は「この変数に何の値が入ってるんだろう?」と疑問に思ったりしたときに変数の中身を確認できる.

③デバッガを使う.
デバッガとは.
⇨pデバッグをより便利にしたもの.

2. 見方や使い方.

①実際にバックトレース(履歴)の見方について.

バックトレース(履歴)が表示される場所はターミナルやブラウザーなどに表示される。

ターミナルに出力された履歴 ブラウザーに出力された履歴

出力される場所が違うだけで内容はほとんど同じ.

ただrubyのバージョンによって表示内容が変わることがある。

バックトレースの内容は『間違っている箇所』と「間違っている理由」が含まれています。 要は「どこのファイルの何行目がどのように間違っているかを教えてくれます」 ターミナルとブラウザー両方の履歴を見ると

app/controllers/users_controller.rb:22:in 'update_password'

と記載があります。これがエラーを起こしている場所です。users_controllerファイルの22行目あたりのupdate_passwordメソッドがエラーの箇所になります。 次にどのように間違っているかを ターミナル、ブラウザー両方の履歴を見ると

undefined method `password_set?' for #<UsersController:0x00005614f67714b8> 

と記載があります.
undefined=未定義.
method =メソッド.
'password_set?'=メソッド名.
for UsersController =メソッド名が記述されている場所.
全体的な意味はUsersControllerで使われているpassword_set?メソッドなんだけど未定義だよと言われている。 要は以下の状態でプログラムが実行されている状態.

if a <= 10 
  puts "10以下です"
else 
  puts "10以上です"
end

このプログラムを動かそうとするとエラーになります。なぜなら[a]って何?となるからです.
今回のundifinedエラーに関してはメソッドや変数を定義してあげたら解決します。

a = 5
if a <= 10 
  puts "10以下です"
else 
  puts "10以上です"
end
⇨”10以下です”が出力される

こうすれば人間もpcもa=5とわかるのでエラーが解決されます.

②pデバッグの使い方について.

知りたい変数やメソッドの値の後に

p 変数名やメソッドの値を入れる

例えば. コントローラの中にあるcitiesメソッドの引数namesに入っている値が知りたいとします。 その場合namesの後にp namesと入力し、ページをリロード(更新)します。 するとターミナルに["osaka","tokyo"]と出力されます。*namesの中に["osaka","tokyo"]が入っていることがわかりました。

またpデバッグは変数やメソッドの値を知りたい時に使用するほか「メソッドや条件分岐が意図した通り」に動いているかどうかを知りたい時にも使えます.
例citiesメソッドが呼ばれているか条件分岐がtrueの処理がちゃんと行われているか知りたいとする.
citiesメソッドが呼ばれているか知りたいときはメソッド名の直後にpデバッグを使って好きな文字を入れていみる.
また条件分岐のtrueの処理が行われているか知りたいときも同様でtrueの処理の中にpデバッグを差し込む。 なお今回もしメソッドがちゃんと呼ばれていたら ”citiesメソッドが呼ばれた” trueの処理の場合"trueの処理が行われたとターミナルに出力される.
メソッドもtrueの処理も呼ばれていると確認できる

③デバッガを使う方法.

デバッガーとはpデバックの進化系であり、役割はpデバッグと同じで変数やメソッドの値の確認することができるツール。pデバックの違いは、デバッガーの方が楽に変数の中身が知れる。 デバッガの種類あるので今回はrailsにデフォルトで入っているbyebugの説明をすることとする。 pデバッグと同じように知りたい変数の後に「byebug」と入力しページをリロードすると ターミナルにこのように出力される 『=>13』の意味はここで処理を止めているよという意味、byebugを使うとbyebugの直後で処理を止めることができ(byebug)の後に好きな変数を入れると、その変数の中身が出力される。

if文の三項演算子(条件演算子)

前書き

日々rubyの勉強をする中で、同じ処理をするにしても多様なコードの書き方があり困惑したりしてしまうケースが多いので、それは私のような初心者の学習者の方もきっと同じ気持ちであると思うので少しでもお助けになればと思い記事に残します。

目次

1.三項演算子(条件演算子)とは.
2.通常のif文と三項演算子(条件演算子)のif文を比べてみよう.
3.いつ三項演算子(条件演算子)を使うのか.
4.参考文献.

1. 三項演算子(条件演算子)とは

⇨一言で言うとrubyのif文の書き方の1つ.
特徴⇨『:』や『?』を使う.

2. 通常のif文と三項演算子(条件演算子)のif文を比べてみよう

通常のif文.
例.

a = 11. 
if a > 10
   "10より大きい"
else 
  "10以下"
end 
#=> ”10より大きい”

上記のコードを三項演算子(条件演算子)で書くと↓

a = 11 
a > 10 ? "10より大きい" :  "10以下"
#=> ”10より大きい”
a = 11
条件式 ? "条件式の結果がtrueの時の処理": "条件式の結果がfalseの時の処理"

三項演算子[?]の意味は条件式の結果がtrueかfalseどっちなん?と言う意味.
:⇦はtrueの処理とfalseの処理の境界線ぐらいの認識で大丈夫です。お弁当で例えるとバランみたいな役割です。要はtrueの処理はここまで、ここからはfalseの時の処理というのをわかりやすくしている.

また三項演算子(条件演算子)は次のように「if文の結果を変数に代入することも可能」

a = 11
result = a > 10 ?  "10より大きい" :  "10以下"
result #=> ”10より大きい”

上の場合だとtrueの処理が変数resultに代入されている.

3.いつ三項演算子(条件演算子)を使うのか.

if文の中の処理がシンプルな時は三項演算子使った方が読みやすい。なぜなら目線が左から右に動くため読みやすい。普通のif文なら1文読んだら目線が上から下に動きを繰り返し読みづらい。 複雑なif文になるのであれば三項演算子(条件演算子)は読みづらい.

4.参考文献

プロを目指す人のためのRuby入門

scopeメソッドとは

目次

  1. scopeメソッドとは.
  2. 使い方.

scopeメソッドとは.

モデルにおけるscopeとはActiveRecordの機能の一つです.
モデル側で共通の条件式(クエリ処理)に名前を付けて定義し、その名前でメソッドのように呼び出すことができる仕組みのことです。要は名前で言うニックネームみたいなもの。例えば、「松田ゆうき」と言う人がいたときに名前を呼ぶ時毎回松田ゆうきというのは面倒臭いので「まっちゃん」と呼んだりする。つまりまっちゃん=松田ゆうき、と省略している.
例)モデルにscope定義 (publishedカラムはtrueかfalseで公開・非公開を管理)

class Blog < ApplicationRecord
where(published: true)
end 

↑のようなSQLがあった時 呼び出す時いちいち

Blog.where(published: true)

とデータベースから情報を取得できるがわかりにくい。なのでwhere(published: true)の処理にpublishedという名前をつけて

Blog.published

とした方が直感的に何がしたいかわかりやすい.

使い方.

class モデル名 < ApplicationRecord
  scope :スコープの名前, -> { 条件式 }
end

第一引数にシンボルを使ってスコープの名前を指定します.
第二引数の-> { 条件式 }はlambdaと言い、処理の中でメソッドを定義してくれます。 ->(アロー関数)はlambdaのリテラルです。 引数を定義すると、呼び出すときにブロックに渡すことができます。

補足.
ActiveRecordとは ⇨一言で言えば「RubySQLの翻訳機」です。 データベースに何かしらの命令(データベースからデータを取得、削除したり)をするときSQLという言語で命令しないといけないが、ActiveRecordがあるおかげでrubyで何かしらの命令をデータベースにできる.