<?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>Eric Lefevre-Ardant on Java &#38; Agile &#187; test</title>
	<atom:link href="http://ericlefevre.net/wordpress/category/process/test/feed/" rel="self" type="application/rss+xml" />
	<link>http://ericlefevre.net/wordpress</link>
	<description>Eric&#039;s Earnest Elucidations</description>
	<lastBuildDate>Mon, 06 Feb 2012 06:08:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Create hidden files in Apache VFS with the RAM filesystem type</title>
		<link>http://ericlefevre.net/wordpress/2012/02/02/create-hidden-files-in-apache-vfs-with-the-ram-filesystem-type/</link>
		<comments>http://ericlefevre.net/wordpress/2012/02/02/create-hidden-files-in-apache-vfs-with-the-ram-filesystem-type/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 09:57:47 +0000</pubDate>
		<dc:creator>Eric Lefevre-Ardant</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://ericlefevre.net/wordpress/?p=1034</guid>
		<description><![CDATA[Apache VFS is a great way to access different file systems in the same way. I particularly like the custom RAM filesystem in my unit tests in order to check code that eventually accesses the actual file system. For example: &#8230; <a href="http://ericlefevre.net/wordpress/2012/02/02/create-hidden-files-in-apache-vfs-with-the-ram-filesystem-type/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://commons.apache.org/vfs/">Apache VFS</a> is a great way to access different file systems in the same way. I particularly like the custom <a href="http://commons.apache.org/vfs/filesystems.html">RAM filesystem</a> in my unit tests in order to check code that eventually accesses the actual file system.</p>
<p>For example:</p>
<pre>
StandardFileSystemManager manager = new StandardFileSystemManager();
manager.init();
manager.resolveFile("ram://root/file.txt").createFile(); // prepare test harness
...
manager.resolveFile("ram://root/file.txt").getName(); // do something useful
</pre>
<p>Annoyingly, Apache VFS API provides a way to check if a file/folder is hidden, but, although it is always possible to manually create hidden files on your system, there is no way to mark a file as hidden in the RAM filesystem.</p>
<pre>
manager.resolveFile("ram://root/file.txt").isHidden(); // returns false
manager.resolveFile("ram://root/.file.txt").isHidden(); // also returns false
</pre>
<p>The solution is to modify the RAM filesystem and customize its checking of the hidden attribute. This means that we need a new RamFileProvider, a new RamFileSystem and finally a new RamFileObject. In this example, all files and folders whose names start with a dot will be considered hidden:</p>
<pre>
public class RamFileProvider extends org.apache.commons.vfs2.provider.ram.RamFileProvider {
  @Override
  protected FileSystem doCreateFileSystem(FileName name, FileSystemOptions fileSystemOptions) throws FileSystemException {
    return new RamFileSystem(name, fileSystemOptions);
  }

  private static class RamFileSystem extends org.apache.commons.vfs2.provider.ram.RamFileSystem {
    public RamFileSystem(FileName rootName, FileSystemOptions fileSystemOptions) {
      super(rootName, fileSystemOptions);
    }

    @Override
    protected FileObject createFile(AbstractFileName name) throws Exception {
      return new RamFileObject(name, this);
    }
  }

  private static class RamFileObject extends org.apache.commons.vfs2.provider.ram.RamFileObject {
    public RamFileObject(AbstractFileName name, RamFileSystem ramFileSystemWithHiddenSupport) {
      super(name, ramFileSystemWithHiddenSupport);
    }

    @Override
    public boolean isHidden() throws FileSystemException {
      // this is the important part
      if (getName().getBaseName().startsWith(".")) {
        return true;
      }
      return super.isHidden(); // in practice, this always return false
    }
  }
}
</pre>
<p>Finally, this new RamFileProvider must be registered with your existing FileSystemManager. In my case, I get something like that:</p>
<pre>
StandardFileSystemManager manager = new StandardFileSystemManager();
manager.init();
manager.addProvider("ram-ext", new RamFileProvider());
manager.resolveFile("ram-ext:///root/file.txt").createFile();
manager.resolveFile("ram-ext:///root/.file.txt").createFile();
...
manager.resolveFile("ram-ext://root/file.txt").isHidden(); // returns false
manager.resolveFile("ram-ext://root/.file.txt").isHidden(); // returns true
</pre>
<p>Note that I did not replace the &#8220;ram&#8221; filesystem entirely. Although that would have been my preferred option, that would have taken too much time in my little experiment.</p>
]]></content:encoded>
			<wfw:commentRss>http://ericlefevre.net/wordpress/2012/02/02/create-hidden-files-in-apache-vfs-with-the-ram-filesystem-type/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Play Framework and Guice: use providers in Guice modules</title>
		<link>http://ericlefevre.net/wordpress/2011/05/08/play-framework-and-guice-use-providers-in-guice-modules/</link>
		<comments>http://ericlefevre.net/wordpress/2011/05/08/play-framework-and-guice-use-providers-in-guice-modules/#comments</comments>
		<pubDate>Sun, 08 May 2011 20:19:56 +0000</pubDate>
		<dc:creator>Eric Lefevre-Ardant</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[guice]]></category>
		<category><![CDATA[play framework]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://ericlefevre.net/wordpress/?p=923</guid>
		<description><![CDATA[Play Framework has a Guice module. Unfortunately, its use is fairly limited compared to what Guice can do. In this post, I describe how it is configured on my current personal project. In general, when I test classes that have &#8230; <a href="http://ericlefevre.net/wordpress/2011/05/08/play-framework-and-guice-use-providers-in-guice-modules/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.playframework.org/">Play Framework</a> has a <a href="http://www.playframework.org/modules/guice">Guice module</a>. Unfortunately, its use is fairly limited compared to what Guice can do. In this post, I describe how it is configured on my current personal project.</p>
<p><a title="Spring in Paris, when days last longer and pianists play in the street by elefevre7, on Flickr" href="http://www.flickr.com/photos/elefevre/5632590160/"><img class="aligncenter" src="http://farm6.static.flickr.com/5269/5632590160_d094d455c4.jpg" alt="Spring in Paris, when days last longer and pianists play in the street" width="500" height="500" /></a></p>
<p>In general, when I test classes that have dependencies, my favorite approach is to pass those dependencies to the constructor:</p>
<pre>public class MyService {
	private final MyDependency myDependency;

	public MyService(MyDependency myDependency) {
		this.myDependency = myDependency;
	}
}</pre>
<p>Which makes creating test harnesses with Mockito reasonably easy:</p>
<pre>
public class MyServiceTest extends UnitTest {
	@Test
	public void shouldComputeAResult() {
		MyDependency mockMyDependency = mock(MyDependency.class);
		when(mockMyDependency.findSomeValue()).thenReturn("some value");

		MyService service = new MyService(mockMyDependency);

		assertThat(service.computeSomething(), equalTo("result"));
	}
}</pre>
<p>However, it appears that Guice, at least under <a href="http://www.playframework.org/modules/guice-1.1.1/home">version 1.1.1 of its Play module</a>, can only be used with Play to inject into static members:</p>
<pre>@InjectSupport
public class MyService {
	@Inject
	static MyDependency myDependency;
	// no constructor (a default constructor will be
	// generated automatically by Play Framework)
}</pre>
<p>The @InjectSupport is what makes the Guice module detect that the class requires dependencies (a class that extends either com.google.inject.AbstractModule or play.modules.guice.GuiceSupport must also be present in the classpath).</p>
<p>This makes it hard to instrument classes under test, as the value for a mock instance of MyDependency is shared amongst all tests that run currently.</p>
<pre>public class MyServiceTest extends UnitTest {
	@Test
	public void shouldComputeAResult() {
		MyDependency mockMyDependency = mock(MyDependency.class);
		when(mockMyDependency.findSomeValue()).thenReturn("some value");

		MyService service = new MyService();
		// static values are brittle;
		// they should not be touched in unit tests
		service.myDependency = mockMyDependency; // yuck!

		assertThat(service.computeSomething(), equalTo("result"));
	}
}</pre>
<p>Many subtle problems may occur when injecting dependencies in this way. For example, all instances of MyServices used concurrently will point to the same dependencies instances, so it is possible that tests will behave in inconsistent ways. Also, it makes it harder to default to sensible (null) dependencies, since tests running in the same JVM will by default use dependencies set by the first test.</p>
<p>The solution I&#8217;m using is to add providers in your Guice module:</p>
<pre>public class GuicyModule extends AbstractModule {
	@Override
	public void configure() {
		// no code needed
	}

	@Provides
	public MyService getMyService(MyDependency myDependency) {
		return new MyService(myDependency);
	}
}</pre>
<p>In this way, you are making sure that the dependencies are passed as you wish. Also, it will not be necessary to add any sort of Guice-related code in my services:</p>
<pre>public class MyService {
	private final MyDependency myDependency;

	public MyService(MyDependency myDependency) {
		this.myDependency = myDependency;
	}
}</pre>
<p>The downside is that you do have a few more lines to maintain, which is never fun. Better than the alternative, though.</p>
<p>My thanks to <a href="http://blog.javabien.net/">David Gageot</a> who told me about providers in Guice.</p>
]]></content:encoded>
			<wfw:commentRss>http://ericlefevre.net/wordpress/2011/05/08/play-framework-and-guice-use-providers-in-guice-modules/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Faster tests, at CITCON Paris 2009</title>
		<link>http://ericlefevre.net/wordpress/2009/09/22/faster-tests-at-citcon-paris-2009/</link>
		<comments>http://ericlefevre.net/wordpress/2009/09/22/faster-tests-at-citcon-paris-2009/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 08:11:52 +0000</pubDate>
		<dc:creator>Eric Lefevre-Ardant</dc:creator>
				<category><![CDATA[citcon]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://ericlefevre.net/wordpress/?p=751</guid>
		<description><![CDATA[&#8220;Going nowhere fast&#8221; by Nathan The session on Faster Tests (led by David) was interesting, at least to the extend that it was quite clear that we at Algodeal are not doing too bad indeed (Douglas Squirrel from youDevise is another one &#8230; <a href="http://ericlefevre.net/wordpress/2009/09/22/faster-tests-at-citcon-paris-2009/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-align: center; "><a href="http://www.flickr.com/photos/7843389@N02/2300190277"><img style="border: 0px initial initial;" src="http://farm3.static.flickr.com/2036/2300190277_360853ae0d.jpg" alt="&quot;Going nowhere fast&quot;" width="300" height="225" /></a></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-align: center; "><a href="http://www.flickr.com/photos/7843389@N02/2300190277">&#8220;Going nowhere fast&#8221;</a> by <a href="http://www.flickr.com/people/7843389@N02">Nathan</a></p>
<p>The session on Faster Tests (led by <a href="http://javabien.net/">David</a>) was interesting, at least to the extend that it was quite clear that we at Algodeal are not doing too bad indeed (Douglas Squirrel from <a href="http://www.timgroup.com/">youDevise</a> is another one that seems to be quite cerebral about tests and builds).</p>
<p style="text-align: center;"><a title="Faster tests by elefevre7, on Flickr" href="http://www.flickr.com/photos/elefevre/3944199578/"><img src="http://farm3.static.flickr.com/2676/3944199578_9c4a90e93e_m.jpg" alt="Faster tests" width="240" height="180" /></a> <a title="Faster tests by elefevre7, on Flickr" href="http://www.flickr.com/photos/elefevre/3944199432/"><img src="http://farm3.static.flickr.com/2655/3944199432_fe41e0d716_m.jpg" alt="Faster tests" width="240" height="180" /></a></p>
<p>By looking that the various options discussed to get tests faster, I think it&#8217;s fair to say that the only way to really speed up tests is by compromising their integrity, at least to a level. In a way, to make tests faster, you&#8217;ve got to face reality and move away from their ideal abstraction (very reminiscent of Joel Spolsky&#8217;s <a href="http://ericlefevre.net/wordpress/2009/05/06/maven-it-aint-too-bad/">Law of Leaky Abstractions</a>). The only question is: how confident are you that those (slightly compromised) tests actually test something useful?</p>
<p>This leads to the conclusion that we only keep long integration tests because it is difficult for us to really understand what&#8217;s going on. If we did have an excellent understanding, we would have unit tests instead. And, interestingly, as we progress in our project, we find ways to convert integration tests into unit tests. In other words, we better understand what&#8217;s going on.</p>
<p>Also, check out my notes on the <a href="http://ericlefevre.net/wordpress/2009/09/21/mock-objects-at-citcon-paris-2009/">session on Mock Objects</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://ericlefevre.net/wordpress/2009/09/22/faster-tests-at-citcon-paris-2009/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Agile 2009] Hudson-related presentations</title>
		<link>http://ericlefevre.net/wordpress/2009/06/11/agile-2009-hudson-related-presentations/</link>
		<comments>http://ericlefevre.net/wordpress/2009/06/11/agile-2009-hudson-related-presentations/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 12:42:22 +0000</pubDate>
		<dc:creator>Eric Lefevre-Ardant</dc:creator>
				<category><![CDATA[hudson]]></category>

		<guid isPermaLink="false">http://ericlefevre.net/wordpress/?p=676</guid>
		<description><![CDATA[Going to Agile 2009? Cannot get enough Hudson? I have put together a list of sessions at the conference that will explicitly mention the best CI server eveeeer ;-): Java Power Tools &#8211; getting it all together by John Smart,  &#8230; <a href="http://ericlefevre.net/wordpress/2009/06/11/agile-2009-hudson-related-presentations/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/clofresh/3384877145/sizes/s/"><img class="alignleft" title="Hudson icon for Fluid, by clofresh" src="http://farm4.static.flickr.com/3437/3384877145_c91aacec69_m.jpg" alt="" width="224" height="240" /></a>Going to <a href="http://agile2009.agilealliance.org/">Agile 2009</a>? Cannot get enough <a href="http://hudson-ci.org/">Hudson</a>? I have put together a list of sessions at the conference that will explicitly mention the best CI server <em>eveeeer</em> ;-):</p>
<ul>
<li><a href="http://agile2009.agilealliance.org/node/482">Java Power Tools &#8211; getting it all together</a> by John Smart, <a href="http://agile2009.agilealliance.org/node/482" target="_blank"></a></li>
<li><a href="http://agile2009.agilealliance.org/node/3027">Build and Test in the Cloud &#8211; CI and Cloud Provisioning for <span class="il">Agile</span> Teams</a>, by Darryl Bowler, <a href="http://agile2009.agilealliance.org/node/3027" target="_blank"></a></li>
<li><a href="http://agile2009.agilealliance.org/node/2840"><span class="il">Agile</span> Tool Hacking &#8211; Taking Your <span class="il">Agile</span> Development Tools To The Next Level</a>, by Craig Smith and Paul King,</li>
<li> <a href="http://agile2009.agilealliance.org/node/572">CI vendor cage-fight!</a> by Tom Sulston: in this one, various tools vendors, will demonstrate their CI server &#8212; I might do the Hudson one</li>
</ul>
<p>OK, I <em>do</em> prefer Hudson (I am a contributor, after all). But I also watch the competition&#8230; err, I mean, <em>like</em> the other tools ;-) Here are other presentations I could find that mention competitors to Hudson:</p>
<ul>
<li>(CruiseControl) <a href="http://agile2009.agilealliance.org/node/2757">Agile Source Code Management using Stories, Agile Workflow, and CI</a>,by Damon Poole</li>
<li>(CruiseControl) <a href="http://agile2009.agilealliance.org/node/1335">Creating Habitable Code: Lessons in Longevity from CruiseControl</a>, by Jeffrey Fredrick and Paul Julius</li>
<li>(CruiseControl) <a href="http://agile2009.agilealliance.org/node/2043">Build Engineer Bootcamp: Builds As Code</a>, by Jeffrey Fredrick and Paul Julius: though not explicitly about CruiseControl, the hosts are the main contributors to CruiseControl, so expect to hear about it!</li>
<li>(CruiseControl) <a href="http://agile2009.agilealliance.org/node/161">Continuous Integration: Your New Best Friend</a>, by Howard Deiner</li>
<li>(Bamboo) <a href="http://agile2009.agilealliance.org/node/399">Automated deployment with Maven and friends &#8211; going the whole nine yards</a>, by John Smart: though it does mention Hudson, the focus will be on Bamboo</li>
<li>(Bamboo) <a href="http://agile2009.agilealliance.org/node/782">Large scale continuous integration</a>, by Hannu Kokko: the session outlines does not explicitly says so, but it seems that Bamboo is part of the toolset</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://ericlefevre.net/wordpress/2009/06/11/agile-2009-hudson-related-presentations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Is Fit Dead? A debate on Twitter</title>
		<link>http://ericlefevre.net/wordpress/2009/03/06/is-fit-dead-a-debate-on-twitter/</link>
		<comments>http://ericlefevre.net/wordpress/2009/03/06/is-fit-dead-a-debate-on-twitter/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 16:29:52 +0000</pubDate>
		<dc:creator>Eric Lefevre-Ardant</dc:creator>
				<category><![CDATA[fit]]></category>

		<guid isPermaLink="false">http://ericlefevre.net/wordpress/?p=570</guid>
		<description><![CDATA[Influential members of the Agile community recently discussed the current state and history of Fit (the original thing, not Fitnesse or other Fit-inspired tools). The conversation took place on Twitter mostly on Tuesday, March 3rd and Wednesday, March 4th. Here is &#8230; <a href="http://ericlefevre.net/wordpress/2009/03/06/is-fit-dead-a-debate-on-twitter/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/cgc/204861112/"><img class="alignright" title="Old Pressure Gauge" src="http://farm1.static.flickr.com/69/204861112_9ac8a897e2_m.jpg" alt="" width="180" height="240" /></a>Influential members of the Agile community recently discussed the current state and history of <a href="http://fit.c2.com/">Fit</a> (the original thing, not <a href="http://fitnesse.org/">Fitnesse</a> or <a href="http://ericlefevre.net/wordpress/2008/06/28/behavior-driven-development-vs-test-driven-requirements/">other</a> <a href="http://ericlefevre.net/wordpress/2007/10/27/concordion-an-alternative-to-fit/">Fit-inspired</a> tools). The conversation took place on <a href="http://twitter.com/">Twitter</a> mostly on Tuesday, March 3rd and Wednesday, March 4th. Here is a transcript.</p>
<p>It was kicked off by an <a href="http://www.hanselminutes.com/default.aspx?showID=169">interview</a> of <a href="http://c2.com/~ward/">Ward Cunningham</a> and <a href="http://jamesshore.com/">James Shore</a> on <a href="http://www.hanselminutes.com/default.aspx?showID=169">Hanselminutes</a> where Ward &amp; James were asked whether Fit was dead.</p>
<p><a href="http://en.wikipedia.org/wiki/Robert_C._Martin">Bob Martin</a> first reacted on Twitter by <a href="http://twitter.com/unclebobmartin/status/1271320606">pointing out</a> that, at any rate, &#8220;FitNesse is thriving&#8221;, along with <a href="http://fitnesse.org/FitNesse.SliM">Slim</a>, a new system that can be used by Fitnesse as an engine to run the test tables.</p>
<p><a href="http://www.michaelfeathers.com/">Michael Feathers</a> <a href="http://twitter.com/mfeathers/status/1271332248">replied</a> <a href="http://twitter.com/mfeathers/status/1271342695">that</a>, in his view, Fit was more appropriate as a seed for other works: &#8220;Take it, grow it locally, and never commit back.&#8221; This <a href="http://twitter.com/jamesshore/status/1271343024">seems</a> <a href="http://twitter.com/jamesshore/status/1271420719">confirmed</a> by James Shore, a former leader of the Fit project (and a successor to Ward in that role): &#8220;Fit core was intentionally resistant to change [...] from an organizational perspective&#8221;</p>
<p>Interestingly, James <a href="http://twitter.com/jamesshore/status/1271366955">believes</a> that both Fit and Fitnesse have &#8220;similar flaws, which could be solved by another approach&#8221;:</p>
<ul>
<li>&#8220;<a href="http://twitter.com/jamesshore/status/1271370800">Fit flaw #1</a>: maintenance. HTML is hard to maintain and refactor.&#8221;</li>
<li>&#8220;<a href="http://twitter.com/jamesshore/status/1271373350">Fit flaw #2</a>: Customers. Customers don&#8217;t generate the documents, and that was the whole idea.&#8221;</li>
<li>&#8220;<a href="http://twitter.com/jamesshore/status/1271376122">Fit flaw #3</a>: Programmers. Fit loves domain models and Whole Value. Most programmers don&#8217;t. Impedance mismatch.&#8221;</li>
</ul>
<p>This last point is actually <a href="http://twitter.com/jbrains/status/1271389646">seen</a> <a href="http://twitter.com/jbrains/status/1271393457">as a benefit</a> by <a href="http://jbrains.ca/">J.B. Rainberger</a>: &#8220;Similar to JUnit, Fit puts positive pressure on programmers. [That said] TDD informs design, but many use JUnit for testing. Fit informs feature design, but many use Fit for testing.&#8221; James <a href="http://twitter.com/jamesshore/status/1271410434">agrees</a>: &#8220;Fit drives the design of the domain layer just as TDD drives separation of concerns.&#8221;</p>
<p>JB &amp; James both <a href="http://twitter.com/jbrains/status/1271398531">note</a> that, regardless of the tool itself, they &#8220;continue to succeed collaborating with customers with Fit&#8217;s table format&#8221;, typically <a href="http://twitter.com/jamesshore/status/1271423304">by</a> &#8220;collaborating with examples on a whiteboard&#8221;.</p>
<p>Possibly, the biggest shortcoming (as stated by James &amp; Ward during the interview, but also <a href="http://twitter.com/marick/status/1271478149">in twitter</a> by <a href="http://www.exampler.com/">Brian Marick</a>: &#8220;I can&#8217;t offhand think of any product owner who wrote tests in any format&#8221;) is that the assumption that business people would write the tables was flawed. A view <a href="http://twitter.com/keithb_b/status/1272858561">not shared</a> by <a href="http://peripateticaxiom.blogspot.com/">Keith Braithwaite</a> &#8220;I&#8217;ve had actual users write tests in tables in excel with success&#8221;. JB, for one, <a href="http://twitter.com/jbrains/status/1271530197">prefers</a> &#8220;Customers help write docs&#8221;, <a href="http://twitter.com/testobsessed/status/1271550456">reformulated</a> by <a href="http://testobsessed.com/">Elisabeth Hendrickson</a> as &#8220;Business stakeholders &amp; implementation team collaborate on articulating expectations.&#8221;</p>
<p>Finally, several people including <a href="http://www.willemvandenende.com/">Willem van den Ende</a> <a href="http://twitter.com/most_alive/status/1273484313">pointed</a> to BDD and <a href="http://twitter.com/most_alive/status/1273498303">especially to</a> <a href="http://cukes.info/">Cucumber</a> as a better implementation of the same ideas &#8220;Cucumber given/when/then steps flow naturally for me, FIT- style tables are optional, I add them later if needed.&#8221;</p>
<p>For more details see the following links:</p>
<ul>
<li>Details by James Shore on <a href="http://jamesshore.com/Blog/Five-Ways-to-Misuse-Fit.html">how to use Fit (or not)</a></li>
<li>Michael Feathers&#8217; <a href="http://my.safaribooksonline.com/9780596510046/framework_for_integrated_test_beauty_through_fragility">opinion on the code that makes the Java implementation of Fit</a></li>
<li>The <a href="http://www.hanselminutes.com/default.aspx?showID=169">interview of Ward Cunningham and James Shore</a> on Hanselminutes</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://ericlefevre.net/wordpress/2009/03/06/is-fit-dead-a-debate-on-twitter/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Fitnesse now supports versioning to SCMs!</title>
		<link>http://ericlefevre.net/wordpress/2009/02/16/fitnesse-now-supports-versioning-to-scms/</link>
		<comments>http://ericlefevre.net/wordpress/2009/02/16/fitnesse-now-supports-versioning-to-scms/#comments</comments>
		<pubDate>Mon, 16 Feb 2009 21:29:57 +0000</pubDate>
		<dc:creator>Eric Lefevre-Ardant</dc:creator>
				<category><![CDATA[fit]]></category>

		<guid isPermaLink="false">http://ericlefevre.net/wordpress/?p=561</guid>
		<description><![CDATA[I really like how Fitnesse is doing these days (I even subscribed to the mailing list, which I had not considered last year, for example). Bob Martin is adding features every few weeks. It is great! In the release he &#8230; <a href="http://ericlefevre.net/wordpress/2009/02/16/fitnesse-now-supports-versioning-to-scms/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I really like how <a href="http://fitnesse.org/">Fitnesse</a> is doing these days (I even subscribed to the <a href="http://tech.groups.yahoo.com/group/fitnesse/">mailing list</a>, which I had not considered last year, for example). <a href="http://blog.objectmentor.com/articles/category/uncle-bobs-blatherings">Bob Martin</a> is adding features every few weeks. It is great!</p>
<p><a href="http://fitnesse.org/.FitNesseDevelopment.FitNesseRelease20090214">In the release he did a couple of days ago</a>, he added 2 interesting things:</p>
<ul>
<li>one is a format tool that helps giving a more readable view of your tables, in editing mode; unfortunately, your edit panel must be using a fixed-size font (which it is not the case by default on my system)</li>
<li>the most interesting addition, though, is the support of SCM tools to store wiki pages</li>
</ul>
<p>There are two ways to configure a SCM tool.</p>
<p>The first is to specify it on the command line:</p>
<pre>  java -DCM_SYSTEM=package.to.AParticularCmSystemIntegrationClass -jar fitnesse.jar</pre>
<p>The second is to specify in a high-level page on your hierarchy of pages:</p>
<pre>  !define CM_SYSTEM {com.project.fitnesse.OurSvnSystem me/my_password /cm/myRespository}</pre>
<p>This one is interesting, because it allows you to have different configurations for different hierarchies of pages (typically one for each different projects, or even for different versions of the same project).</p>
<p>The bad news, though, is that the CM System Integration class in question is not provided by default, though I&#8217;m sure that in time there will be all sorts of appropriate integration classes provided with Fitnesse. But that&#8217;s not the case so far (except for an example made to connect to Git &#8212; not sure how generic it is). That said, it does seem quite easy to implement that class (you basically need to implement calls to the command line in Java).</p>
<p>You might want to download the <a href="http://fitnesse.org/.FitNesseDevelopment.FitNesseRelease20090214">Fitnesse release</a> and check out the FitNesse.UserGuide.SourceCodeControl page. As often with Fitnesse, the website does not have the latest details.</p>
]]></content:encoded>
			<wfw:commentRss>http://ericlefevre.net/wordpress/2009/02/16/fitnesse-now-supports-versioning-to-scms/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Fixed display errors in French translation to Hudson</title>
		<link>http://ericlefevre.net/wordpress/2009/01/02/fixed-display-errors-in-french-translation-to-hudson/</link>
		<comments>http://ericlefevre.net/wordpress/2009/01/02/fixed-display-errors-in-french-translation-to-hudson/#comments</comments>
		<pubDate>Fri, 02 Jan 2009 14:04:05 +0000</pubDate>
		<dc:creator>Eric Lefevre-Ardant</dc:creator>
				<category><![CDATA[hudson]]></category>

		<guid isPermaLink="false">http://ericlefevre.net/wordpress/?p=531</guid>
		<description><![CDATA[I think I have finally fixed (most) errors in the display of the French translation in Hudson. 3 different people reported them to me, which is a sign that Hudson enjoys a strong following in France (I also keep stumbling &#8230; <a href="http://ericlefevre.net/wordpress/2009/01/02/fixed-display-errors-in-french-translation-to-hudson/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://flickr.com/photos/tator82/457046764/"><img class="aligncenter" title="Commençons par la chercher..." src="http://farm1.static.flickr.com/219/457046764_4055ca619d.jpg" alt="" width="429" height="500" /></a></p>
<p>I think I have finally fixed (most) errors in the display of the <a href="http://hudson.gotdns.com/wiki/display/HUDSON/French+Localization">French translation</a> in <a href="http://ericlefevre.net/wordpress/category/process/test/continuous-integration/hudson/">Hudson</a>. 3 different people reported them to me, which is a sign that Hudson enjoys a strong following in France (I also keep stumbling on French Hudson fans in conferences and my colleague Eric Le Merdy has just released a new <a href="http://hudson.gotdns.com/wiki/display/HUDSON/Nabaztag+Plugin">Hudson plugin for Nabaztag</a>).</p>
<p>The root of the problem is that I incorrectly thought that properties should be encoded in UTF-8 (in fact, <a href="https://hudson.dev.java.net/servlets/ReadMsg?listName=dev&amp;msgNo=973">only help pages in HTML should be</a>). In practice, <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/Properties.html">properties files should stay in classic ISO 8859-1</a>.</p>
<p>I didn&#8217;t keep trace of which files I had incorrectly converted to UTF-8 and I don&#8217;t know of a tool that could check that for me (if you know of one, do let me know). So there is still a chance that some files remain in the incorrect format. If you find any, please <a href="https://hudson.dev.java.net/issues/">create a bug report</a>.</p>
<p>The fix should be available with the next release of Hudson, v.1.269, which should be a matter of days, <a href="http://ericlefevre.net/wordpress/2008/04/11/javaposse-mentions-200th-release-of-hudson/">according</a> <a href="http://ericlefevre.net/wordpress/2007/07/29/matrix-project-building-with-hudson/">to history</a>. My progress on the French translation are listed <a href="http://hudson.gotdns.com/wiki/display/HUDSON/French+Localization">on the Hudson wiki</a>.</p>
<p>Apologies to all that were inconvenienced by this bug.</p>
]]></content:encoded>
			<wfw:commentRss>http://ericlefevre.net/wordpress/2009/01/02/fixed-display-errors-in-french-translation-to-hudson/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Bob Martin on Hudson</title>
		<link>http://ericlefevre.net/wordpress/2008/12/11/bob-martin-on-hudson/</link>
		<comments>http://ericlefevre.net/wordpress/2008/12/11/bob-martin-on-hudson/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 21:37:08 +0000</pubDate>
		<dc:creator>Eric Lefevre-Ardant</dc:creator>
				<category><![CDATA[fit]]></category>
		<category><![CDATA[hudson]]></category>

		<guid isPermaLink="false">http://ericlefevre.net/wordpress/?p=526</guid>
		<description><![CDATA[Yep, you heard it here first: Uncle Bob loves Hudson! Not content with the videos on Slim, he has just produced another one showing how to do basic staff with Hudson. And by the sound of his voice, he is &#8230; <a href="http://ericlefevre.net/wordpress/2008/12/11/bob-martin-on-hudson/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Yep, you heard it here first: Uncle Bob loves <a href="https://hudson.dev.java.net/">Hudson</a>!</p>
<p>Not content with the <a href="http://ericlefevre.net/wordpress/2008/11/19/bob-martin-releases-fitnesse-with-slim/">videos</a> <a href="http://ericlefevre.net/wordpress/2008/11/22/comparaison-operators-in-slim-for-fitnesse/">on</a> <a href="http://ericlefevre.net/wordpress/2008/11/29/data-types-in-slim/">Slim</a>, he has just produced <a href="http://blog.objectmentor.com/articles/2008/12/11/hudson-a-very-quick-demo">another one showing how to do basic staff with Hudson</a>. And by the sound of his voice, he is sold!</p>
<p>Inteerstingly, he compares the simple startup process of Hudson to the one in Fitnesse: just download and run.</p>
<p>Update (14/12/08): <a href="http://internal.objectmentor.com:9090/">Uncle Bob has actually put online his Hudson install</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ericlefevre.net/wordpress/2008/12/11/bob-martin-on-hudson/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Data types in Slim</title>
		<link>http://ericlefevre.net/wordpress/2008/11/29/data-types-in-slim/</link>
		<comments>http://ericlefevre.net/wordpress/2008/11/29/data-types-in-slim/#comments</comments>
		<pubDate>Sat, 29 Nov 2008 00:28:51 +0000</pubDate>
		<dc:creator>Eric Lefevre-Ardant</dc:creator>
				<category><![CDATA[fit]]></category>
		<category><![CDATA[tdr]]></category>

		<guid isPermaLink="false">http://ericlefevre.net/wordpress/?p=521</guid>
		<description><![CDATA[After an initial introduction video, one on comparaison operators, Bob Martin has now a video on Data Types in Slim, his Fit replacement in Fitnesse. Data types in Slim are simple. They can only be Strings and Lists, though it &#8230; <a href="http://ericlefevre.net/wordpress/2008/11/29/data-types-in-slim/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>After an <a href="http://ericlefevre.net/wordpress/2008/11/19/bob-martin-releases-fitnesse-with-slim/">initial introduction video</a>, one <a href="http://ericlefevre.net/wordpress/2008/11/22/comparaison-operators-in-slim-for-fitnesse/">on comparaison operators</a>, Bob Martin has now <a href="http://www.fitnesse.org/files/videos/Datatypes.mov">a video on Data Types</a> in Slim, his Fit replacement in Fitnesse.</p>
<p>Data types in Slim are simple. They can only be Strings and Lists, though it is entirely possible for fixtures to actually get integers.</p>
<p>A list looks like this:</p>
<pre>[1, 2, 0.5]</pre>
<p>Note the brackets. Also, note the space between the comas and the following value. This is important, as the comparaison will actually be made between the exact string specified in the table, and the String representation of the List returned by the fixture. Hence, the format in toString() is important.</p>
]]></content:encoded>
			<wfw:commentRss>http://ericlefevre.net/wordpress/2008/11/29/data-types-in-slim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comparaison operators in Slim for Fitnesse</title>
		<link>http://ericlefevre.net/wordpress/2008/11/22/comparaison-operators-in-slim-for-fitnesse/</link>
		<comments>http://ericlefevre.net/wordpress/2008/11/22/comparaison-operators-in-slim-for-fitnesse/#comments</comments>
		<pubDate>Sat, 22 Nov 2008 12:50:14 +0000</pubDate>
		<dc:creator>Eric Lefevre-Ardant</dc:creator>
				<category><![CDATA[fit]]></category>
		<category><![CDATA[tdr]]></category>

		<guid isPermaLink="false">http://ericlefevre.net/wordpress/?p=512</guid>
		<description><![CDATA[Now that the release of Slim is done, Bob Martin is spending time producing tutorial videos. The new one is about comparaisons in Slim. There are two majors things to learn in it: approximate equals ranges The ~= sign means &#8220;approximately equals &#8230; <a href="http://ericlefevre.net/wordpress/2008/11/22/comparaison-operators-in-slim-for-fitnesse/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Now that <a href="http://ericlefevre.net/wordpress/2008/11/19/bob-martin-releases-fitnesse-with-slim/">the release of Slim is done</a>, <a href="http://blog.objectmentor.com/articles/category/uncle-bobs-blatherings">Bob Martin</a> is spending time producing tutorial videos. The <a href="http://fitnesse.org/files/videos/SlimComparisonOperatorsWeb.mov">new one is about comparaisons in Slim</a>.</p>
<p>There are two majors things to learn in it:</p>
<ul>
<li>approximate equals</li>
<li>ranges</li>
</ul>
<p>The ~= sign means &#8220;approximately equals to&#8221;, and depends on the number of decimals; for example,</p>
<pre style="padding-left: 30px;">~=1.3</pre>
<p>in a cell will work for any value between 1.2 and 1.4.</p>
<p>A range allows Slim to accept results between boundaries. For example, put something like</p>
<pre style="padding-left: 30px;">1&lt;_&lt;8</pre>
<p>in a cell and all values between 1 and 8 will be considered valid. This is something that <em>some</em> versions of Fit could do, but not all. With Slim, all versions of Slim will support this (since it will be evaluated on the Fitnesse side).</p>
<p>Last thing: Fitnesse contains a rather powerful expression evaluator that is not specific to Slim or Fit.<br />
For example:</p>
<pre style="padding-left: 30px;">!define TIMES {1000}
|${=5*${TIMES}=}|</pre>
<p>You can combine this construct with the range, and have something like this in your cell:</p>
<pre style="padding-left: 30px;">${=5*${TIMES}=}&lt;_&lt;${=6*${TIMES}=}</pre>
<p>which will appear as</p>
<pre style="padding-left: 30px;">5000&lt;_&lt;6000</pre>
<p>when viewing your wiki page.</p>
<p>Finally, you might want to watch out for the <a href="http://twitter.com/unclebobmartin/statuses/1017718127">coming minor release of Fitnesse</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://ericlefevre.net/wordpress/2008/11/22/comparaison-operators-in-slim-for-fitnesse/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

