プログラミング初学者の私が、RSpecを書いていて
環境ごとにDBが違うことを知らずハマったので、記事に書き留めておきます。
プログラミング初学者の方の参考になれば嬉しいです。
また、間違い等ありましたらご指摘頂けると助かります。
それでは、見ていきましょう!!
【RSpec 基本】 Rails初学者の自分が知らなかった開発環境ごとにDBが違う話
RSpecを書く中で- 「テストってそもそもプロダクトコードをブラウザで動かしながらやってるの?」
- 「RSpecで定義した変数と、プロダクトコードに定義した変数ってどう違う?」
- 「RSpecで定義したデータって、テストのあとはどうなるの?」
- 「Railsには 本番環境、開発環境、テスト環境の3つの環境が用意されており、それぞれで違うDBを参照している。」
- 「RSpecは テスト環境で実行されるため、作成されたレコードはテスト環境用のDBに格納され、テスト終了後に削除される。」
- テスト時には新しくヘッドレス(見えない)ブラウザを立ち上げて、テスト用DBから取得した内容を表示したページを検証している。
- 表示ページのHTMLはプロダクトコードを元に生成される。
- development.rb(開発環境)
- production.rb(本番環境)
- test.rb(テスト環境)
こんな疑問が頭の中にブワーッと入ってきて、「何がわからないのかわからない」状態になりました。笑
そんな初学者あるある?な疑問を解決していきます!
Railsの環境には3つの種類がある
結論から言うと、下記の4点を知ることで疑問が解決しました!
Railsの「3つの環境」については他の記事でもたくさん解説されています。
【Rails】Railsの3つの環境
【Rails】configのenvironments配下のファイルの意味と記述内容を理解する。(development.rb, production.rb, test.rbとは?開発環境・本番環境・テスト環境の違い)
本番環境
実際にユーザーがシステムを使用する環境のことです。具体的に言うと、普段私たちが使っている「amazon」や「楽天市場」が本番環境にアップされたサービスです。
例え話をすると、、
プログラミングを初めると必ずといって良いほど
「herokuにデプロイする」
という言葉を見かけます。
これはコーディングしたプログラムをherokuにデプロイする(pushする)ことでURLが作られて、そのURLを友だちに送ったりすると作ったサービスを見られるようになります。
(本番環境にアップしないとそのサービスを第3者がインターネット上で見ることはできません)
誰でも見られるそのサービスは「本番環境で動いている」ということになります。
開発環境
これが普段、私達がプログラミングをして、ブラウザで動きをチェックしている環境です!Railsではデフォルトの設定がこの「開発環境」になっています。
ちなみにそれぞれの環境の設定をしているファイルは
config/environmentsの中にある以下の3つです!
テスト環境
そして、残りのひとつがテスト環境です。プロダクトコードのHTMLをヘッドレス(見えない)ブラウザで表示し、「RSpec」や「Minitest」などによって定義されたテスト用DBのレコードを参照して、テストを実行します。
つまり、localhostでアクセスするページに表示されている内容と、テストで検証している内容には全く関係がありません。
ちなみにRailsでは「Minitest」がデフォルトになっています。
なぜ環境ごとにDBが分かれているのか
環境ごとにDBが分かれていないと、DBには開発用のダミーデータと顧客のデータが混在することになり、間違えて削除してしまう、ということになりかねないからです。先程も例に挙げた「amazon」を使って説明します。
「amazon」では顧客のクレジットカードや住所などの情報を入力します。
これらの重要な情報をDBに保存し、管理するわけですが、DBがひとつだけの場合、顧客のデータを消してしまうことがあるかもしれません。
そして本番環境では常にサービスが動いています。
本番環境のDBに不具合が発生すると、買い物したくてもできなくなってしまうということです。
amazonくらい大規模になるとその損失は計り知れませんね。。。
おわりに
今回はRSpecで私自身が引っかかったところについて記事を書きました。まだまだ知識が少なく、間違っている点など見付けた際はぜひご教授頂けると助かります。
それでは、最後まで読んで頂きありがとうございました。
追記
コメントにてご指摘を頂きました。 Railsの環境は名前を付けて増やすことができます。 以下に解説記事のリンクを貼っておきます。 https://qiita.com/yusabana/items/a1f4fe2c37b20db2a3f6またひとつ勉強になりました!