<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>The Devver Blog</title>
	<atom:link href="https://devver.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://devver.wordpress.com</link>
	<description>A Boulder startup improving the way developers work.</description>
	<lastBuildDate>Mon, 10 May 2010 23:44:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='devver.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>https://s0.wp.com/i/buttonw-com.png</url>
		<title>The Devver Blog</title>
		<link>https://devver.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="https://devver.wordpress.com/osd.xml" title="The Devver Blog" />
	<atom:link rel='hub' href='https://devver.wordpress.com/?pushpress=hub'/>
	<item>
		<title>New blog location</title>
		<link>https://devver.wordpress.com/2010/05/04/new-blog-location/</link>
					<comments>https://devver.wordpress.com/2010/05/04/new-blog-location/#comments</comments>
		
		<dc:creator><![CDATA[Ben]]></dc:creator>
		<pubDate>Tue, 04 May 2010 13:28:05 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">http://devver.net/blog/?p=1808</guid>

					<description><![CDATA[We&#8217;ll soon be moving our blog to https://devver.wordpress.com so that our existing posts will be available in the future. However, we won&#8217;t be posting any new content.]]></description>
										<content:encoded><![CDATA[<p>We&#8217;ll soon be moving our blog to <a href="https://devver.wordpress.com/">https://devver.wordpress.com</a> so that our existing posts will be available in the future. However, we won&#8217;t be posting any new content.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://devver.wordpress.com/2010/05/04/new-blog-location/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		
		<media:content url="https://1.gravatar.com/avatar/da13c07bd62a36517ce95164ff92b7b8fb2815ec3c77ad0ac19ca8caf5060d85?s=96&#38;d=https%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">bhbrinckerhoff</media:title>
		</media:content>
	</item>
		<item>
		<title>Devver.next</title>
		<link>https://devver.wordpress.com/2010/04/30/devver-next/</link>
					<comments>https://devver.wordpress.com/2010/04/30/devver-next/#comments</comments>
		
		<dc:creator><![CDATA[DanM]]></dc:creator>
		<pubDate>Fri, 30 Apr 2010 15:45:07 +0000</pubDate>
				<category><![CDATA[Boulder]]></category>
		<category><![CDATA[Devver]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[TechStars]]></category>
		<category><![CDATA[TechStars. Devver]]></category>
		<guid isPermaLink="false">http://devver.net/blog/?p=1797</guid>

					<description><![CDATA[We announced about two weeks ago that Devver and Caliper would be shutting down. The Caliper service will be shut down on April 30th, and Devver will be ceasing operations. We shared some of our thoughts about lessons learned while working on Devver. Now people have been asking what Ben and I will be doing [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>We announced about two weeks ago that <a href="http://devver.net/blog/2010/04/closing-up-shop/">Devver and Caliper would be shutting down</a>. The Caliper service will be shut down on April 30th, and Devver will be ceasing operations. We shared some of our thoughts about <a href='http://devver.net/blog/2010/04/lessons-learned/'>lessons learned</a> while working on Devver.</p>
<p>Now people have been asking what Ben and I will be doing next. Honestly, at the moment it remains a mystery as much to us as to anyone. Both Ben and I have been working on startups together for over 3 years, something we had talked about doing together since high school. After our experience we both plan to take a bit of time off, to work on open source, personal projects, learn new things, and maybe catch up on some hobbies that have been neglected. Since Devver and the structure around it will be disappearing, we wanted to share our personal contact info in case anyone wants to get in touch with us. We will be looking at new work to get involved with sometime in May. Feel free to contact either of us if there is an opportunity one of us might be interested in.</p>
<p>Ben Brinckerhoff can be found online at <a href="http://bbrinck.com">bbrinck.com</a>, and his email is <a href="mailto:ben@bbrinck.com">ben@bbrinck.com</a></p>
<p>Dan Mayer can be found online at <a href="http://mayerdan.com">mayerdan.com</a>, and his email is <a href="mailto:dan@mayerdan.com">dan@mayerdan.com</a></p>
<p>We have learned an amazing amount over the last couple of years. We both feel like this has been an amazing opportunity and one last time want to thank everyone for their support. Thanks to the Ruby community, all the awesome <a href='http://techstars.org'>Techstars teams</a>, the startup community, our friends, families, and investors. We never would have made it this far and lasted this long in the startup world without all of you.</p>
<p>Next? Life is a journey, and we are excited to see whatever the future brings us. Thanks for all the good times, knowledge learned, and all the amazing people we met along the way.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://devver.wordpress.com/2010/04/30/devver-next/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		
		<media:content url="https://0.gravatar.com/avatar/c254e8a89de091736bd87dc5e10077af7dfd03b0a8ef754778919e59175f4d07?s=96&#38;d=https%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">danmayer</media:title>
		</media:content>
	</item>
		<item>
		<title>Our Terms of Service and Privacy Policy &#8211; Prepare to Fork</title>
		<link>https://devver.wordpress.com/2010/04/28/our-terms-of-service-and-privacy-policy-prepare-to-fork/</link>
					<comments>https://devver.wordpress.com/2010/04/28/our-terms-of-service-and-privacy-policy-prepare-to-fork/#comments</comments>
		
		<dc:creator><![CDATA[Ben]]></dc:creator>
		<pubDate>Wed, 28 Apr 2010 16:37:27 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[creative commons]]></category>
		<category><![CDATA[privacy policy]]></category>
		<category><![CDATA[terms of service]]></category>
		<guid isPermaLink="false">http://devver.net/blog/?p=1789</guid>

					<description><![CDATA[Like any hackers, we like reuse and dislike unnecessarily re-inventing the wheel*. So when we were writing our Terms of Service and Privacy Policy for Caliper, we wanted to make sure that we created documents that were under the Creative Commons license, so other startups could save time by re-using our work. We also hate [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Like any hackers, we like reuse and dislike unnecessarily re-inventing the wheel*. So when we were writing our Terms of Service and Privacy Policy for Caliper, we wanted to make sure that we created documents that were under the <a href="http://creativecommons.org/">Creative Commons</a> license, so other startups could save time by re-using our work.</p>
<p>We also hate most legal docs, so our other goal was to make the docs readable. We tried our best to reduce the legalese and shorten the documents so it&#8217;s actually possible to read them and understand what they say.</p>
<p>In order to give our documents a permanent home, we recently put both our <a href="http://gist.github.com/380029">Terms of Service</a> and <a href="http://gist.github.com/380044">Privacy Policy </a>on GitHub&#8217;s <a href="http://gist.github.com/">Gist</a>. Bonus: if you have an improvement, you can just fork and modify. Enjoy!</p>
<p><span id="more-1789"></span></p>
<p>* To be fair, hackers like re-inventing the wheel if the project in question is fun or intellectually stimulating to write. But legal docs definitely do not qualify.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://devver.wordpress.com/2010/04/28/our-terms-of-service-and-privacy-policy-prepare-to-fork/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		
		<media:content url="https://1.gravatar.com/avatar/da13c07bd62a36517ce95164ff92b7b8fb2815ec3c77ad0ac19ca8caf5060d85?s=96&#38;d=https%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">bhbrinckerhoff</media:title>
		</media:content>
	</item>
		<item>
		<title>Lessons Learned</title>
		<link>https://devver.wordpress.com/2010/04/26/lessons-learned/</link>
					<comments>https://devver.wordpress.com/2010/04/26/lessons-learned/#comments</comments>
		
		<dc:creator><![CDATA[Ben]]></dc:creator>
		<pubDate>Mon, 26 Apr 2010 18:04:24 +0000</pubDate>
				<category><![CDATA[Devver]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[TechStars]]></category>
		<category><![CDATA[lessons]]></category>
		<category><![CDATA[minimum viable product]]></category>
		<guid isPermaLink="false">http://devver.net/blog/?p=1778</guid>

					<description><![CDATA[As we&#8217;ve begun to wrap things up here at Devver, we&#8217;ve had the chance to reflect a bit on our experience. Although shutting down is not the outcome we wanted, it&#8217;s clear to both Dan and I that doing a startup has been an amazing learning experience. While we still have a lot to learn, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>As we&#8217;ve begun to wrap things up here at Devver, we&#8217;ve had the  chance to reflect a bit on our experience. Although shutting down is not  the outcome we wanted, it&#8217;s clear to both Dan and I that doing a  startup has been an amazing learning experience. While we still have a  lot to learn, we wanted to share some of the most important lessons  we&#8217;ve learned during this time.</p>
<p><strong>The community</strong></p>
<p>When we  started Devver, we were hesitant to ask for feedback and help. We  quickly found that people are incredibly helpful and generous with their  time. Users were willing to take a chance and use our products while  giving us valuable feedback. Fellow Rubyists gave us ideas and helped us  with technical problems. Mentors made time for meetings and introduced  us to others who could assist us. And other entrepreneurs, both new and  seasoned, were happy to share stories, compare experiences, and offer  support.</p>
<p>If you are working on a startup, don&#8217;t be afraid to ask  for help! The vast majority of people want to help you succeed, provided  that you respect them and their time. That means you need to prepare  adequately (do your research and ask good questions), figure out their  preferred methods of communication (e.g. don&#8217;t call if they prefer  email), show up on time, don&#8217;t overburden them, and thank them. And when  other people need your help, give back!</p>
<p>You can build awesome  relationships with various communities on your own, but we strongly  recommend joining a mentorship program like <a id="zc5_" title="TechStars" href="http://techstars.org/">TechStars</a>.  The program accelerated the process of connecting with mentors, users,  and other entrepreneurs by providing an amazing community during the  summer (and to this day). The advice, introductions, and support have  been simply incredible.</p>
<p><strong>Founding team</strong></p>
<p>Dan and I  are both technical founders. Looking back, it would have been to our  advantage to have a third founder who really loved the business aspect  of running a startup.</p>
<p>There is a belief (among technical  founders) that technical founders are sufficient for a successful  startup. Or, put more harshly, that <span><span style="color:#000000;">&#8220;<a id="hto-" title="you can teach a hacker business, but you can't teach a  businessman how to hack" href="http://news.ycombinator.com/item?id=545559">you can teach a hacker business, but you can&#8217;t  teach a businessman how to hack</a>&#8220;. I don&#8217;t want to argue whether  that&#8217;s true or not. Clearly there are <a id="k.e4" title="examples" href="http://google.com/">examples</a> of technical founders being  sufficient to get a company going, but my point is that having solely  technical founders is non-optimal. You can teach a hacker business, but  you can&#8217;t make him or her get excited about it, which means it may not  get the time or attention it deserves.</span></span></p>
<p>Hackers are passionate  about, well, hacking. And so we tend to measure progress in terms of  features completed or lines of code written. Clearly, code needs to be  written, but ideally a startup would have a founder who is working on  important non-technical tasks: talking with customers, measuring key  metrics, developing distribution channels, etc. I&#8217;m not advocating that  only one founder works on these tasks while technical founders ignore  customer development &#8211; everyone needs to get involved. Rather, I&#8217;m  pointing out that given a choice, technical founders will tend to solve  problems technically and having a founder who has the opposite default  is valuable.</p>
<p><strong>Remote teams</strong></p>
<p>We embraced  working remotely: we hired <a id="fz5m" title="Avdi" href="http://avdi.org/">Avdi</a> to work in Pennsylvania while Dan and I lived in  Boulder and later on, Dan moved to Washington, DC. There are <a id="o9gf" title="many benefits" href="http://toni.org/2010/03/08/5-reasons-why-your-company-should-be-distributed/">many benefits</a> to having a  distributed team, but two stood out in our experience. First, we could  hire top talent without having to worry about location (in fact, our  flexibility regarding location was very attractive to most candidates we  interviewed). Secondly, being in different locations allowed every team  member to work with minimal distractions, which is invaluable when it  comes to efficiently writing good code.</p>
<p>That said, communication  was a challenge. To ensure we were all synced up, we had a daily standup  as well as a weekly review. When Dan moved to DC, he and I scheduled  another weekly meeting with no set agenda to just bring up all the  issues, large and small, that were on our minds. We also all got  together in the same location every few months to work in the same room  and rekindle our team energy.</p>
<p>Also, pair programming was  difficult to do remotely and we never came up with a great solution. As a  result, we spent less than a day pairing a week on average.</p>
<p>The  most significant drawback to a remote team is the administrative hassle.  It&#8217;s a pain to manage payroll, unemployment, insurance, etc in one  state. It&#8217;s a freaking nightmare to manage in three states (well, two  states and a district), even though we paid a <a id="f8-l" title="payroll service" href="http://www.paychex.com/">payroll  service</a> to take care of it. Apparently, once your startup gets  larger, there are <a id="hz2k" title="companies" href="http://administaff.com/">companies</a> that will manage this with minimal  hassle, but for a small team, it was a major annoyance and distraction.</p>
<p><strong>Product development</strong></p>
<p>Most of the mistakes we made developing our test  accelerator and, later, Caliper boiled down to one thing: we should have  focused more on customer development and finding a minimum viable  product (MVP).</p>
<p>The first thing we worked on was our Ruby test  accelerator. At the time, we thought we <em>had found</em> our MVP: we had  made encouraging technical progress and we had talked to several  potential customers who were excited about the product we were building.  Anything simpler seems &#8220;too simple&#8221; to be interesting.</p>
<p>Our  mistake at that point was to go &#8220;heads down&#8221; and focus on building the  accelerator while minimizing our contact with users and customers (after  all, we <em>knew</em> how great it was and time spent talking to  customers was time we could be hacking!). We should have asking, &#8220;Is  there an even simpler version of this product that we can deliver sooner  to learn more about pricing, market size, and technical challenges?&#8221;</p>
<p>If  we had done so, we would have discovered:</p>
<div id="bullets">
<ul>
<li>whether the need  was great enough (and if the solution was good enough) to convince  people to open their wallets</li>
<li>that while a few users acutely  felt the pain of slow tests, most didn&#8217;t care about acceleration.  However, many of those users did want a &#8220;simpler&#8221; application &#8211;  non-accelerated Ruby cloud testing.</li>
<li>the primary technical  challenge was not accelerating tests, it was configuring servers for  customers&#8217; Rails applications. Not only did we spend time focusing on  the wrong technical challenges, we also made architectural decisions  that actually made it harder to solve this core problem.</li>
</ul>
</div>
<p>After  eventually discovering that setup and configuration was our primary  adoption problem (and after trying and failing to implement various  strategies to make it simple and easy), we tried to move to the other  end of the spectrum. Caliper was designed to provide value with zero  setup or configuration &#8211; users just provided a link to source code and  instantly got valuable data.</p>
<p>Unfortunately, we again made the  mistake of focusing on engineering first and customer development  second. We released our first version to some moderate success and then  proceeded to continue to churn out features without really understanding  customer needs. Only later on, after finally engaging potential  customers did we realize that market was too small and price point was  to low to have Caliper sustain our company by itself.</p>
<p><strong>Conclusion</strong></p>
<p>This  is by no means a comprehensive list, but it is our hope that other  startups and founders-to-be can learn from our experiences, both  mistakes and successes. Doing a startup has been an incredible learning  experience for both Dan and I and we look forward to learning more in  the future &#8211; both first-hand and from the amazing group of entrepreneurs  and hackers that we&#8217;ve been privileged enough to know.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://devver.wordpress.com/2010/04/26/lessons-learned/feed/</wfw:commentRss>
			<slash:comments>45</slash:comments>
		
		
		
		<media:content url="https://1.gravatar.com/avatar/da13c07bd62a36517ce95164ff92b7b8fb2815ec3c77ad0ac19ca8caf5060d85?s=96&#38;d=https%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">bhbrinckerhoff</media:title>
		</media:content>
	</item>
		<item>
		<title>Closing up shop</title>
		<link>https://devver.wordpress.com/2010/04/19/closing-up-shop/</link>
					<comments>https://devver.wordpress.com/2010/04/19/closing-up-shop/#comments</comments>
		
		<dc:creator><![CDATA[Ben]]></dc:creator>
		<pubDate>Tue, 20 Apr 2010 00:17:15 +0000</pubDate>
				<category><![CDATA[Devver]]></category>
		<guid isPermaLink="false">http://devver.net/blog/?p=1769</guid>

					<description><![CDATA[Today we&#8217;re officially announcing that Devver (and our Caliper service) will be shutting down on Friday, April 30th. This was one of the hardest decisions we&#8217;ve ever had to make, but, after careful consideration, we&#8217;ve decided it is the right one. Nearly two years ago, we started Devver with the vision of using the cloud [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Today we&#8217;re officially announcing that Devver (and our Caliper service) will be shutting down on Friday, April 30th.</p>
<p>This was one of the hardest decisions we&#8217;ve ever had to make, but, after careful consideration, we&#8217;ve decided it is the right one.</p>
<p>Nearly two years ago, we started Devver with the vision of using the cloud to build tools that would change developers lives. We&#8217;ve worked hard to achieve that vision, but ultimately we&#8217;ve had to face the reality that the services we&#8217;ve built will not generate the revenue necessary to sustain and grow our company (although it could be used to enhance or complement another cloud product or service &#8211; <a href="mailto:ben@devver.net">contact me</a> if you&#8217;re interested).</p>
<p>To all of our users &#8211; thank you so much for taking a chance by using our tools, for reporting bugs, and for giving us ideas for the future. We deeply appreciate each and every one of you.</p>
<p>While this is not the end we wanted, we know how fortunate we were to  be able to take this journey and thank everyone &#8211; friends, family,  investors, mentors, users, and the Ruby community &#8211; who helped us along  the way. You&#8217;re all awesome and we couldn&#8217;t have gone this far without you. Thank you.</p>
<p>&#8211; Ben &amp; Dan</p>
]]></content:encoded>
					
					<wfw:commentRss>https://devver.wordpress.com/2010/04/19/closing-up-shop/feed/</wfw:commentRss>
			<slash:comments>37</slash:comments>
		
		
		
		<media:content url="https://1.gravatar.com/avatar/da13c07bd62a36517ce95164ff92b7b8fb2815ec3c77ad0ac19ca8caf5060d85?s=96&#38;d=https%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">bhbrinckerhoff</media:title>
		</media:content>
	</item>
		<item>
		<title>Speeding up multi-browser Selenium Testing using concurrency</title>
		<link>https://devver.wordpress.com/2010/04/08/speeding-up-multi-browser-selenium-testing-using-concurrenc/</link>
					<comments>https://devver.wordpress.com/2010/04/08/speeding-up-multi-browser-selenium-testing-using-concurrenc/#comments</comments>
		
		<dc:creator><![CDATA[DanM]]></dc:creator>
		<pubDate>Thu, 08 Apr 2010 17:07:07 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Tools]]></category>
		<guid isPermaLink="false">http://devver.net/blog/?p=1739</guid>

					<description><![CDATA[I haven&#8217;t used Selenium for awhile, so I took some time to dig into the options to get some mainline tests running against Caliper in multiple browsers. I wanted to be able to test a variety of browsers against our staging server before pushing new releases. Eventually this could be integrated into Continuous Integration (CI) [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I haven&#8217;t used Selenium for awhile, so I took some time to dig into the options to get some mainline tests running against <a href="http://getcaliper.com">Caliper</a> in multiple browsers. I wanted to be able to test a variety of browsers against our staging server before pushing new releases. Eventually this could be integrated into Continuous Integration (CI) or Continuous Deployment (CD).</p>
<p>The state of <a href="http://seleniumhq.org/">Selenium</a> testing for Rails is currently in flux:</p>
<div id="bullets">
<ul>
<li><a href="http://en.wikipedia.org/wiki/Selenium_(software)">Selenium Core/IDE (integrated browser test runner) vs. Selenium RC</a></li>
<li><a href="http://seleniumhq.org/docs/09_webdriver.html">Webdriver/Selenium 2.0</a></li>
<li><a href="http://groups.google.com/group/ruby-capybara/browse_thread/thread/4bcc26a9cfa20ef2/6ec0025cc791f767?hide_quotes=no&amp;pli=1">Webrat and Capybara are merging</a></li>
</ul>
<p>So there are multiple gems / frameworks:</p>
<ul>
<li><a href="http://seleniumhq.org/projects/on-rails/">selenium-on-rails</a> (Selenium IDE/Core test runner)</li>
<li><a href="http://github.com/ph7/selenium-client">selenium-client</a> (Selenium RC)</li>
<li><a href="http://github.com/brynary/webrat">Webrat</a> (uses selenium-client)</li>
<li><a href="http://github.com/jnicklas/capybara">Capybara</a> (supports WebDriver / Selenium 2.0)</li>
<li>and likely others&#8230;</li>
</ul>
</div>
<p>I decided to investigate several options to determine which is the best approach for our tests.</p>
<h3>selenium-on-rails</h3>
<p>I originally wrote a couple example tests using the selenium-on-rails plugin. This allows you to browse to your local development web server at &#8216;/selenium&#8217; and run tests in the browser using the Selenium test runner. It is simple and the most basic Selenium mode, but it obviously has limitations. It wasn&#8217;t easy to run many different browsers using this plugin, or use with Selenium-RC, and the plugin was fairly dated. This lead me to try simplest next thing, selenium-client</p>
<pre class="brush: ruby; title: ; notranslate">open '/'
assert_title 'Hosted Ruby/Rails metrics - Caliper'
verify_text_present 'Recently Generated Metrics'

click_and_wait "css=#projects a:contains('Projects')"
verify_text_present 'Browse Projects'

click_and_wait "css=#add-project a:contains('Add Project')"
verify_text_present 'Add Project'

type 'repo','git://github.com/sinatra/sinatra.git'
click_and_wait "css=#submit-project"
verify_text_present 'sinatra/sinatra'
wait_for_element_present "css=#hotspots-summary"
verify_text_present 'View full Hot Spots report'</pre>
<p><a href='http://gist.github.com/359448'>view this gist</a></p>
<h3>selenium-client</h3>
<p>I quickly converted my selenium-on-rails tests to selenium-client tests, with some small modifications. To run tests using selenium-client, you need to run a <a href="http://seleniumhq.org/projects/remote-control/">selenium-RC</a> server. I setup <a href="http://saucelabs.com/products/downloads">Sauce RC</a> on my machine and was ready to go. I configured the tests to run locally on a single browser (Firefox). Once that was working I wanted to run the same tests in multiple browsers. I found that it was easy to dynamically create a test for each browser type and run them using selenium-RC, but that it was increadly slow, since tests run one after another and not concurrently.  Also, you need to install each browser (plus multiple versions) on your machine. This led me to use Sauce Labs&#8217; <a href="http://saucelabs.com/products/docs/sauce-ondemand">OnDemand</a>.</p>
<pre class="brush: ruby; title: ; notranslate">browser.open '/'
assert_equal 'Hosted Ruby/Rails metrics - Caliper', browser.title
assert browser.text?('Recently Generated Metrics')

browser.click "css=#projects a:contains('Projects')", :wait_for =&gt; :page
assert browser.text?('Browse Projects')

browser.click "css=#add-project a:contains('Add Project')", :wait_for =&gt; :page
assert browser.text?('Add Project')

browser.type 'repo','git://github.com/sinatra/sinatra.git'
browser.click "css=#submit-project", :wait_for =&gt; :page
assert browser.text?('sinatra/sinatra')
browser.wait_for_element "css=#hotspots-summary"
assert browser.text?('View full Hot Spots report')</pre>
<p><a href='http://gist.github.com/359450'>view this gist</a></p>
<h3>Using Selenium-RC and Sauce Labs Concurrently</h3>
<p>Running on <a href="http://saucelabs.com/products/docs/sauce-ondemand/browsers">all the browsers Sauce Labs</a> offers (12) took <span style="color:#ff0000;">910 seconds</span>. Which is cool, but way too slow, and since I am just running the same tests over in different browsers, I decided that it should be done concurrently. If you are running your own Selenium-RC server this will slow down a lot as your machine has to start and run all of the various browsers, so this approach isn&#8217;t recommended on your own Selenium-RC setup, unless you configure <a href="http://selenium-grid.seleniumhq.org/">Selenium-Grid</a>. If you are using  Sauce Labs, the tests run concurrently with no slow down. After switching to concurrently running my Selenium tests, run time went down to <span style="color:#339966;">70 seconds</span>.</p>
<p>My main goal was to make it easy to write pretty standard tests a single time, but be able to change the number of browsers I ran them on and the server I targeted. One approach that has been offered explains how to setup <a href="http://wolfewebservices.com/blog/testing-multiple-browsers-selenium-and-cucumber">Cucumber to run Selenium tests against multiple browsers</a>. This basically runs the rake task over and over for each browser environment.</p>
<p>Althought this works, I also wanted to run all my tests concurrently. One option would be to concurrently run all of the Rake tasks and join the results. Joining the results is difficult to do cleanly or you end up outputting the full rake test output once per browser (ugly when running 12 times). I took a slightly different approach which just wraps any Selenium-based test in a run_in_browsers block. Depending on the options set, the code can run a single browser against your locally hosted application, or many browsers against a staging or production server. Then simply create a separate Rake task for each of the configurations you expect to use (against local selenium-RC and Sauce Labs on demand).</p>
<p>I am pretty happy with the solution I have for now. It is simple and fast and gives another layer of assurances that Caliper is running as expected. Adding additional tests is simple, as is integrating the solution into our CI stack. There are likely many ways to solve the concurrent selenium testing problem, but I was able to go from no Selenium tests to a fast multi-browser solution in about a day, which works for me. There are downsides to the approach, the error output isn&#8217;t exactly the same when run concurrently, but it is pretty close.  As opposed to seeing multiple errors for each test, you get a single error per test which includes the details about what browsers the error occurred on.</p>
<p>In the future I would recommend closely watching Webrat and Capybara which I would likely use to drive the Selenium tests. I think the eventual merge will lead to the best solution in terms of flexibility. At the moment Capybara doesn&#8217;t support selenium-RC, and the tests I originally wrote didn&#8217;t convert to the Webrat API as easily as directly to selenium-client (although setting up <a href="http://www.brynary.com/2009/4/6/switching-webrat-to-selenium-mode">Webrat to use Selenium</a> looks pretty simple). The example code given could likely be adapted easily to work with existing Webrat tests.</p>
<pre class="brush: ruby; title: ; notranslate">namespace :test do
  namespace :selenium do

    desc "selenium against staging server"
    task :staging do
      exec "bash -c 'SELENIUM_BROWSERS=all SELENIUM_RC_URL=saucelabs.com SELENIUM_URL=http://caliper-staging.heroku.com/  ruby test/acceptance/walkthrough.rb'"
    end

    desc "selenium against local server"
    task :local do
      exec "bash -c 'SELENIUM_BROWSERS=one SELENIUM_RC_URL=localhost SELENIUM_URL=http://localhost:3000/ ruby test/acceptance/walkthrough.rb'"
    end
  end
end</pre>
<p><a href='http://gist.github.com/359463'>view this gist</a> </p>
<pre class="brush: ruby; title: ; notranslate">require "rubygems"
require "test/unit"
gem "selenium-client", "&gt;=1.2.16"
require "selenium/client"
require 'threadify'

class ExampleTest  1
      errors = []
      browsers.threadify(browsers.length) do |browser_spec|
        begin
          run_browser(browser_spec, block)
        rescue =&gt; error
          type = browser_spec.match(/browser\": \"(.*)\", /)[1]
          version = browser_spec.match(/browser-version\": \"(.*)\",/)[1]
          errors &lt; type, :version =&gt; version, :error =&gt; error}
        end
      end
      message = ""
      errors.each_with_index do |error, index|
        message +="\t[#{index+1}]: #{error[:error].message} occurred in #{error[:browser]}, version #{error[:version]}\n"
      end
      assert_equal 0, errors.length, "Expected zero failures or errors, but got #{errors.length}\n #{message}"
    else
      run_browser(browsers[0], block)
    end
  end

  def run_browser(browser_spec, block)
    browser = Selenium::Client::Driver.new(
                                           :host =&gt; selenium_rc_url,
                                           :port =&gt; 4444,
                                           :browser =&gt; browser_spec,
                                           :url =&gt; test_url,
                                           :timeout_in_second =&gt; 120)
    browser.start_new_browser_session
    begin
      block.call(browser)
    ensure
      browser.close_current_browser_session
    end
  end

  def test_basic_walkthrough
    run_in_all_browsers do |browser|
      browser.open '/'
      assert_equal 'Hosted Ruby/Rails metrics - Caliper', browser.title
      assert browser.text?('Recently Generated Metrics')

      browser.click "css=#projects a:contains('Projects')", :wait_for =&gt; :page
      assert browser.text?('Browse Projects')

      browser.click "css=#add-project a:contains('Add Project')", :wait_for =&gt; :page
      assert browser.text?('Add Project')

      browser.type 'repo','git://github.com/sinatra/sinatra.git'
      browser.click "css=#submit-project", :wait_for =&gt; :page
      assert browser.text?('sinatra/sinatra')
      browser.wait_for_element "css=#hotspots-summary"
      assert browser.text?('View full Hot Spots report')
    end
  end

  def test_generate_new_metrics
    run_in_all_browsers do |browser|
      browser.open '/'
      browser.click "css=#add-project a:contains('Add Project')", :wait_for =&gt; :page
      assert browser.text?('Add Project')

      browser.type 'repo','git://github.com/sinatra/sinatra.git'
      browser.click "css=#submit-project", :wait_for =&gt; :page
      assert browser.text?('sinatra/sinatra')

      browser.click "css=#fetch"
      browser.wait_for_page
      assert browser.text?('sinatra/sinatra')
    end
  end

end
</pre>
<p><a href='http://gist.github.com/359460'>view this gist</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://devver.wordpress.com/2010/04/08/speeding-up-multi-browser-selenium-testing-using-concurrenc/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		
		<media:content url="https://0.gravatar.com/avatar/c254e8a89de091736bd87dc5e10077af7dfd03b0a8ef754778919e59175f4d07?s=96&#38;d=https%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">danmayer</media:title>
		</media:content>
	</item>
		<item>
		<title>Announcing Gemcutter/Caliper integration</title>
		<link>https://devver.wordpress.com/2010/02/02/announcing-caliper-gemcutter-integration/</link>
		
		<dc:creator><![CDATA[Ben]]></dc:creator>
		<pubDate>Tue, 02 Feb 2010 19:09:33 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[caliper]]></category>
		<category><![CDATA[Gemcutter]]></category>
		<category><![CDATA[RubyGems]]></category>
		<guid isPermaLink="false">http://devver.net/blog/?p=1729</guid>

					<description><![CDATA[We&#8217;re extremely happy to announce that Caliper is now generating metrics for all gems pushed to Gemcutter! By taking advantage of the new webhooks feature in Gemcutter, Caliper is alerted whenever a new version of a gem is pushed. At that point, we automatically generate metrics. In addition, every gem page on Gemcutter now features [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>We&#8217;re extremely happy to announce that <a href="http://getcaliper.com">Caliper</a> is now generating metrics for all gems pushed to <a href="http://gemcutter.org">Gemcutter</a>!</p>
<p>By taking advantage of the <a href="http://gemcutter.org/pages/gem_docs">new webhooks feature</a> in Gemcutter, Caliper is alerted whenever a new version of a gem is pushed. At that point, we automatically generate metrics. In addition, every gem page on Gemcutter now features a &#8216;Metrics&#8217; link to the Caliper metrics.</p>
<p style="text-align:center;"><img class="aligncenter size-full wp-image-1730" title="metrics_link" src="https://devver.wordpress.com/wp-content/uploads/2010/02/metrics_link.jpg?w=700" alt="metrics_link"   /></p>
<p>We&#8217;re thrilled to be generating metrics for so many great Ruby projects. As always, please <a href="http://support.getcaliper.com/">send us feedback</a> about how we can improve Caliper!</p>
<p>For more details on webhooks, check out the <a href="http://update.gemcutter.org/2010/02/01/january-changelog.html">Changelog screencast</a> by Nick Quaranto.</p>
<p>Many, many thanks to <a href="http://litanyagainstfear.com/">Nick Quaranto</a>, <a href="http://chadfowler.com/">Chad Fowler</a>, and all the other supremely awesome Gemcutter contributors!</p>
]]></content:encoded>
					
		
		
		
		<media:content url="https://1.gravatar.com/avatar/da13c07bd62a36517ce95164ff92b7b8fb2815ec3c77ad0ac19ca8caf5060d85?s=96&#38;d=https%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">bhbrinckerhoff</media:title>
		</media:content>

		<media:content url="https://devver.wordpress.com/wp-content/uploads/2010/02/metrics_link.jpg" medium="image">
			<media:title type="html">metrics_link</media:title>
		</media:content>
	</item>
		<item>
		<title>Help us improve Caliper by taking a short survey</title>
		<link>https://devver.wordpress.com/2010/01/25/help-us-improve-caliper-by-taking-a-short-survey/</link>
		
		<dc:creator><![CDATA[Ben]]></dc:creator>
		<pubDate>Mon, 25 Jan 2010 20:49:44 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[customer development]]></category>
		<category><![CDATA[survey]]></category>
		<guid isPermaLink="false">http://devver.net/blog/?p=1726</guid>

					<description><![CDATA[If you have tried Caliper, it would help us immensely if you filled out this short, eight-question survey at Survey.io. Thanks!]]></description>
										<content:encoded><![CDATA[<p>If you have tried Caliper, it would help us immensely if you filled out this <a href="http://survey.io/survey/e007a">short, eight-question survey</a> at <a href="http://survey.io">Survey.io</a>. Thanks!</p>
]]></content:encoded>
					
		
		
		
		<media:content url="https://1.gravatar.com/avatar/da13c07bd62a36517ce95164ff92b7b8fb2815ec3c77ad0ac19ca8caf5060d85?s=96&#38;d=https%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">bhbrinckerhoff</media:title>
		</media:content>
	</item>
		<item>
		<title>Avdi Grimm on Confident Code</title>
		<link>https://devver.wordpress.com/2010/01/20/avdi-grimm-on-confident-code/</link>
		
		<dc:creator><![CDATA[DanM]]></dc:creator>
		<pubDate>Wed, 20 Jan 2010 14:02:42 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">http://devver.net/blog/?p=1721</guid>

					<description><![CDATA[Recently Avdi, gave a talk on Confident Code at B’More on Rails. I enjoyed the talk and recommend giving it a listen, if you are interested in better structured code. The slides are available here, if you want to follow along. Avdi Grimm on Confident Code at B&#8217;More on Rails from Avdi Grimm on Vimeo.]]></description>
										<content:encoded><![CDATA[<p>Recently Avdi, gave a talk on <a href="http://avdi.org/devblog/2010/01/20/confident-code-at-bmore-on-rails/">Confident Code at B’More on Rails</a>. I enjoyed the talk and recommend giving it a listen, if you are interested in better structured code. The <a href="http://avdi.org/talks/confident-code-2010-01-12/confident-code.html">slides are available here</a>, if you want to follow along.</p>
<p><a href="http://vimeo.com/8856299">Avdi Grimm on Confident Code at B&#8217;More on Rails</a> from <a href="http://vimeo.com/avdi">Avdi Grimm</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
]]></content:encoded>
					
		
		
		
		<media:content url="https://0.gravatar.com/avatar/c254e8a89de091736bd87dc5e10077af7dfd03b0a8ef754778919e59175f4d07?s=96&#38;d=https%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">danmayer</media:title>
		</media:content>
	</item>
		<item>
		<title>Upcoming improvements for Caliper</title>
		<link>https://devver.wordpress.com/2010/01/14/upcoming-improvements-for-caliper/</link>
		
		<dc:creator><![CDATA[Ben]]></dc:creator>
		<pubDate>Fri, 15 Jan 2010 00:21:47 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ui]]></category>
		<category><![CDATA[usability]]></category>
		<guid isPermaLink="false">http://devver.net/blog/?p=1714</guid>

					<description><![CDATA[For the past several weeks, you may have noticed that not much has changed on Caliper. The reason for this is that we&#8217;ve been working hard to allow you to use Caliper on your private GitHub repositories (we&#8217;re currently in private beta for that feature. If you are interested, you can sign up for a [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>For the past several weeks, you may have noticed that not much has changed on <a href="http://getcaliper.com">Caliper</a>. The reason for this is that we&#8217;ve been working hard to allow you to use Caliper on your private GitHub repositories (we&#8217;re currently in private beta for that feature. If you are interested, you can sign up for a <a href="http://getcaliper.com/beta">beta invitation</a>).</p>
<p>However, we realize that we have much to improve on Caliper. We&#8217;ve been talking with our users to identify the biggest problems and most-requested features. In addition, we&#8217;re getting help from the folks at <a href="http://viget.com">Viget Labs</a> to make Caliper easier to understand, more intuitive to use, and all around better.</p>
<p>In our first batch of work, we&#8217;ll be focusing on three improvements.</p>
<p>First, we&#8217;ll be developing an improved project dashboard. Our current dashboard isn&#8217;t terribly useful. We&#8217;d like to better represent the state of the project, important trends, and areas that need the most help. We&#8217;re working now to come up with a concrete design that addresses these issues. In the meantime, what data would you find most helpful on the dashboard?</p>
<p>We&#8217;ll also be changing the way you navigate to specific tools. Users have told us that the specific tool names (&#8216;Reek&#8217;, &#8216;Flog&#8217;) are not, by themselves, very helpful for navigation. As a result, we&#8217;ll be increasingly highlighting their function. For example, even if you aren&#8217;t familiar with Flog, we&#8217;ll make it obvious that it is a tool for measuring complexity.</p>
<p>We&#8217;re considering eventually merging tools that have a similar function. So instead of going to two different pages for Reek and Roodi results, we might just have a &#8216;code smells&#8217; report. Similarly, Flog and Saikuro might be presented within the same page. Would this be helpful?</p>
<p>To be clear, it isn&#8217;t our intention to obscure the fact that Caliper is built on great tools like metric_fu, Reek, Flog, etc. We will still make it easy to understand where the data is coming from and highlight the work being done by the dedicated open-source developers who write them. However, we think that grouping by function will make Caliper easier to use and understand.</p>
<p>Did you know that you can set up Caliper to automatically generate metrics using GitHub post-receive hooks? Did you know that, by default, up to 15 of your latest commits are automatically run through Caliper when you set up a project? Or that with one click, you can generate metrics for up to 40 commits throughout the history of your project?</p>
<p>Many users don&#8217;t know this, because our UI for these features is currently pretty terrible. The last task in the current batch of work will be to make these features more visible and easier to use. Our goal is to make it simple to see trends in your project over time.</p>
<p>(Incidentally, many users also don&#8217;t know that you can view a <a href="http://getcaliper.com/caliper/revision?previous_revision=e14c700b1814540fb70702cead90e222eedfd6a8&amp;repo=git%3A%2F%2Fgithub.com%2Fsinatra%2Fsinatra.git&amp;revision=e20797047d0f0de925810892942411e27ea9cf19">metrics diff</a> for two commits to see how a commit has changed the metrics, but making this more noticeable may or may not get tackled in the first set of changes).</p>
<p>What&#8217;s next for Caliper after we complete these changes? We&#8217;re currently talking to users about what features and improvements matter most to them. One possibility is to display some or all of our metric data directly on a view of source code itself, so you don&#8217;t have to open up an editor (or click through to GitHub) to see the code. How important is this feature to you?</p>
<p>As always, feedback from our users is hugely helpful. If you have ideas about features that you&#8217;d like to see, please let us know in the comments or start a discussion at our <a href="http://support.getcaliper.com">support site</a>. Thanks!</p>
]]></content:encoded>
					
		
		
		
		<media:content url="https://1.gravatar.com/avatar/da13c07bd62a36517ce95164ff92b7b8fb2815ec3c77ad0ac19ca8caf5060d85?s=96&#38;d=https%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">bhbrinckerhoff</media:title>
		</media:content>
	</item>
	</channel>
</rss>
