🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

2813閲覧

Rails: Minitestでfixtureを自動で読み込まれたくない

kenkenbbb

総合スコア17

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2019/10/01 14:47

前提・実現したいこと

Railsの開発でMinitestを使用しています。
fixtureで大量のデータを作成した場合に、テストの実行速度を低下させない方法を模索しているのですが、
具体的な方法が分からず、質問させて頂きました。

Railsのバージョンは5.2.1です。

発生している問題

ページネーション用のgemとして、will_paginateを使用しており、
画面毎にページネーションの動作確認するための結合テストを作成しています。

ページネーションを動作させるため、テスト用のデータを画面毎に300件程度作成する必要があり、
fixtureファイルで合計900件程度のデータを作成したところ、テスト全体の実行速度が2〜3倍程度遅延してしまいました。
(例えば、ユーザー一覧画面用のテストデータとして、適当なユーザーを300人程度作成するイメージです)

色々、動作の検証をした結果、fixtureのデータ件数を増やすほど、テストの実行速度が遅くなることが分かりました。

想定される原因

Minitestで記述したテストコードが実行される際に、都度、全てのfixtureファイルが自動で読み込まれます。

大量のfixtureデータを定義した場合に、全テストコードにおいて、fixtureの読み込み時間が増えたことが主な原因だと考えています。

自分で調べたことや試したこと

  1. Factory_botを使ってテストデータを作成する。
    Factory_botを使った場合、動的にテストデータの数を変更できるため、期待していた動作になりました。

 現状、一番最適な方法なのでは?と思っています。

2. rails db:fixtures:load RAILS_ENV=test を実行し、テスト用のDBにデータを保存してからテストを実行する。
各テストコードが実行される都度、新たにfixtureを読み込むため、効果がありませんでした。

質問

  1. fixtureファイルが、自動で読み込まれないように設定する方法はありますか?

  
2. 特定のテストで大量のデータを使用したい場合は、factorybotを使う方法が無難なのでしょうか?

3. user_controller_testや、post_controller_testなど「任意のテスト」で「特定のfixtureファイルだけ読み込む」といった方法がありますか?

初心者の質問で読みづらい点が多々あるかと思いますが、解決策等ご教授頂けると幸いです。よろしくお願いします。


気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

fixtureファイルが、自動で読み込まれないように設定する方法はありますか?

fixtures :all の部分をコメントアウトすると自動で読み込まれないようになります

特定のテストで大量のデータを使用したい場合は、factorybotを使う方法が無難なのでしょうか?

どちらでもよいです。RSpec を利用している方は FactoryBot の方を使っている印象があります。

user_controller_testや、post_controller_testなど「任意のテスト」で「特定のfixtureファイルだけ読み込む」といった方法がありますか?

fixture :xxx ようにして特定のfixtureファイルだけ読み込めます

ついでに言うと、「ページネーションの動作確認」は、will_paginate 側で十分テストされているライブラリ側のロジックですので、アプリケーション側でテストする必要性はかなり低いです。
それでもきちんとテストを書きたいのであればテスト環境のときだけ1ページあたりの件数を2件などにして、fixtureで3件のデータを用意してテストを書けば十分です。
「パフォーマンスのテスト」をしたいのか「ロジックのテスト」をしたいのか考えると良いです。

投稿2019/10/02 01:02

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kenkenbbb

2019/10/02 03:54

回答ありがとうございます! > fixtures :all の部分をコメントアウトすると自動で読み込まれないようになります test_helper.rbでfixtureの設定をしているのですね。大変勉強になりました。 結果として、任意のテストで特定のfixtureを読み込むことが出来ました。ありがとうございます。 > 「パフォーマンスのテスト」をしたいのか「ロジックのテスト」をしたいのか考えると良いです。 ご指摘の通りですね。質問の意図がわかりずらくなっていました。お恥ずかしい限りです。。 will_pagginateのロジックテストは考えておらず、「実装側で適切にwill_paginateを使用できているか?」というテストをすることが目的でした(例えば、レイアウト崩れが起きていたり、翻訳定義した内容が正しく反映されているか等) そのため、「大量のデータを作成する」のではなく、「テスト環境のときだけ1ページあたりの件数を2件などに設定する」ということに注力し、「パフォーマンスのテスト」を行うことが最終目標だと思いました。 まだまだ勉強中の身ですが、大変参考になる考えを教えて頂き、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問