<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>rspec fast tests outside rails on random thoughts</title><link>https://awesomeprogrammer.com/categories/rspec-fast-tests-outside-rails/</link><description>Recent content in rspec fast tests outside rails on random thoughts</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sun, 30 Dec 2012 00:00:00 +0000</lastBuildDate><atom:link href="https://awesomeprogrammer.com/categories/rspec-fast-tests-outside-rails/index.xml" rel="self" type="application/rss+xml"/><item><title>How fast your tests are? - Working with rspec outside rails</title><link>https://awesomeprogrammer.com/blog/2012/12/30/how-fast-your-tests-are-working-with-rspec-outside-rails/</link><pubDate>Sun, 30 Dec 2012 00:00:00 +0000</pubDate><guid>https://awesomeprogrammer.com/blog/2012/12/30/how-fast-your-tests-are-working-with-rspec-outside-rails/</guid><description><![CDATA[<p>Rails is a great framework, isn&rsquo;t it? It&rsquo;s ships with all those great tools witch are supposed to help you automatically test your application. So you write specs, you practice TDD, BDD or maybe DDD, but over time you may notice something - it&rsquo;s getting painfully slow. You app grows, your test suite grows and suddenly testing isn&rsquo;t anymore so much fun as it supposed to be. You feel like it&rsquo;s slowing you down.</p>
<p>So you you start using <em>spork</em>, you setup all the <em>guards</em> - but that are just a bandages for a bigger problem. And the problem is - Rails is just slow. I mean not like it&rsquo;s a slow in production - when you just need to boot up your app once and that&rsquo;s it - it&rsquo;s not such a big deal - but you do it constantly in development, and more gems you add (because gems are cool, right?) it takes more and more time. Sooner or later you will start skipping on your tests and you may end up in very bad place.</p>
<p>What I started to do lately with my legacy app I was talking before is - I started testing outside rails. Rails is slow, so let&rsquo;s take everything you can outside rails and work with pure ruby and rspec. What I mean is you should try and extract some logic into separate classes/modules and test them without database and without framework. And you just need a place to start, let me give you a very simple example where I started.</p>
<p>I have heavily customized two redcarpet render engines - basically I was interested in two helper methods in my <em>ApplicationHelper</em> module. But god how I was frustrated with loading times - I have there some very <em>annoying</em> tests, because I&rsquo;m asserting html output of markdown input - as I needed absolute certainty everything worked as it supposed to the last tag.</p>
<p>So here&rsquo;s what my spec look like, I added some comments for clarity.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ruby" data-lang="ruby"><span style="display:flex;"><span><span style="color:#75715e"># spec/modules/redcarpet/markdown_spec.rb</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># obviously we will need that</span>
</span></span><span style="display:flex;"><span>require <span style="color:#e6db74">&#39;redcarpet&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># I&#39;m using cattr_accessor in one of my classes</span>
</span></span><span style="display:flex;"><span>require <span style="color:#e6db74">&#39;active_support/all&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># I&#39;m also using strip_tags methods from action view helpers</span>
</span></span><span style="display:flex;"><span>require <span style="color:#e6db74">&#39;action_view/helpers/sanitize_helper&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># so I&#39;m just including here all the methods of sanitize helper</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">include</span> <span style="color:#66d9ef">ActionView</span><span style="color:#f92672">::</span><span style="color:#66d9ef">Helpers</span><span style="color:#f92672">::</span><span style="color:#66d9ef">SanitizeHelper</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># I want my app/ directory</span>
</span></span><span style="display:flex;"><span>app_dir <span style="color:#f92672">=</span> <span style="color:#66d9ef">File</span><span style="color:#f92672">.</span>expand_path(<span style="color:#66d9ef">File</span><span style="color:#f92672">.</span>join(<span style="color:#66d9ef">File</span><span style="color:#f92672">.</span>dirname(__FILE__), <span style="color:#e6db74">&#39;..&#39;</span>, <span style="color:#e6db74">&#39;..&#39;</span>, <span style="color:#e6db74">&#39;..&#39;</span>, <span style="color:#e6db74">&#39;app&#39;</span>))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># I want my application helper (even tho I&#39;m interested in two methods here)</span>
</span></span><span style="display:flex;"><span>require <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">#{</span>app_dir<span style="color:#e6db74">}</span><span style="color:#e6db74">/helpers/application_helper.rb&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># here I also included my custom redcarpet classes,</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># but I will omit that in this example</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># ...</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># I will a class that I will test</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># and include all helper methods</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">MarkdownTest</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">extend</span> <span style="color:#66d9ef">ApplicationHelper</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">end</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># and later or it&#39;s just a &#39;regular&#39; rspec as you know it</span>
</span></span><span style="display:flex;"><span>describe <span style="color:#e6db74">&#34;Sugar Markdown&#34;</span> <span style="color:#66d9ef">do</span>
</span></span><span style="display:flex;"><span>  subject { <span style="color:#66d9ef">MarkdownTest</span><span style="color:#f92672">.</span>markdown(text) }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  context <span style="color:#e6db74">&#34;handles flags&#34;</span> <span style="color:#66d9ef">do</span>
</span></span><span style="display:flex;"><span>    let(<span style="color:#e6db74">:text</span>){ <span style="color:#e6db74">&#34;Titta :se: pa mig!&#34;</span> }
</span></span><span style="display:flex;"><span>    it { should <span style="color:#f92672">=~</span> <span style="color:#e6db74">/Titta &lt;img src=&#39;\/img\/flags\/se.gif&#39; title=&#39;Szwecja&#39; \/&gt; pa mig!/</span> }
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">end</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e"># ...</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">end</span>
</span></span></code></pre></div><p>And how fast is it? Pretty damn fast.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ time rspec spec/modules/redcarpet/
</span></span><span style="display:flex;"><span>Finished in 0.02648 seconds
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">16</span> examples, <span style="color:#ae81ff">0</span> failures
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>real  0m0.424s
</span></span><span style="display:flex;"><span>user  0m0.388s
</span></span><span style="display:flex;"><span>sys 0m0.032s
</span></span></code></pre></div><p>Now you don&rsquo;t have to wait for rails to load just to test this one part of you app and you can do true TDD - your tests won&rsquo;t slow you down anymore - they will drive you and your design. Of course you will still need to test models, controllers, do integrational tests, but I hope you see the point of testing without rails, and if you don&rsquo;t - even so I encourage you to try it for yourself.</p>]]></description><content:encoded><![CDATA[<p>Rails is a great framework, isn&rsquo;t it? It&rsquo;s ships with all those great tools witch are supposed to help you automatically test your application. So you write specs, you practice TDD, BDD or maybe DDD, but over time you may notice something - it&rsquo;s getting painfully slow. You app grows, your test suite grows and suddenly testing isn&rsquo;t anymore so much fun as it supposed to be. You feel like it&rsquo;s slowing you down.</p>
<p>So you you start using <em>spork</em>, you setup all the <em>guards</em> - but that are just a bandages for a bigger problem. And the problem is - Rails is just slow. I mean not like it&rsquo;s a slow in production - when you just need to boot up your app once and that&rsquo;s it - it&rsquo;s not such a big deal - but you do it constantly in development, and more gems you add (because gems are cool, right?) it takes more and more time. Sooner or later you will start skipping on your tests and you may end up in very bad place.</p>
<p>What I started to do lately with my legacy app I was talking before is - I started testing outside rails. Rails is slow, so let&rsquo;s take everything you can outside rails and work with pure ruby and rspec. What I mean is you should try and extract some logic into separate classes/modules and test them without database and without framework. And you just need a place to start, let me give you a very simple example where I started.</p>
<p>I have heavily customized two redcarpet render engines - basically I was interested in two helper methods in my <em>ApplicationHelper</em> module. But god how I was frustrated with loading times - I have there some very <em>annoying</em> tests, because I&rsquo;m asserting html output of markdown input - as I needed absolute certainty everything worked as it supposed to the last tag.</p>
<p>So here&rsquo;s what my spec look like, I added some comments for clarity.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ruby" data-lang="ruby"><span style="display:flex;"><span><span style="color:#75715e"># spec/modules/redcarpet/markdown_spec.rb</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># obviously we will need that</span>
</span></span><span style="display:flex;"><span>require <span style="color:#e6db74">&#39;redcarpet&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># I&#39;m using cattr_accessor in one of my classes</span>
</span></span><span style="display:flex;"><span>require <span style="color:#e6db74">&#39;active_support/all&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># I&#39;m also using strip_tags methods from action view helpers</span>
</span></span><span style="display:flex;"><span>require <span style="color:#e6db74">&#39;action_view/helpers/sanitize_helper&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># so I&#39;m just including here all the methods of sanitize helper</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">include</span> <span style="color:#66d9ef">ActionView</span><span style="color:#f92672">::</span><span style="color:#66d9ef">Helpers</span><span style="color:#f92672">::</span><span style="color:#66d9ef">SanitizeHelper</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># I want my app/ directory</span>
</span></span><span style="display:flex;"><span>app_dir <span style="color:#f92672">=</span> <span style="color:#66d9ef">File</span><span style="color:#f92672">.</span>expand_path(<span style="color:#66d9ef">File</span><span style="color:#f92672">.</span>join(<span style="color:#66d9ef">File</span><span style="color:#f92672">.</span>dirname(__FILE__), <span style="color:#e6db74">&#39;..&#39;</span>, <span style="color:#e6db74">&#39;..&#39;</span>, <span style="color:#e6db74">&#39;..&#39;</span>, <span style="color:#e6db74">&#39;app&#39;</span>))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># I want my application helper (even tho I&#39;m interested in two methods here)</span>
</span></span><span style="display:flex;"><span>require <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">#{</span>app_dir<span style="color:#e6db74">}</span><span style="color:#e6db74">/helpers/application_helper.rb&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># here I also included my custom redcarpet classes,</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># but I will omit that in this example</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># ...</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># I will a class that I will test</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># and include all helper methods</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">MarkdownTest</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">extend</span> <span style="color:#66d9ef">ApplicationHelper</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">end</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># and later or it&#39;s just a &#39;regular&#39; rspec as you know it</span>
</span></span><span style="display:flex;"><span>describe <span style="color:#e6db74">&#34;Sugar Markdown&#34;</span> <span style="color:#66d9ef">do</span>
</span></span><span style="display:flex;"><span>  subject { <span style="color:#66d9ef">MarkdownTest</span><span style="color:#f92672">.</span>markdown(text) }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  context <span style="color:#e6db74">&#34;handles flags&#34;</span> <span style="color:#66d9ef">do</span>
</span></span><span style="display:flex;"><span>    let(<span style="color:#e6db74">:text</span>){ <span style="color:#e6db74">&#34;Titta :se: pa mig!&#34;</span> }
</span></span><span style="display:flex;"><span>    it { should <span style="color:#f92672">=~</span> <span style="color:#e6db74">/Titta &lt;img src=&#39;\/img\/flags\/se.gif&#39; title=&#39;Szwecja&#39; \/&gt; pa mig!/</span> }
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">end</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e"># ...</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">end</span>
</span></span></code></pre></div><p>And how fast is it? Pretty damn fast.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ time rspec spec/modules/redcarpet/
</span></span><span style="display:flex;"><span>Finished in 0.02648 seconds
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">16</span> examples, <span style="color:#ae81ff">0</span> failures
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>real  0m0.424s
</span></span><span style="display:flex;"><span>user  0m0.388s
</span></span><span style="display:flex;"><span>sys 0m0.032s
</span></span></code></pre></div><p>Now you don&rsquo;t have to wait for rails to load just to test this one part of you app and you can do true TDD - your tests won&rsquo;t slow you down anymore - they will drive you and your design. Of course you will still need to test models, controllers, do integrational tests, but I hope you see the point of testing without rails, and if you don&rsquo;t - even so I encourage you to try it for yourself.</p>]]></content:encoded></item></channel></rss>