What is an effective way to use the Bullet Gem with RSpec? Right now I feel if I use it with my current unit test framework I get a lot of notifications or failures of tests because of n+1 queries within the tests themselves that are not related to what happens in my production application, such as checking a value or association. As such, fixing the n+1 failures does not require setting anything on my controllers or models, rather it requires setting something in my test setup to not throw that particular error and I see no real performance improvement on my application.
Reducing n+1 queries using the Bullet and RSpec gems
2k Views Asked by nobody At
1
There are 1 best solutions below
Related Questions in RUBY-ON-RAILS
- Missing Header (Feature Title and Toolbar) on some Feature Work Items in TFS Web Access
- Upgrading separate Project Collection Database to new TFS Version
- OpsHub Visual Studio Online Migration Utility Hangs on Creating Configuration
- The merge tool is not showing when call Workspace.ResolveConflict method in TFS 2012
- HowTo: change a project's status from `Invalid` to `Valid`?
- TFS 2013 Object reference not set to an instance of an object in Team Explorer
- Release Management for Visual Studio 2013 - Release Exception
- Visual studio 2013 team project has been deleted
- TFS version control does not show conflicts
- include typescript file in output result build with TFS
Related Questions in RUBY
- Missing Header (Feature Title and Toolbar) on some Feature Work Items in TFS Web Access
- Upgrading separate Project Collection Database to new TFS Version
- OpsHub Visual Studio Online Migration Utility Hangs on Creating Configuration
- The merge tool is not showing when call Workspace.ResolveConflict method in TFS 2012
- HowTo: change a project's status from `Invalid` to `Valid`?
- TFS 2013 Object reference not set to an instance of an object in Team Explorer
- Release Management for Visual Studio 2013 - Release Exception
- Visual studio 2013 team project has been deleted
- TFS version control does not show conflicts
- include typescript file in output result build with TFS
Related Questions in RSPEC
- Missing Header (Feature Title and Toolbar) on some Feature Work Items in TFS Web Access
- Upgrading separate Project Collection Database to new TFS Version
- OpsHub Visual Studio Online Migration Utility Hangs on Creating Configuration
- The merge tool is not showing when call Workspace.ResolveConflict method in TFS 2012
- HowTo: change a project's status from `Invalid` to `Valid`?
- TFS 2013 Object reference not set to an instance of an object in Team Explorer
- Release Management for Visual Studio 2013 - Release Exception
- Visual studio 2013 team project has been deleted
- TFS version control does not show conflicts
- include typescript file in output result build with TFS
Related Questions in RAILS-BULLET
- Missing Header (Feature Title and Toolbar) on some Feature Work Items in TFS Web Access
- Upgrading separate Project Collection Database to new TFS Version
- OpsHub Visual Studio Online Migration Utility Hangs on Creating Configuration
- The merge tool is not showing when call Workspace.ResolveConflict method in TFS 2012
- HowTo: change a project's status from `Invalid` to `Valid`?
- TFS 2013 Object reference not set to an instance of an object in Team Explorer
- Release Management for Visual Studio 2013 - Release Exception
- Visual studio 2013 team project has been deleted
- TFS version control does not show conflicts
- include typescript file in output result build with TFS
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
Popular # Hahtags
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
The most effective way is not at all. There may be some legitimate advantages to reducing n+1 queries in tests, most obviously to speed up overall execution time. It is quite possible, however, that you are either testing too much or making less significant gains than what is possible. I also usually find it unappealing to write additional code to help prop up tests, rather than to contribute to the overall value of the application.
Please allow me to propose an alternate use of your time. Only unit test to the absolute minimum of your comfort level. I personally like to focus on complex methods involving validation related issues and money or other math, you may have different priorities. Drawing the line will free up a whole bunch of time writing the most useless and fragile part of your test suite that will occupy the majority of your maintenance budget.
Now, what to do will all of your extra time? Don't worry, we'll find something for you to do... You can start by writing some acceptance tests, particularly for the areas that use the objects that you just dropped a whole bunch of unit tests for. Now your n+1 warnings are actually coming from the same spot they will when the user hits the page. Now you can go on to remove all of the n+1 queries.
But wait! Don't do that either. Instead, spend a good deal less time setting up your relationships to use the touch option. Then, when a child object gets updated, the parent will be updated, too. What the hell does this have to do with n+1 queries, you might be wondering. It seems like we're just adding queries...
That's where the Russian doll caching comes in. Adding this, and properly testing it, will consume the freed up unit testing and n+1 elimination time (and then some, if you're not careful). The nice thing is that it is way more "real world", much more resilient to insignificant or irrelevant implementation changes in your models and whatnot, and a huge performance boost to your application well beyond what eliminating every n+1 query by eagerly loading everything up front might have provided. You will want to move as much as possible into nested caching and load everything as lazily as humanly possible, to take full advantage of this method.
Long live n+1!