Ruby on Rails プログラミング 日記投稿サービスを1から作る

【Rspec入門 #5】Rspecのテストで作成したデータベースはどうなるのか?

 

みやちゃ

 

皆さんこんにちは、みやちゃです!

こちらでRailsアプリケーションでのRspecのテストの書き方を詳しく解説しています!

みなさんは、Rspecでテストを書いたことがありますか?

テストでは、擬似的にモデルを作成したり、パラメータの移動を確認したりします。

では、テストで作成されたデータベースはどうなるのでしょうか?

今回は
  • Rspecのテストを実行した時のデータベースはどうなるのか?
この記事を読むと

Rspecで作成するデータベースについて理解することができます。

テストで作成されたデータベースの行方

結論から言うと、exampleのたびに、データベースは削除されています。

spec/rails_helper.rbを開いてみてください。

以下のような記述が確認できると思います。

RSpec.configure do |config|
...
  config.use_transactional_fixtures = true
...
end

上記のように、「config.use_transactional_fixtures」がtrueに設定されていると、exampleのたびにデータベースが削除されることになります。

transactionの中で、exampleのテストが行われ、テストが終わると、transactionがrollbackされる仕組みになっています。

log/test.logファイルを開いて見てみるとよくわかると思います。

   (0.0ms)  begin transaction
   (0.1ms)  rollback transaction

上記のように、exampleの始めで、begin transactionとなり、exampleが終わると、rollback transactionとなっているのがよくわかります。

このように、テストは、exampleごとに、transactionの中で行われ、exampleが終わるたびに、transactionがrollbackされて、データが削除されているのです。

逆に、

RSpec.configure do |config|
...
  config.use_transactional_fixtures = false
...
end

上記のように、「config.use_transactional_fixtures」をfalseの設定に変えると、データベースがテストが終わっても削除されなくなり、データベース上に残ることになります。

そのため、DatebaseCleanerなどで、データベースを綺麗にする必要があります。

データベースが残り続けるので、他のテストファイルでもデータを継続してテストをすることができるという利点はありますが、基本的には、設定はtrueにしておいて、テストが終わればデータベースを削除するというのがいいと思います。

before(:all)の注意

テストを書くときに、beforeを使うことがあるかと思いますが、beforeにはいくつか種類があります。

before(:all)を使ってしまうと、transactionの外側でデータベースが保存されてしまうため、exampleが終了しても、データベースが削除されずに残ってしまいます。

なのでbefore(:all)を使う際は、事後処理として削除するための記述をする必要があります。

まとめ

いかがでしたでしょうか?

今回は、テストで作成されたデータベースの行方について解説しました!

 

みやちゃ

 

ここまでご覧いただきありがとうございます!

こちら のUdemyの動画教材は、8時間で、

  • Dockerで仮想環境構築
  • Railsの基礎を解説しながら、アプリケーション開発
  • RSpecでテストを記述

まで解説しています。

Udemyの教材へ

Railsエンジニアとして働くために必要な、DockerとRSpecを同時に解説してくれています。

DockerとRSpecを使って作ったポートフォリオはかなり評価が高くなります。

ぜひ動画を見てみてはいかがでしょうか?

Udemyの教材へ

受講生は、5000人以上!です。

さらに、Udemyは、30日間の返金保証付きなので、いつでも返金できます。

たったの8時間でDocker、Rails、Rspecを学ぶ即戦力Railsエンジニア養成講座

© 2021 みやちゃのブログ Powered by AFFINGER5