<?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/"
	>

<channel>
	<title>News about Agile Outsourcing and Outfarm &#124; Outfarm Blog</title>
	<atom:link href="http://www.outfarm.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.outfarm.com</link>
	<description>Agile Outsourcing, from Idea to tested Software</description>
	<lastBuildDate>Tue, 28 Jun 2011 15:48:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Rails 3: Functional controller testing when using devise and declarative authorization gems</title>
		<link>http://www.outfarm.com/2011/06/rails-3-functional-controller-testing-when-using-devise-and-declarative-authorization-gems/</link>
		<comments>http://www.outfarm.com/2011/06/rails-3-functional-controller-testing-when-using-devise-and-declarative-authorization-gems/#comments</comments>
		<pubDate>Tue, 28 Jun 2011 15:48:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://www.outfarm.com/?p=900</guid>
		<description><![CDATA[One has to give it to the developers of devise and declarative authorization, they have really created extremely useful gems. As we are using these gems extensively in our own product and also for client products and projects, we also need to test them. Now both gems offer very helpful test helpers which need just [...]]]></description>
			<content:encoded><![CDATA[<p>One has to give it to the developers of devise and declarative authorization, they have really created extremely useful gems. As we are using these gems extensively in our own product and also for client products and projects, we also need to test them. Now both gems offer very helpful test helpers which need just a little bit of help to work together. The issue arises if a controller takes advantage of both gems where we found ourselves faced with disappearing session values after signing in with devise. But after digging a little bit in the declarative authorization source code, we found how to make the two gems work together for testing. The same post can also be found on <a href="https://github.com/stffn/declarative_authorization/issues/95#issuecomment-1455995">Github</a></p>
<p><br/></p>
<p>Below code example seems to work for Rails 3.0.6, devise 1.1.5, declarative authorization 0.5.3.</p>
<p><br/></p>
<p>The sign_in test helper from devise adds the key/value pair &#8220;warden.user.user.key&#8221; => ["User",id] to the session and one has to explicitly add the session to the declarative_authorization get_with helper. The <a href="https://github.com/stffn/declarative_authorization/blob/master/lib/declarative_authorization/maintenance.rb#L198">*_with methods</a> call the <a href="https://github.com/stffn/declarative_authorization/blob/master/lib/declarative_authorization/maintenance.rb#L183">request_with</a> method which defaults the session argument to an empty hash unless one explicitly provides the session.</p>
<p><br/></p>
<p>And without the above mentioned key/value pair in the session when calling get_with, one will not get past devise&#8217;s authenticate_user! before filter.</p>
<p><br/></p>
<p>The following test in the users_controller_test.rb works when trying to access the users_controller show action which is included in the filter_resource_access and has an appropriate rule listed in the authorization rules:</p>
<p>﻿</p>
<div class="codecolorer-container ruby railscasts" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:835px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#008000; font-style:italic;">#config/authorization_rules.rb</span><br />
role <span style="color:#ff3333; font-weight:bold;">:authenticated</span> <span style="color:#9966CC; font-weight:bold;">do</span><br />
&nbsp; &nbsp; has_permission_on <span style="color:#ff3333; font-weight:bold;">:users</span>, <span style="color:#ff3333; font-weight:bold;">:to</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:show</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">do</span><br />
&nbsp; &nbsp; &nbsp; if_attribute <span style="color:#ff3333; font-weight:bold;">:id</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> is <span style="color:#006600; font-weight:bold;">&#123;</span> user.<span style="color:#9900CC;">id</span><span style="color:#006600; font-weight:bold;">&#125;</span><br />
&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
<span style="color:#008000; font-style:italic;">#app/controllers/users_controller.rb</span><br />
<span style="color:#9966CC; font-weight:bold;">class</span> UsersController <span style="color:#006600; font-weight:bold;">&lt;</span> ApplicationController<br />
&nbsp; before_filter <span style="color:#ff3333; font-weight:bold;">:authenticate_user</span>!<br />
&nbsp; filter_resource_access <br />
<br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> show &nbsp; &nbsp;<span style="color:#008000; font-style:italic;">#@user is already loaded through filter_resource_access method of the declarative_authorization gem</span><br />
&nbsp; &nbsp; respond_to <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span><span style="color:#CC0066; font-weight:bold;">format</span><span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">html</span> &nbsp;<span style="color:#006600; font-weight:bold;">&#123;</span> render <span style="color:#ff3333; font-weight:bold;">:action</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:show</span><span style="color:#006600; font-weight:bold;">&#125;</span><br />
&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
<span style="color:#008000; font-style:italic;"># test/test_helper.rb</span><br />
ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;RAILS_ENV&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">&quot;test&quot;</span><br />
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">expand_path</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'../../config/environment'</span>, <span style="color:#0000FF; font-weight:bold;">__FILE__</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'declarative_authorization/maintenance'</span><br />
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rails/test_help'</span><br />
<br />
<span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#6666ff; font-weight:bold;">ActiveSupport::TestCase</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#6666ff; font-weight:bold;">Authorization::TestHelper</span><br />
&nbsp; fixtures <span style="color:#ff3333; font-weight:bold;">:all</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
<span style="color:#008000; font-style:italic;"># test/functional/user_controller_test.rb</span><br />
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'test_helper'</span><br />
<br />
<span style="color:#9966CC; font-weight:bold;">class</span> UsersControllerTest <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActionController::TestCase</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#6666ff; font-weight:bold;">Devise::TestHelpers</span><br />
&nbsp; setup <span style="color:#9966CC; font-weight:bold;">do</span><br />
&nbsp; &nbsp; <span style="color:#0066ff; font-weight:bold;">@user</span> = users<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:authenticated</span><span style="color:#006600; font-weight:bold;">&#41;</span> &nbsp;<span style="color:#008000; font-style:italic;">#this user must obviously have symbol :authenticated as an element of the role_symbols array</span><br />
&nbsp; &nbsp;<span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
&nbsp; test <span style="color:#996600;">&quot;should get to show action if current user is equal to the called resource&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span><br />
&nbsp; &nbsp; sign_in <span style="color:#0066ff; font-weight:bold;">@user</span><br />
&nbsp; &nbsp; get_with <span style="color:#0066ff; font-weight:bold;">@user</span>, <span style="color:#ff3333; font-weight:bold;">:show</span>,<span style="color:#006600; font-weight:bold;">&#123;</span>:id<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@user</span>.<span style="color:#9900CC;">id</span><span style="color:#006600; font-weight:bold;">&#125;</span>, session <span style="color:#008000; font-style:italic;">#this is where the session from sign_in is added to get_with</span><br />
&nbsp; &nbsp; assert_response <span style="color:#ff3333; font-weight:bold;">:success</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://www.outfarm.com/2011/06/rails-3-functional-controller-testing-when-using-devise-and-declarative-authorization-gems/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>User Acceptance Testing with Selenium IDE: How to handle Javascript Alerts, Ajax Popups and Drag and Drop</title>
		<link>http://www.outfarm.com/2010/10/user-acceptance-testing-with-selenium-ide-how-to-handle-javascript-alerts-ajax-popups-and-drag-and-drop/</link>
		<comments>http://www.outfarm.com/2010/10/user-acceptance-testing-with-selenium-ide-how-to-handle-javascript-alerts-ajax-popups-and-drag-and-drop/#comments</comments>
		<pubDate>Fri, 08 Oct 2010 16:33:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[How we did it]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://www.outfarm.com/?p=814</guid>
		<description><![CDATA[We have been using Selenium successfully as an automated tool for Acceptance Testing all releases from our outsourcing provider. Even though we have written many of the testcases in ruby, using the IDE to create testcases in Selenese has been enough in many cases. Every release we receive is tested using the old test suites [...]]]></description>
			<content:encoded><![CDATA[<p>We have been using Selenium successfully as an automated tool for Acceptance Testing all releases from our outsourcing provider. Even though we have written many of the testcases in ruby, using the IDE to create testcases in Selenese has been enough in many cases. Every release we receive is tested using the old test suites to make sure the new functionality does not break existing one, this step is also called regression testing. Selenium works great for applications with an already advanced user interface that will not change significantly over time any more. Otherwise a lot of time will be spent debugging the testcases themselves. One way around this is to use a fixed id for the elements used in testing, but that might not always be possible.</p>
<p><br/></p>
<p>
<strong>Tip:</strong>If you have access to the database, create a database dump after running a test suite. If you have to do manual tests in between test suites then create a db dump before AND after. This will make your life a lot easier if your tests are dependent on previous tests which they probably will be. Now if one of the tests in a test suite fails, you just reload the database and start the test suite again.</p>
<p><br/></p>
<p>
We used Selenium and found it to work very well with our AJAX enabled website, but it took some time to get the head around the topics described below. The following examples worked in Firefox 3.6.10 and Selenium IDE 1.0.7.</p>
<p><br/></p>
<p>
The documentation was pretty useful and the API covered most other topics not found in the documentation.<br />
<a href="//http://seleniumhq.org/docs/03_selenium_ide.html">Selenium IDE documentation</a><br />
<a href="http://seleniumhq.org/docs/04_selenese_commands.html">Selenium Selenese Commands</a><br />
<a href="http://release.seleniumhq.org/selenium-core/1.0/reference.html">Selenium 1.0 API</a>
</p>
<p><br/></p>
<p><h3>AJAX/Javascript in general</h3>
<p>When you are using AJAX/Javascript, the web page will most likely not actually reload. Therefore Selenium will not know if and when an element in the page is available and the verify* or assert* commands will often fail. This is where the <strong>waitFor*</strong> commands come in. For all these commands Selenium will repeatedly check whether a certain event came to pass until a set time out is reached. By default the time out is set to 30 seconds but can be manually adjusted using (surprise surprise)
</p>
<p><br/></p>
<p>
setTimout( timeout in milliseconds) &#8211;> setTimeout(5000) &#8211;> sets timeout to 5s<br />
Once set, the timeout will stay at 5s.
</p>
<p><br/>
</p>
<p><h3>AJAX or &#8220;in browser&#8221; popup </h3>
<p>Many web applications now use what we call an &#8220;in browser&#8221; popup, this is NOT a smaller new browser window and NOT a Javascript alert. Most of the time it is a hidden DIV element at a relative or fixed position that is shown and hidden using javascript and might be populated with data from the server using AJAX. It is very often used for data entry and therefore will have to be tested with Selenium.</p>
<p><br/></p>
<ul>
<li>Use <strong>waitForVisible</strong> if the element&#8217;s CSS attributes include &#8220;visibility:hidden&#8221; or &#8220;display:none&#8221;.</li>
<li>Use <strong>waitforElementPresent</strong> if the element did not exist before. This will not work for the above situation because the element itself is present, even though it is not visible.</li>
</ul>
<p><br/></p>
<p><strong>Tip:</strong>use waitFor commands in sequence if you are waiting for an element in a container. For example you have to test an AJAX action that populates a hidden DIV with a page from the server that contains input fields and then makes the DIV visible. As part of the test you most likely will have to populate these inputs fields. In that case use waitForVisible for the DIV container first and then use the waitForElementPresent for the first input field. Even though Selenium verified that the DIV is now visible, it still is not a guarantee that the browser already loaded the form with the inputs fields from the server. So the test will most likely behave slightly erratic, sometimes it passes and sometimes it will fail. Using a sequence of waitFor commands will make sure that the elements are available at the time of the test step.
</p>
<p><br/>
</p>
<p><h3>Javascript alert boxes/confirmations</h3>
<p>
Javascript alerts are a bit of a problem for Selenium and there are even situations where the box has to be clicked manually. (From the documentaiton: Selenium does NOT support JavaScript confirmations that are generated in a page&#8217;s onload() event handler. In this case a visible dialog WILL be generated and Selenium will hang until you manually click OK.)
<p><br/></p>
<p>But most of the time it is possible to deal with this pesky little alert boxes. When recoding the test using Selenium IDE the alert boxes appear as normal and the IDE will happily record a &#8220;assertConfirmation&#8221; command, but when running the test, no alert box shows up and the test often fails. It is important to know that alert boxes are NOT shown when running the test as noted in the Selenium documentation. And replacing assertConfirmation with <strong>waitForConfirmation</strong> most of the time allows the test to pass.</p>
<p><br/></p>
<p>All commands use a positive confirm, so if you want to test the negative confirmation use <strong>chooseCancelOnNextConfirmation</strong> BEFORE the action that results in the alert box.</p>
<p><br/>
</p>
<p><h3>Drag &#038; Drop </h3>
<p>Even complicated actions like drag and drop can be implemented using the Selenium IDE only. In our case we had the following setup to test. </p>
<ul>
<li>Two DIVs side by side with ids &#8220;account&#8221; and &#8220;team&#8221;, the &#8220;account&#8221; DIV containing a table of account users not in a project team and the &#8220;team&#8221; DIV containing the table of the project team users.</li>
<li>The users were distinguished using their unique email address and the table position for a specific user is dynamic in both DIVs.</li>
<li>Dragging a user from the &#8220;account&#8221; into the &#8220;team&#8221; DIV also opened an &#8220;in browser&#8221; popup to choose the project roles for that user.</li>
<li>Once the user was moved over in the &#8220;team&#8221; DIV, we needed to check that the email address was in the table of the &#8220;team&#8221; DIV.</li>
</ul>
<p><br/></p>
<style>
.selenium_blog_entry td {
    border: 1px solid #666;
    padding: 2px 5px;
    font-size: 10px;
}
.selenium_blog_entry th {
    font-weight: bold;
}
</style>
<table style="width:100%" class="selenium_blog_entry">
<tr>
<th>Command</th>
<th>Target</th>
<th>Value</th>
<th>Comment</th>
</tr>
<tr>
<td>mouseDown</td>
<td>//div[@id='account']/table/tbody/tr[1]</td>
<td></td>
<td>Click the left mouse button over the first user in the table (uses an Xpath locator)</td>
</tr>
<tr>
<td>storeText</td>
<td>//div[@id='account']/table/tbody/tr[1]/td[2]</td>
<td>email</td>
<td>Store the email address of the user in the variable &#8220;email&#8221;</td>
</tr>
<tr>
<td>mouseMoveAt</td>
<td>team</td>
<td></td>
<td>Move the mouse over the the &#8220;team&#8221; DIV (using the id as locator)</td>
</tr>
<tr>
<td>mouseUp</td>
<td>team</td>
<td></td>
<td>Now release the left mouse button over the &#8220;team&#8221; DIV</td>
</tr>
<tr>
<td>waitForVisible</td>
<td>popup_div</td>
<td></td>
<td>Wait for the &#8220;in browser&#8221; popup &#8220;popup_div&#8221; to become visible</td>
</tr>
<tr>
<td>click</td>
<td>//input[@id='roles_' and @name='roles[]&#8216; and @value=&#8217;4&#8242;]</td>
<td></td>
<td>Tick a checkbox for the user to get that role in the team</td>
</tr>
<tr>
<td>click</td>
<td>project_user_submit</td>
<td></td>
<td>Press the submit button of the form for the roles. This also closes the &#8220;in-browser&#8221; popup</td>
</tr>
<tr>
<td>echo</td>
<td>${email}</td>
<td></td>
<td>Just for debugging, show the value for the variable &#8220;email&#8221;</td>
</tr>
<tr>
<td>waitForText</td>
<td>//div[@id='team']//a[text()='${email}']</td>
<td>${email}</td>
<td>Now wait for the user with the unique text value &#8220;email&#8221; to appear in the &#8220;team&#8221; DIV</td>
</tr>
</table>
<p><br/></p>
<p>
<strong>Tip:</strong>Don&#8217;t move the mouse when running a test that contains mouse movement commands, otherwise your mouse movements will interfere with Selenium and  the test will very likely fail.</p>
<p><strong>Tip:</strong>Use the <strong>echo</strong> command to check your variables in the log (works if set to info)
</p></p>
]]></content:encoded>
			<wfw:commentRss>http://www.outfarm.com/2010/10/user-acceptance-testing-with-selenium-ide-how-to-handle-javascript-alerts-ajax-popups-and-drag-and-drop/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Acceptance Test Driven Development (ATDD)</title>
		<link>http://www.outfarm.com/2010/09/acceptance-test-driven-development-atdd/</link>
		<comments>http://www.outfarm.com/2010/09/acceptance-test-driven-development-atdd/#comments</comments>
		<pubDate>Mon, 20 Sep 2010 14:39:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Agile Development]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://www.outfarm.com/?p=523</guid>
		<description><![CDATA[Acceptance test driven development is an agile software development method that uses the Acceptance tests to establish when a requirement meets the client&#8217;s expectation. It is an advanced practice of the Test Driven Development method. Acceptance tests or Customer tests are written by the client together with the developers for every requirement that is part [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Acceptance test driven development</strong> is an agile software development method that uses the Acceptance tests to establish when a requirement meets the client&#8217;s expectation. It is an advanced practice of the <a href="http://en.wikipedia.org/wiki/Test-driven_development">Test Driven Development</a> method.</p>
<p><br/></p>
<p>Acceptance tests or Customer tests are written by the client together with the developers for every requirement that is part of the specification. Whereas a requirement describes specific behaviour the client wants in the finished software, the Acceptance tests make sure that the requirement was implemented in its completeness and according to the client&#8217;s input.<br />
As an example we can use the tried and tested password requirement:
<p>
<strong>Requirement</strong> <cite>&#8220;When a user is creating an account, he/she is required to choose an outlandishly secure password&#8221;</cite><br />
<strong>Acceptance Test1</strong> <cite>Test that the password contains at least 8 characters with at least one upper case letter, a number and a symbol&#8221;</cite><br />
<strong>Acceptance Test2</strong> <cite>Test that the password does not contain a word from the english dictionary&#8221;</cite><br />
<strong>Acceptance Test3</strong> <cite>Test that the user receives different error messages when the password is too short, contains no upper case letter, no number or no symbol. &#8220;</cite><br />
In this case the Acceptance tests define now what an &#8220;outlandishly secure password&#8221; is and increase the shared understanding for this requirement. And after the tenth iteration I can make sure that these Acceptance tests still pass so I have <a href="http://en.wikipedia.org/wiki/Regression_testing">regression testing</a> built right in.</p>
<p><br/></p>
<p><strong>The many benefits of ATDD</strong></p>
<ul>
<li>Acceptance Tests increase the shared understanding of a requirement because they are a product of direct interaction between the client and the developers.</li>
<li>Clarifies requirements and keeps the developers focused on what the client really wants.</li>
<li>Drives out ambiguity if certain behaviour is ultimately a bug (behaviour violates either requirement or tests or both) or a change request (behaviour is acceptable within the scope of requirement and acceptance tests but ultimately undesirable).</li>
<li>Software delivery is now dependent on all Acceptance tests passing and with that defines when a project is done.</li>
<li>Percentage of passed acceptance tests/all acceptance tests acts as a project progress indicator.</li>
<li>Free regression tests for the future iterations (especially if automated).</li>
</ul>
<p><br/></p>
<p><strong>Some ATDD drawbacks</strong></p>
<ul>
<li>Client interaction is needed which can prove difficult due to time constraints</li>
<li>More work for the developer if tests are automated.</li>
<li>Project progress might be slower due to additional effort.</li>
</ul>
<p><br/></p>
<p><strong>Automating ATDD</strong><br />
There are many tools and frameworks for acceptance test automation, even some that can be used for User Interface testing. Many of them are free and open source, so the framework can be adapted to suit the project. Automating acceptance tests is highly desirable because regression testing is a hugely important step for iterative agile development methods. The immediate drawback is that this also means the developer has even more work to do because test automation is a development task in itself.
</p>
<p><br/></p>
<p><strong>Are Unit tests not needed anymore?</strong><br />
Acceptance tests are no replacement for Unit tests. Unit tests must still be written by the developers to make sure that the code they are writing is performing as it should. Unit tests are written to test individual units of source code, whereas Acceptance tests are written to test several units of source code connected by some type of workflow defined by the client.
</p>
<p><br/></p>
<p><strong>ATDD and outsourcing</strong><br />
ATDD is very much suited for outsourcing because its previously listed advantages address many of the issues encountered in outsourced software development. But it is important to notice that it will only work if the project is using an agile development method and can&#8217;t be shoehorned into a waterfall based development scenario of design first, development second, testing third. ATDD needs commitment from both the project owner and also the agile supplier because the real emphasis is not necessarily on the testing itself but on the increased shared understanding that is a product of the increased contact between the two parties. Including ATDD will also most likely increase the cost of the project at the start as more time is needed by the developers to write the additional tests. The real gain comes over time as the functionality of the delivered software should with every iteration be closer to what the client envisaged in the first place and therefore should reduce the need to add or refine functionality. The Acceptance tests also act as a baseline that can be consulted if a dispute about the scope should arise.
</p>
<p><br/></p>
]]></content:encoded>
			<wfw:commentRss>http://www.outfarm.com/2010/09/acceptance-test-driven-development-atdd/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Release 2: Main development is over</title>
		<link>http://www.outfarm.com/2010/08/release-2-main-development-is-over/</link>
		<comments>http://www.outfarm.com/2010/08/release-2-main-development-is-over/#comments</comments>
		<pubDate>Thu, 19 Aug 2010 10:38:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[Product Information]]></category>
		<category><![CDATA[Product Roadmap]]></category>

		<guid isPermaLink="false">http://www.outfarm.com/?p=510</guid>
		<description><![CDATA[We are happy to announce that the main development for release 2 of the outfarm platform has finished now. This is a major milestone for Outfarm as this brings the date for the roll-out of many improvements to the platform closer. We have listened to our current clients and have added many notable improvements: A [...]]]></description>
			<content:encoded><![CDATA[<p>We are happy to announce that the main development for release 2 of the outfarm platform has finished  now. This is a major milestone for Outfarm as this brings the date for the roll-out of many improvements to the platform closer. We have listened to our current clients and have added many notable improvements:<br />
<br/></p>
<ol>
<li>A brand spanking new &#8220;Idea to Paper&#8221; Wizard that includes drag and drop actor modelling, drag and drop specification management and the brand new &#8220;Non-Functional Requirements Questionnaire&#8221;.</li>
<li>Complete overhaul of RFP/Proposal wizards to make the whole process a lot easier for both sides. Includes the ability to break down items into tasks and to move attachments from a proposal into the main project when awarding the project</li>
<li>Integrated with <a href="http://www.gravatar.com">http://www.gravatar.com</a> to show your global avatar. Go and create one for yourself</li>
<li>Hugely improved dashboard that now includes time graphs and better access to past progress data</li>
<li>Ability to graphically monitor activity of individual project contributors</li>
<li>Improved drag and drop support for adding/removing items to milestones and releases.</li>
<li>Estimated time management and status change integration between tasks and items the task is connected  to.</li>
<li>Changes to the User Interface include streamlining of processes and a much nicer look and feel.</li>
<li>And many other smaller changes that will make your life easier</li>
</ol>
<p></br><br />
If you want to be notified when release two is ready, then  <a href="http://www.outfarm.com/signup">signup</a> here.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.outfarm.com/2010/08/release-2-main-development-is-over/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Beta service release scheduled for end of March</title>
		<link>http://www.outfarm.com/2010/03/beta-service-release-scheduled-for-february/</link>
		<comments>http://www.outfarm.com/2010/03/beta-service-release-scheduled-for-february/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 11:39:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[Product Roadmap]]></category>

		<guid isPermaLink="false">http://www.outfarm.com/?p=371</guid>
		<description><![CDATA[We have chosen a few companies to take part in the beta. But the beta will be open to everyone]]></description>
			<content:encoded><![CDATA[<p>We have chosen a few companies to take part in the beta. But the beta will be open to everyone</p>
]]></content:encoded>
			<wfw:commentRss>http://www.outfarm.com/2010/03/beta-service-release-scheduled-for-february/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Attending the Web Summit on the 4th of Feb in Dublin</title>
		<link>http://www.outfarm.com/2010/01/attending-the-web-forum-on-the-4th-of-feb-in-dublin/</link>
		<comments>http://www.outfarm.com/2010/01/attending-the-web-forum-on-the-4th-of-feb-in-dublin/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 11:40:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[Events]]></category>

		<guid isPermaLink="false">http://www.outfarm.com/?p=373</guid>
		<description><![CDATA[A representative of Outfarm is attending the Web Summit in Dublin which takes place in Trinity College. We are there to spread the word about Outfarm and talk to companies that are facing the problem our service is addressing. We are very excited about the fact that our service is close to &#8220;official&#8221; Beta launch [...]]]></description>
			<content:encoded><![CDATA[<p>A representative of Outfarm is attending the <a href="http://dws2.eventbrite.com/">Web Summit</a> in Dublin which takes place in Trinity College. We are there to spread the word about Outfarm and talk to companies that are facing the problem our service is addressing.</p>
<p><br/></p>
<p>We are very excited about the fact that our service is close to &#8220;official&#8221; Beta launch (expected in February) and we are welcoming Trial customers to use the service free of charge for a limited period.</p>
<p><br/></p>
<p>Looking forward to meeting you there.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.outfarm.com/2010/01/attending-the-web-forum-on-the-4th-of-feb-in-dublin/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Outsourcing, copyright and intellectual property protection</title>
		<link>http://www.outfarm.com/2010/01/outsourcing-copyright-and-intellectual-property-protection/</link>
		<comments>http://www.outfarm.com/2010/01/outsourcing-copyright-and-intellectual-property-protection/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 15:08:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Agile Offshoring]]></category>
		<category><![CDATA[Agile Outsourcing]]></category>
		<category><![CDATA[All]]></category>
		<category><![CDATA[How we did it]]></category>

		<guid isPermaLink="false">http://www.outfarm.com/?p=272</guid>
		<description><![CDATA[Whenever there is a discussion about outsourcing any type of software development work, someone will always play the intellectual property card. How can you protect it, is always the question. Software is intangible and the IP is really in how a business process is implemented within the software. Business processes are very hard to patent [...]]]></description>
			<content:encoded><![CDATA[<p>Whenever there is a discussion about outsourcing any type of software development work, someone will always play the intellectual property card. How can you protect it, is always the question. Software is intangible and the IP is really in how a business process is implemented within the software. Business processes are very hard to patent or to protect otherwise legally. Also the majority of software implements operational processes that are not that different between companies. This post obviously does not cover speciality software that implements other types of processes that might very well be patentable.</p>
<p><br/></p>
<p>Many companies are afraid that if they use a software development service provider, those guys will then either use the software they developed and claim it is their own or use the know-how they acquired when developing software for the next customer. The first is quite unlikely, because most of the service providers are quite happily just that and have neither the knowledge, motivation nor the resources to take the software and sell it as their own or use it to build the next big Internet service. The second is certainly true, the question is to what extent. It is highly unlikely that the next customer will ask for exactly the same piece of software. Sure some parts will be reused, but because developing software is a rather complicated process, most of the time it will be completely rewritten to fit the new application. Reality is that IP theft for software is really hard to prove (not copyright infringement which is easier to prove) and would need a lot of money to actually prove in a court. We used a simple Non-Disclosure Agreement to protect ourselves against the most obvious forms of IP theft and that was it. The biggest threat to a company&#8217;s IP is its employees because the can walk away with the software and the market knowledge that lacks most software development service providers. </p>
<p><br/></p>
<p> When it comes to software, then copyright infringement is probably the bigger issue as most large software companies will let you know. There is also an issue with who gets the copyright in different countries. Some countries award the copyright to the contractor and not the company that hired the contractor. So it makes sense to look up the copyright law and make sure the contractor signs a legally binding document stating that he/she does not claim the copyright now and in the future for the software developed. </p>
<p><br/></p>
<p>There is also a very interesting article in The Economist covering some of this topic: <a href="http://www.economist.com/sciencetechnology/displayStory.cfm?story_id=15479680">http://www.economist.com/sciencetechnology/displayStory.cfm?story_id=15479680</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.outfarm.com/2010/01/outsourcing-copyright-and-intellectual-property-protection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby on Rails: a design decision</title>
		<link>http://www.outfarm.com/2009/11/ruby-on-rails-a-design-decision/</link>
		<comments>http://www.outfarm.com/2009/11/ruby-on-rails-a-design-decision/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 11:37:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[How we did it]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.outfarm.com/?p=367</guid>
		<description><![CDATA[We had heard about Ruby on Rails and how efficiently one can create web applications with a handful of good developers and we were intrigued to find out more. Due to budgetary constraints we would not use a platform that we would have to pay for to run our service and we all had now [...]]]></description>
			<content:encoded><![CDATA[<p>We had heard about Ruby on Rails and how efficiently one can create web applications with a handful of good developers and we were intrigued to find out more. Due to budgetary constraints we would not use a platform that we would have to pay for to run our service and we all had now used open source components for years. After playing around with Ruby on Rails for a while we were convinced that Ruby on Rails really is a great language/framework combination. We also felt very quickly at home with the Ruby language itself and found a huge amount of plugins/gems and a vibrant community. Also there are many great online services out there already running on Ruby on Rails on Linux for a while, so the majority of issues running an online service were already ironed out. But what really convinced us was that it implements the tried and tested model view controller pattern in an easy and straightforward way. We were sold.
</p>
<p><br/></p>
<p>Once again we are not advocating that Ruby on Rails is the only right choice but at the time we felt that it was the optimal choice given our background. Ruby on Rails in the end is just a tool set and there are many great tool sets out there that have their place in the right context. At the time of the post we are still very enthusiastic about our choice.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.outfarm.com/2009/11/ruby-on-rails-a-design-decision/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Offshoring, near sourcing or local sourcing and how to fit agile</title>
		<link>http://www.outfarm.com/2009/09/offshoring-near-sourcing-or-local-sourcing-and-how-to-fit-agile/</link>
		<comments>http://www.outfarm.com/2009/09/offshoring-near-sourcing-or-local-sourcing-and-how-to-fit-agile/#comments</comments>
		<pubDate>Mon, 07 Sep 2009 18:23:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Agile Development]]></category>
		<category><![CDATA[Agile Offshoring]]></category>
		<category><![CDATA[Agile Outsourcing]]></category>
		<category><![CDATA[All]]></category>
		<category><![CDATA[How we did it]]></category>

		<guid isPermaLink="false">http://www.outfarm.com/?p=227</guid>
		<description><![CDATA[&#8220;Should you outsource software development&#8221; is a very hotly contested topic on the Internet. And again you have to whole spectrum of opinions, from the &#8220;we are all going to loose our job&#8221; blog posts to the &#8220;we can develop everything at any time at the best rate for you&#8221; emails. Reality is that offshoring, [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;Should you outsource software development&#8221; is a very hotly contested topic on the Internet. And again you have to whole spectrum of opinions, from the &#8220;we are all going to loose our job&#8221; blog posts to the &#8220;we can develop everything at any time at the best rate for you&#8221; emails. Reality is that offshoring, near sourcing or using local or even in-house developers are all viable solution in some circumstances. Fact is that you will get a lot more man-hours if you choose to use a lower cost destination. Whether this is going to save you any money is an entirely different question.
<p><br/></p>
<p>The deciding factors for us to outsource the development were the following:</p>
<ul>
<li>Lack of local Ruby on Rails	 expertise</li>
<li>Limited financial resources and the price was right</li>
<li>We have developed software before</li>
<li>We develop alongside them and can see their code</li>
<li>Due diligence finding an offshore partner (<a href="http://www.outfarm.com/2009/05/choosing-a-supplier-looking-at-the-available-information-part-i/">see three part post about our search</a>)</li>
<li>Matching our developemnt process with theirs</li>
<li>Solid list of requirements</li>
</ul>
<p><br/></p>
<p>We can gladly say that for us it worked very well, we got a lot more bang for the buck than if we would have developed here. Here are the key points that we think were crucial to our success:</p>
<ul>
<li>We felt comfortable with the company we chose from the start</li>
<li>We felt especially comfortable with the team lead, a highly skilled software engineer with excellent communication skills</li>
<li>Skype was available at any time for them and for us. Communication needs to stay open.</li>
<li>Using IM rather then calls for technical discussion keeps a log that could be referred to later.</li>
<li>Because we kept on talking with the developers daily, a personal connection formed and they got more involved in the project</li>
<li>Their ideas were treated the same as ours and many of them have found their way into the endproduct. This motivated them even more</li>
<li>Using an agile development process also meant that we were all working on the same iteration and as such felt like we were in the same boat</li>
<li>We responded to their question in the same time frame we were expecting from them</li>
<li>A shared understanding that we will come up with more requirements as time goes by and a willingness on their side to change requirements and sometimes adding a requirement without charging for it</li>
<li>Our acceptance of real change requests without a lengthy price renegotiation. It started as a fixed price project and the price and time frame were adjusted according to the extensions</li>
<li>From early on using the developed software to track the project</li>
<p>And so far we still have not met a single person from that company.</p>
<p><br/></p>
<p>We are not advocating offshoring. What has worked here for us can also work locally but in our case we had no real choice because of lack of local expertise and limited resources. What has to be taken into account in our case is that we only partially offshored as we were part of the development team ourselves. We believe that in order to reap the real benefits of outsourced development, a company needs a mixed team, some developers are local and some offshore and that are able to interact as described above. In the future we will build a local team alongside the offshore team we used so far. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.outfarm.com/2009/09/offshoring-near-sourcing-or-local-sourcing-and-how-to-fit-agile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gathering agile requirements for our service</title>
		<link>http://www.outfarm.com/2009/08/gathering-agile-requirements-for-our-service/</link>
		<comments>http://www.outfarm.com/2009/08/gathering-agile-requirements-for-our-service/#comments</comments>
		<pubDate>Sat, 15 Aug 2009 15:35:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Agile Development]]></category>
		<category><![CDATA[All]]></category>
		<category><![CDATA[How we did it]]></category>
		<category><![CDATA[Requierements Gathering]]></category>

		<guid isPermaLink="false">http://www.outfarm.com/?p=265</guid>
		<description><![CDATA[In this post we will talk briefly about how we gathered our requirements for the Outfarm Service. We are using an agile development approach and will be using userstories as the basis for our requirements. A userstory is a software requirement described in one or two sentences using everyday or business language of the user. [...]]]></description>
			<content:encoded><![CDATA[<p>In this post we will talk briefly about how we gathered our requirements for the Outfarm Service. We are using an agile development approach and will be using userstories as the basis for our requirements. A userstory is a software requirement described in one or two sentences using everyday or business language of the user. This enables non-technical business people to formulate the requirements using their own language, because they will the use the new system afterwards. And in case you wondered, yes they have to come up with the requirements, not an analyst who is already removed from their day to day problems.</p>
<p><br/></p>
<p>There are many ways of getting the user to come up with the requirements: interviews, questionnaires and workshops to name a few. Because we build a service platform that we would use ourselves, we chose to organize a workshop. Many of the steps we used are coming from Mike Cohn&#8217;s excellent book <a href="http://www.amazon.com/User-Stories-Applied-Software-Development/dp/0321205685">&#8220;User Stories applied for agile software development&#8221;</a>.
</p>
<p><br/></p>
<p>The workshop has three distinct modules:</p>
<ul>
<li>Role-Modeling</li>
<li>Userstory gathering</li>
<li>Acceptance test gathering</li>
</ul>
<p><br/></p>
<p><strong>Role-Modeling</strong>: Every application will be used in different ways by users in different roles. The idea of the workshop is to tease out those user roles that will then be used as the basis for the userstories. We started with a brainstorming session ending up with many overlaping user groups. Next step was to consolidate and condese the overlaping roles to a few roles that define these strongly overlapping user groups. And the last act was to think about attributes such as: how often are they using the software, level of domain expertise, general goal for using the software, proficiency with the software developed and general proficiency with computers and internet. We defined our own roles first and then went on to define other roles we thought would be using this software including the person who makes the buy decision for our service.</p>
<p><br/></p>
<p><strong>Userstory gathering</strong>: There are many ways to gather user stories: User interviews, Questionnaires, Observations, Story Writing Workshops and working with user proxies such as product manager, sales/markting or business analyst. We used a combination of user interviews and story writing workshop to come up with a simple conceptual prototype on paper and resulting userstories. Our software is a web application so we used high level pages (no page details included) as the basis for the prototype and started with an empty page. For each role we then defined what actions they could take from here and these actions would become a userstory and add pages to the prototype from which we would look for more possible actions and add more pages. While walking through the prototype one role at a time, we asked the following questions:</p>
<ul>
<li>What would this role most likely want to do next?</li>
<li>What mistakes could he make from here?</li>
<li>What could confuse the user at this point</li>
<li>What additional information could the user need?</li>
</ul>
<p>Throughout the workshop we kept in mind to keep the discussion at a high level and to come up with as many stories as possible. And throw away the simple prototype because all the information should now be captured in the usesrstories and the prototype will only create confusion when all of a sudden someone revisits it after a month.</p>
</p>
<p><br/></p>
<p><strong>Acceptance test gathering</strong>: The last post is already concerned with testing, therefore we only want to add a few more things:</p>
<ul>
<li>Write tests before development starts as they give the developer boundary conditions during developemnet and for effort estimation</li>
<li>The end user/customer needs to specify the acceptance tests with the help of the developers</li>
<li>Testing is part of the process and happens throughout development and not just at the end</li>
<li>As long as tests add value, they should be added. Additional tests can and should be written throughout the lifetime of the project</li>
<li>Automate acceptance testing using frameworks because manual testing is error prone and mind numbing to the testers</li>
<li>Acceptance tests should cover different types of testing (Functional testing, User interface testing, Usability testing, Load testing)</li>
]]></content:encoded>
			<wfw:commentRss>http://www.outfarm.com/2009/08/gathering-agile-requirements-for-our-service/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

