<?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>Erik A. Hanson &#187; Unit Testing</title>
	<atom:link href="http://www.eahanson.com/category/unit-testing/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.eahanson.com</link>
	<description>My weblog</description>
	<lastBuildDate>Thu, 06 Jan 2011 02:27:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Expectacular</title>
		<link>http://www.eahanson.com/2010/11/27/expectacular/</link>
		<comments>http://www.eahanson.com/2010/11/27/expectacular/#comments</comments>
		<pubDate>Sat, 27 Nov 2010 22:59:49 +0000</pubDate>
		<dc:creator>Erik</dc:creator>
				<category><![CDATA[My Software]]></category>
		<category><![CDATA[Objective C]]></category>
		<category><![CDATA[Unit Testing]]></category>

		<guid isPermaLink="false">http://www.eahanson.com/?p=134</guid>
		<description><![CDATA[I started working on a matcher library for Cocoa/Objective-C called Expectacular. My main goals were to have a syntax that I prefer over OCHamcrest&#8216;s syntax, and to have something that XCode&#8217;s code sense feature will understand so it can autocomplete my code. Here are some examples: [Expect int:[myArray count] toEqual:4]; [Expect object:user.name toEqual:@"Fred"]; [Expect array:validTokens [...]]]></description>
			<content:encoded><![CDATA[<p>I started working on a matcher library for Cocoa/Objective-C called Expectacular. My main goals were to have a syntax that I prefer over <a href="https://github.com/360/OCHamcrest">OCHamcrest</a>&#8216;s syntax, and to have something that XCode&#8217;s code sense feature will understand so it can autocomplete my code.</p>
<p>Here are some examples:</p>
<pre>
[Expect int:[myArray count] toEqual:4];

[Expect object:user.name toEqual:@"Fred"];

[Expect array:validTokens toContainObject:user.token];

[Expect block:^{
    [fluxCapacitor rethread];
} toThrowExceptionWithReason:@"Uncharged capacitors cannot be rethreaded."];

[Expect blockToNotThrowException:^{
    [fluxCapacitor charge];
    [fluxCapacitor rethread];
}];
</pre>
<p>and here are some screenshots of the code completion in action:</p>
<p><a href="http://www.eahanson.com/weblog/wp-content/uploads/2010/11/Screen-shot-2010-11-27-at-2.44.33-PM.png"><img src="http://www.eahanson.com/weblog/wp-content/uploads/2010/11/Screen-shot-2010-11-27-at-2.44.33-PM.png" alt="" title="Completion" width="456" height="24" class="aligncenter size-full wp-image-138" /></a></p>
<p><a href="http://www.eahanson.com/weblog/wp-content/uploads/2010/11/bbb.png"><img src="http://www.eahanson.com/weblog/wp-content/uploads/2010/11/bbb.png" alt="" title="completion2" width="464" height="118" class="aligncenter size-full wp-image-140" /></a></p>
<p>Check out the <a href="https://github.com/eahanson/Expectacular">GitHub repo</a> or the <a href="https://www.pivotaltracker.com/projects/152569">public Pivotal Tracker project</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.eahanson.com/2010/11/27/expectacular/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solutions To Slow Test Suites</title>
		<link>http://www.eahanson.com/2009/06/05/solutions-to-slow-test-suites/</link>
		<comments>http://www.eahanson.com/2009/06/05/solutions-to-slow-test-suites/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 18:23:54 +0000</pubDate>
		<dc:creator>Erik</dc:creator>
				<category><![CDATA[Selenium]]></category>
		<category><![CDATA[Unit Testing]]></category>

		<guid isPermaLink="false">http://www.eahanson.com/?p=79</guid>
		<description><![CDATA[As a proponent of test driven development, I&#8217;m naturally a big fan of writing automated tests. Often, clients who are new to writing automated tests start out by writing big integration tests (with tools like Selenium). This is an easy way to start testing an app that wasn&#8217;t written with testability in mind. Unfortunately, these [...]]]></description>
			<content:encoded><![CDATA[<p>As a proponent of <a href="http://en.wikipedia.org/wiki/Test-driven_development">test driven development</a>, I&#8217;m naturally a big fan of writing automated tests. </p>
<p>Often, clients who are new to writing automated tests start out by writing big integration tests (with tools like <a href="http://seleniumhq.org/">Selenium</a>). This is an easy way to start testing an app that wasn&#8217;t written with testability in mind.</p>
<p>Unfortunately, these sorts of tests tend to be slow and brittle, and when they fail they don&#8217;t always point directly to a broken line of code in the way that a unit test would.</p>
<p>Over the years, I&#8217;ve come across a number of ways to help clients speed up and otherwise improve their test suites and I thought I&#8217;d enumerate them here.</p>
<h3>Better Feedback</h3>
<h4>Continuous Builds</h4>
<p>Continuous builds are vital to any tested application. I&#8217;ve used a few of them, but the simplest one I&#8217;ve used is <a href="http://cruisecontrolrb.thoughtworks.com/">CruiseControl.rb</a>, a version of CruiseControl written in Ruby. It can run tests written in any language, and it is about 1000 times easier to deal with than the legacy version of CruiseControl.</p>
<p>I&#8217;ve also had a few clients who wrote their own continuous build systems. Two of them were simple (in a good way), and one seemed horribly complex. If you&#8217;re going to write your own, keep it simple!</p>
<h4>Visible Continuous Build Monitor</h4>
<p>If you&#8217;re lucky enough to have all your developers in a single room, you should consider displaying the continuous build results somewhere. Some clients have set up some hardware to show the status: red/green lava lamps, &#8220;pass&#8221;/&#8221;fail&#8221; neon signs, and Ambient Orbs that change color from red to green. A simpler solution is to display the status on a big TV screen or monitor. An old iMac seems like a really good way to display the status. There are now digital picture frames that can be updated over wifi &#8212; I wonder if those might be a cheap solution.</p>
<h4>Fast-Failing Continuous Build</h4>
<p>I helped one client who had written their own continuous build system to modify it so that the build turned red as soon as any test failed. They were usually able to check in a fix for the failing test before the suite finished running so that the fix was included in the very next build.</p>
<h3>Encourage Unit Tests</h3>
<p>While I believe that integration tests are important, the majority of a project&#8217;s tests should be unit tests. Unit tests are faster, less brittle, and when they fail, they often point directly at the code that&#8217;s not working.</p>
<h4>When A Bug Is Found, Write a Unit Test</h4>
<p>One way to build up a suite of unit tests for a program that doesn&#8217;t have very many is to commit to writing a unit test to expose any bug that&#8217;s found in the system. Sometimes in a non-test-driven codebase, it&#8217;s hard to write a really good unit test for a bug, but just adding coverage for part of the issue is a good step.</p>
<h4>When An Integration Test Fails, Write A Unit Test</h4>
<p>When an integration test fails, it&#8217;s often hard to tell exactly what went wrong. This is a good opportunity to write a unit test so that the next time something similar fails, you&#8217;ll have a very narrow test that finds it.</p>
<h4>Ashcroft</h4>
<p>There is a tool for Java called <a href="http://docs.codehaus.org/display/ASH/Home">Ashcroft</a> which will cause your test to fail if it does things that a strict unit test shouldn&#8217;t: start a thread, access the filesystem or network, etc. </p>
<p>I&#8217;ve helped clients separate their test suite into a &#8220;slow test&#8221; suite and a fast Ashcroft-enforced unit test suite. On the projects that have had this, developers would often try first to make an Ashcroft-compliant test and only settle for a slower integration test if they ran into trouble. (Sometimes on a project that wasn&#8217;t completely test driven, certain unit tests are just going to take too long to write.)</p>
<p>The Ashcroft suites usually run thousands of tests in a few seconds, whereas the slow suites usually run hundreds of tests in an hour.</p>
<h4>Fake Services</h4>
<p>You can often speed up tests by replacing some services with fake versions. For example, you might use an in-memory database such as <a href="http://hsqldb.org/">HSQL</a> or <a href="http://mayfly.sourceforge.net/">Mayfly</a>. Or you might fake out a custom service with a faster one. For example, I have an app that stores files on Amazon S3 by calling a simple storage class I wrote. The tests use a different storage class that implements the same interface but stores the files in memory.</p>
<h3>Remove Unnecessary Waiting</h3>
<p>I&#8217;ve run across many Selenium tests that perform some action, wait a number of seconds, and then perform another action. All that waiting really adds up and leads to very long test suites.</p>
<p>An easy solution is to use Selenium&#8217;s <a href="http://wiki.openqa.org/display/SEL/waitForCondition">waitForCondition</a> command. For example, if your test clicks on a button that fires an asynchronous event and then shows the result on the page, instead of clicking, waiting 5 seconds and then asserting that the result is visible, just click wait for the result to become visible.</p>
<p>A similar approach is to create a waitForCondition-type method in your own code which calls a function repeatedly until it is true or until a timeout occurs.</p>
<h3>Distribute Tests</h3>
<p>One way to speed up a test suite is to throw hardware at it.</p>
<h4>Multiple Builds</h4>
<p>The simplest way to throw hardware at the problem is to split your continuous build into multiple suites, each of which run on its own server. You could write a script to check the results of each continuous build and tell you if the whole project is red or green, or just look at all the results and consider the entire project red if any of the suites are red. (Hopefully you have some sort of multiple-project continuous build dashboard like <a href="http://ci.pivotallabs.com/">this one</a>.)</p>
<h4>MapReduce</h4>
<p>One of my former clients distributes their tests using MapReduce. I don&#8217;t think they use <a href="http://aws.amazon.com/elasticmapreduce/">Amazon&#8217;s MapReduce</a> service, but that does seem like an easy way to throw a bunch of computers at your problem.</p>
<h4>Selenium Farm</h4>
<p>One reason that Selenium tests are so slow is that they run tests in a browser. Often, a team will want to test against different browsers at once, resulting in an even longer test run. I&#8217;ve helped clients speed up their test suites by putting together a farm of servers that run different browsers, and then running a bunch of tests in parallel. I found that on an ordinary developer box, I could easily run tests in 4 threads if the work of launching and running browsers was offloaded onto the farm.</p>
<p>I&#8217;ve also helped a couple clients run their JsUnit tests in Selenium to let them take advantage of the Selenium infrastructure. Basically, it amounts to writing a Selenium test that opens the JsUnit test runner page, clicks &#8220;run&#8221; and parses the results. </p>
<p>Setting up a Selenium farm is not trivial. Luckily, some folks have written and released an open source library called <a href="http://selenium-grid.seleniumhq.org/">Selenium Grid</a> to help. I haven&#8217;t used it, but it looks promising.</p>
<h4>Test Running Services</h4>
<p>A company called <a href="http://saucelabs.com/">Sauce Labs</a> is working on a service that runs Selenium tests. It doesn&#8217;t seem to be available yet, but the idea sounds very promising.</p>
<h3>Conclusion</h3>
<p>You can greatly improve your test suite run time, especially if you combine multiple solutions, if you don&#8217;t mind putting some time and money into the problem. Considering the costs of a slow test suite, I think it&#8217;s almost always worth the investment.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.eahanson.com/2009/06/05/solutions-to-slow-test-suites/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Running Jasmine Tests Through Jaxer</title>
		<link>http://www.eahanson.com/2009/06/04/running-jasmine-tests-through-jaxer/</link>
		<comments>http://www.eahanson.com/2009/06/04/running-jasmine-tests-through-jaxer/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 00:51:39 +0000</pubDate>
		<dc:creator>Erik</dc:creator>
				<category><![CDATA[Jasmine]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Jaxer]]></category>
		<category><![CDATA[Unit Testing]]></category>
		<category><![CDATA[Web development]]></category>

		<guid isPermaLink="false">http://www.eahanson.com/?p=98</guid>
		<description><![CDATA[Jasmine? Jaxer? Jasmine is a new Javascript testing framework from my pals at Pivotal Labs. Jaxer is an Apache module that wraps Firefox&#8217;s Javascript and rendering engine, providing a server-side Javascript environment that&#8217;s fast and compatible with any JS that works in Firefox (including all kinds of DOM manipulation and libraries like Prototype, jQuery, etc.). [...]]]></description>
			<content:encoded><![CDATA[<h3>Jasmine? Jaxer?</h3>
<p><a href="http://github.com/pivotal/jasmine/tree/master">Jasmine</a> is a new Javascript testing framework from my pals at <a href="http://pivotallabs.com/">Pivotal Labs</a>. </p>
<p><a href="http://www.aptana.com/jaxer">Jaxer</a> is an Apache module that wraps Firefox&#8217;s Javascript and rendering engine, providing a server-side Javascript environment that&#8217;s fast and compatible with any JS that works in Firefox (including all kinds of DOM manipulation and libraries like Prototype, jQuery, etc.).</p>
<h3>Running Jasmine Tests Through Jaxer</h3>
<p>Part of an app I&#8217;m writing uses Jaxer and I wanted to write my tests in Jasmine, so I wrote a test runner and reporter to bridge the two, and then I wrote a rake task to run the tests.</p>
<p>So now I can run &#8220;rake spec&#8221; and my JS tests will run, in Firefox, but without having to actually have Firefox open up (or be installed).</p>
<p>So:</p>
<pre>
rake spec
</pre>
<p>returns:</p>
<pre>
.    foo should do something.
.    foo should do something else.
.    foo should do yet another thing.

3 of 3 specs passed
</pre>
<p>And the whole thing takes <b>0.37 seconds</b>. It should be noted that those are trivial tests, but running a JS test suite with only 0.37 seconds of overhead is pretty neat.</p>
<p>My rake task looks like:</p>
<pre>
task :spec do
  results = `curl -s http://127.0.0.1:8081/jaxer-service/jasmine-jaxer`
  print results
  fail "spec failures" if results.match(/FAILURES!/)
end
</pre>
<h3>Download</h3>
<p>The JS code that hooks Jasmine to Jaxer is here: <a href="http://www.eahanson.com/code/jasmine-jaxer.js">jasmine-jaxer.js</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.eahanson.com/2009/06/04/running-jasmine-tests-through-jaxer/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Firing mouse events in tests</title>
		<link>http://www.eahanson.com/2008/01/01/firing-mouse-events-in-tests/</link>
		<comments>http://www.eahanson.com/2008/01/01/firing-mouse-events-in-tests/#comments</comments>
		<pubDate>Wed, 02 Jan 2008 04:17:48 +0000</pubDate>
		<dc:creator>Erik</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JsUnit]]></category>
		<category><![CDATA[Unit Testing]]></category>
		<category><![CDATA[Web development]]></category>

		<guid isPermaLink="false">http://www.eahanson.com/2008/01/01/firing-mouse-events-in-tests/</guid>
		<description><![CDATA[The Bad News Sending mouse events such as click and mouseover in JsUnit tests can be really hard. More Bad News Prototype doesn&#8217;t make it any easier. Sam Stephenson says: We would very much like to support it in the future. It&#8217;s fairly complicated to implement native event firing across all supported browsers, so in [...]]]></description>
			<content:encoded><![CDATA[<h4>The Bad News</h4>
<p>Sending mouse events such as <code>click</code> and <code>mouseover</code> in <a href="http://jsunit.net">JsUnit</a> tests can be really hard.</p>
<h4>More Bad News</h4>
<p><a href="http://prototypejs.org">Prototype</a> doesn&#8217;t make it any easier. Sam Stephenson <a href="http://groups.google.com/group/prototype-core/browse_thread/thread/9fec287978138250">says</a>:</p>
<blockquote><p>
We would very much like to support it in the future.  It&#8217;s fairly complicated to implement native event firing across all supported browsers, so in 1.6.0, fire works with custom events only.
</p></blockquote>
<h4>YUI To The Rescue</h4>
<p><a href="http://developer.yahoo.com/yui/yuitest/#useractions">YAHOO.util.UserActions</a> can simulate some user actions. Unfortunately, calls to YUI can look a bit clunky in a Prototype-heavy codebase:</p>
<pre>
var element = new Element("div").insert("Hi");
var offset = element.cumulativeOffset();
YAHOO.util.UserAction.click(element, { shiftKey: true });
</pre>
<h4>YUI + Prototype FTW</h4>
<p>A little mixin magic:</p>
<pre>
Element.addMethods({
  simulateClick: YAHOO.util.UserAction.click.bind(YAHOO.util.UserAction),
  simulateDblClick: YAHOO.util.UserAction.dblclick.bind(YAHOO.util.UserAction),
  simulateMousedown: YAHOO.util.UserAction.mousedown.bind(YAHOO.util.UserAction),
  simulateMouseup: YAHOO.util.UserAction.mouseup.bind(YAHOO.util.UserAction),
  simulateMouseover: YAHOO.util.UserAction.mouseover.bind(YAHOO.util.UserAction),
  simulateMouseout: YAHOO.util.UserAction.mouseout.bind(YAHOO.util.UserAction),
  simulateMousemove: YAHOO.util.UserAction.mousemove.bind(YAHOO.util.UserAction)
});
</pre>
<p>and now our test code looks nicer:</p>
<pre>
var element = new Element("div").insert("Hi");
var offset = element.cumulativeOffset();
myElement.simulateClick({ shiftKey: true });
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.eahanson.com/2008/01/01/firing-mouse-events-in-tests/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Big New Feature In JsUnit 2.2 alpha 25</title>
		<link>http://www.eahanson.com/2007/08/13/big-new-feature-in-jsunit-22-alpha-25/</link>
		<comments>http://www.eahanson.com/2007/08/13/big-new-feature-in-jsunit-22-alpha-25/#comments</comments>
		<pubDate>Mon, 13 Aug 2007 08:21:33 +0000</pubDate>
		<dc:creator>Erik</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JsUnit]]></category>
		<category><![CDATA[Unit Testing]]></category>

		<guid isPermaLink="false">http://www.eahanson.com/2007/08/13/big-new-feature-in-jsunit-22-alpha-25/</guid>
		<description><![CDATA[In order to run all test functions in a test page, JsUnit naturally needs to know what those test functions are. It's able to get a list of those functions from Firefox, Safari and Opera, but it's not able to get them from Internet Explorer. So in IE, JsUnit has to resort to searching the text of all scripts for strings that look like test function names. Unfortunately, it doesn't understand comments so commented-out test functions will end up running anyway. ]]></description>
			<content:encoded><![CDATA[<p>In order to run all test functions in a test page, <a href="http://www.jsunit.net/">JsUnit</a> naturally needs to know what those test functions are. It&#8217;s able to get a list of those functions from Firefox, Safari and Opera, but it&#8217;s not able to get them from Internet Explorer. </p>
<p>So in IE, JsUnit has to resort to searching the text of all scripts for strings that look like test function names. Unfortunately, it doesn&#8217;t understand comments so commented-out test functions will end up running anyway. </p>
<p>Recently, Dean McNamee and <a href="http://pupius.co.uk/">Dan Pupius</a> alerted <a href="http://edwardh.com/">Edward Hieatt</a> and me to an undocumented Internet Explorer Javascript function called <tt>RuntimeObject</tt> and suggested JsUnit might be able to use it to discover test functions. </p>
<p>I replaced the text searching with <tt>RuntimeObject</tt> and tagged it as version 2.2 alpha 25. (I also added an <tt>assertEqualsIgnoringOrder</tt> function while I was making changes.)</p>
<p>Browse the new version <a href="http://jsunit.svn.sourceforge.net/viewvc/jsunit/tags/v2_2alpha25/jsunit/">at SourceForge</a> or check it out like this:</p>
<div class="code">svn co https://jsunit.svn.sf.net/svnroot/jsunit/tags/v2_2alpha25/jsunit/ jsunit</div>
<p>Try it out and <a href="http://tech.groups.yahoo.com/group/jsunit/">let us know</a> if there are any problems.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.eahanson.com/2007/08/13/big-new-feature-in-jsunit-22-alpha-25/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Minor New Features In JsUnit 2.2alpha24</title>
		<link>http://www.eahanson.com/2007/08/09/minor-new-features-in-jsunit-22alpha24/</link>
		<comments>http://www.eahanson.com/2007/08/09/minor-new-features-in-jsunit-22alpha24/#comments</comments>
		<pubDate>Fri, 10 Aug 2007 01:46:36 +0000</pubDate>
		<dc:creator>Erik</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JsUnit]]></category>
		<category><![CDATA[Unit Testing]]></category>

		<guid isPermaLink="false">http://www.eahanson.com/2007/08/09/minor-new-features-in-jsunit-22alpha24/</guid>
		<description><![CDATA[I added a few new features to JsUnit and tagged it as version 2.2 alpha 24: new log button, new URL parameters, and easier suite creation.]]></description>
			<content:encoded><![CDATA[<p>I added a few new features to <a href="http://jsunit.net">JsUnit</a> and tagged it as version 2.2 alpha 24. Browse the new version <a href="http://jsunit.svn.sourceforge.net/viewvc/jsunit/tags/v2_2alpha24/jsunit/">at SourceForge</a> or check it out like this:</p>
<div class="code">
  svn co https://jsunit.svn.sf.net/svnroot/jsunit/tags/v2_2alpha24/jsunit/ jsunit
</div>
<h3>Show Log</h3>
<p>There&#8217;s now a &#8220;Show Log&#8221; button that opens a window with a log of what JsUnit has been up to.</p>
<p><a href="http://www.eahanson.com/weblog/wp-content/uploads/2007/08/testrunner.jpg" title="New Log Button"><img src="http://www.eahanson.com/weblog/wp-content/uploads/2007/08/testrunner.thumbnail.jpg" alt="New Log Button" /></a></p>
<p>New log button (click image for larger view)</p>
<p><a href="http://www.eahanson.com/weblog/wp-content/uploads/2007/08/log.gif" title="New Log Window"><img src="http://www.eahanson.com/weblog/wp-content/uploads/2007/08/log.thumbnail.gif" alt="New Log Window" /></a></p>
<p>New log window (click image for larger view)</p>
<h3>New URL Parameters</h3>
<p>There are three new URL parameters:</p>
<ul>
<li><tt>suppressDialogs=true</tt> will suppress JsUnit&#8217;s dialogs in interactive mode</li>
<li><tt>setupPageTimeout=<em>n</em></tt> will change the timeout for the setupPage call</li>
<li><tt>pageLoadTimeout=<em>n</em></tt> will change the page load timeout</li>
</ul>
<h3>Easier Suite Creation</h3>
<p>The <tt>jsUnitTestSuite</tt> constructor now accepts test pages and subsuites as parameters. So instead of this:</p>
<pre>
function suite() {
  var suite = new jsUnitTestSuite();
  suite.addTestPage("/foo/barTest.html");
  suite.addTestPage("/foo/bazTest.html");
  return suite;
}</pre>
<p>you can do this:</p>
<pre>
function suite() {
  return new jsUnitTestSuite("/foo/barTest.html", "/foo/bazTest.html");
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.eahanson.com/2007/08/09/minor-new-features-in-jsunit-22alpha24/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

