<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4057789319984003600</id><updated>2012-01-15T20:49:14.073+01:00</updated><category term='install'/><category term='screen'/><category term='slides'/><category term='exploratory testing'/><category term='specification'/><category term='continuous integration'/><category term='tools'/><category term='mysql'/><category term='concordion'/><category term='web'/><category term='jndi'/><category term='FIT'/><category term='alliance functional testing tools visioning workshop'/><category term='glassfish'/><category term='CI'/><category term='selenium'/><category term='webdriver'/><category term='multi touch'/><category term='api'/><category term='open space'/><category term='test'/><category term='iphone'/><category term='scrum'/><category term='agile'/><category term='spring'/><category term='functional'/><category term='incremental continuous integration'/><category term='video'/><category term='visioning'/><category term='smidig2007'/><category term='AAFTT'/><category term='watir'/><category term='framework'/><category term='ubuntu'/><category term='release'/><category term='cubictest'/><category term='ipod touch'/><category term='connection-pool'/><category term='xp'/><category term='database'/><title type='text'>Measuring in Cubics</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.skytteren.no/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.skytteren.no/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Stein Kåre Skytteren</name><uri>http://www.blogger.com/profile/17586128854113779189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://bp1.blogger.com/_4lV768qOI_I/R1LHINwlDDI/AAAAAAAAAEk/gf474KVIzHQ/S220/portrett2_s_h.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4057789319984003600.post-5660269293004879728</id><published>2009-06-14T21:26:00.011+02:00</published><updated>2009-06-14T22:17:50.342+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='glassfish'/><category scheme='http://www.blogger.com/atom/ns#' term='jndi'/><category scheme='http://www.blogger.com/atom/ns#' term='connection-pool'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Using MySQL connection pool in Glassfish V3</title><content type='html'>&lt;p&gt;
I tried with a simple data source in &lt;a href="http://www.springsource.org/"&gt;Spring&lt;/a&gt;, but it isn't meant for production environments. So I wanted to move from:
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;
   &amp;lt;bean id="simpleDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"&amp;gt;&lt;br/&gt;
        &amp;lt;property name="driverClassName" value="com.mysql.jdbc.Driver"/&amp;gt;&lt;br/&gt;
        &amp;lt;property name="url" value="jdbc:mysql://localhost:3306/database"/&amp;gt;&lt;br/&gt;
        &amp;lt;property name="username" value="database"/&amp;gt;&lt;br/&gt;
        &amp;lt;property name="password" value="s3cr3t"/&amp;gt;&lt;br/&gt;
    &amp;lt;/bean&gt;
&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
to:
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;
    &amp;lt;bean id="jndiDataSource" class="org.springframework.jndi.JndiObjectFactoryBean"&amp;gt;&lt;br/&gt;
     &amp;lt;property name="jndiName" value="jdbc/databasePool" /&amp;gt;  &lt;br/&gt;
    &amp;lt;/bean&amp;gt;
&lt;/code&gt;
&lt;p&gt;
&lt;p&gt;
where &lt;code&gt;jdbc/databasePool&lt;/code&gt; is configured in Glassfish. The reason for this is that the connection handling is a lot better when using a proper connection pool.
&lt;/p&gt;
&lt;p&gt;
First we need to install the mysql library in Glassfish. I use Ubuntu so:
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;
sudo apt-get install libmysql-java
&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
then I linked it into the Glassfish classpath:
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;
sudo -u glassfish ln -s /usr/share/java/mysql.jar /opt/glassfishv3-prelude/glassfish/lib/mysql.jar
&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
If you don't use the Ubuntu just add the mysql.jar to the &lt;code&gt;/opt/glassfishv3-prelude/glassfish/lib&lt;/code&gt; folder.
&lt;/p&gt;
&lt;p&gt;
Then restart the server to get it added to the classpath. (Look at my previous post for further instructions.)
&lt;/p&gt;
&lt;p&gt;
Then install the connection-pool:
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;
./asadmin create-jdbc-connection-pool --datasourceclassname com.mysql.jdbc.jdbc2.optional.MysqlDataSource --allownoncomponentcallers=true --property user=database:password=s3cr3t:DatabaseName=database:ServerName=localhost:port=3306 database-pool
&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
The &lt;code&gt;--allownoncomponentcallers=true&lt;/code&gt; parameter is important to let Spring access the resource directly.
&lt;/p&gt;
&lt;p&gt;
Test the connection:
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;
./asadmin ping-connection-pool database-pool
&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
To make it avaliable to the spring configuration: 
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;
./asadmin create-jdbc-resource --connectionpoolid database-pool jdbc/databasePool
&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
That's it! Good luck!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4057789319984003600-5660269293004879728?l=blog.skytteren.no' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.skytteren.no/feeds/5660269293004879728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4057789319984003600&amp;postID=5660269293004879728' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/5660269293004879728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/5660269293004879728'/><link rel='alternate' type='text/html' href='http://blog.skytteren.no/2009/06/using-mysql-connection-pool-in.html' title='Using MySQL connection pool in Glassfish V3'/><author><name>Stein Kåre Skytteren</name><uri>http://www.blogger.com/profile/17586128854113779189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://bp1.blogger.com/_4lV768qOI_I/R1LHINwlDDI/AAAAAAAAAEk/gf474KVIzHQ/S220/portrett2_s_h.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057789319984003600.post-6500506620726662883</id><published>2009-05-22T08:13:00.007+02:00</published><updated>2009-11-21T08:28:01.566+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='install'/><category scheme='http://www.blogger.com/atom/ns#' term='glassfish'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Installing Glassfish V3 on Ubuntu</title><content type='html'>&lt;p&gt;
I've been using Tomcat for some time but I'd like to use Glassfish V3 instead as I think it's (going to be) an amazing application server. This is a tutorial based on how I installed it on Ubuntu 9.04 Jaunty Jackalope. 
&lt;/p&gt;
&lt;br/&gt;
If you haven't install JDK6 do that first. 
&lt;br/&gt;
&lt;code&gt;
sudo apt-get install sun-java6-jdk
&lt;/code&gt;
&lt;br/&gt;
Get glassfish (I use the zip file as the sh file didn't complete the download).
&lt;br/&gt;
&lt;code&gt;
wget http://download.java.net/glassfish/v3-prelude/release/glassfish-v3-prelude.zip
&lt;/code&gt;
&lt;br/&gt;
Unziping glassfish (I didn't have unzip so I installed it first by running: &lt;code&gt;sudo apt-get install unzip&lt;/code&gt; )
&lt;br/&gt;
&lt;code&gt;
sudo unzip glassfish-v3-prelude.zip
&lt;/code&gt;
&lt;br/&gt;
Move it to the opt folder
&lt;br/&gt;
&lt;code&gt;
sudo mv glassfishv3-prelude /opt
&lt;/code&gt;
&lt;br/&gt;
First add a glassfish system user
&lt;br/&gt;
&lt;code&gt;
sudo useradd --system glassfish -d /opt/glassfishv3-prelude
&lt;/code&gt;
&lt;br/&gt;
Set admin group
&lt;br/&gt;
&lt;code&gt;
sudo chgrp -R admin /opt/glassfishv3-prelude
&lt;/code&gt;
&lt;br/&gt;
Set glassfish as the owner
&lt;br/&gt;
&lt;code&gt;
sudo chown -R glassfish glassfishv3-prelude
&lt;/code&gt;
&lt;br/&gt;
Go into the install directory
&lt;br/&gt;
&lt;code&gt;
cd glassfishv3-prelude
&lt;/code&gt;
&lt;br/&gt;
Set the executable files:
&lt;br/&gt;
&lt;code&gt;
sudo chmod -R +x bin/
sudo chmod -R +x glassfish/bin/
&lt;/code&gt;
&lt;br/&gt;
Start the default glassfish domain (domain1)
&lt;br/&gt;
&lt;code&gt;
sudo -u glassfish bin/asadmin start-domain domain1
&lt;/code&gt;
&lt;br/&gt;
To have Glassfish start automatically when you start Ubuntu. You need to add a &lt;code&gt;glassfish&lt;/code&gt; file to the &lt;code&gt;/etc/init.d/&lt;/code&gt; folder. Pick you favorite editor (I use vim).
&lt;br/&gt;
&lt;code&gt;
sudo vim /etc/init.d/glassfish
&lt;/code&gt;
&lt;br/&gt;
Enter the following:
&lt;br/&gt;
&lt;code&gt;
#! /bin/sh
&lt;br/&gt;
&lt;br/&gt;
GLASSFISHPATH=/opt/glassfishv3-prelude/bin
&lt;br/&gt;
&lt;br/&gt;
case "$1" in
&lt;br/&gt;
start)
&lt;br/&gt;
echo "starting glassfish from $GLASSFISHPATH"
&lt;br/&gt;
sudo -u glassfish $GLASSFISHPATH/asadmin start-domain domain1
&lt;br/&gt;
;;
&lt;br/&gt;
restart)
&lt;br/&gt;
$0 stop
&lt;br/&gt;
$0 start
&lt;br/&gt;
;;
&lt;br/&gt;
stop)
&lt;br/&gt;
echo "stopping glassfish from $GLASSFISHPATH"
&lt;br/&gt;
sudo -u glassfish $GLASSFISHPATH/asadmin stop-domain domain1
&lt;br/&gt;
;;
&lt;br/&gt;
*)
&lt;br/&gt;
echo $"usage: $0 {start|stop|restart}"
&lt;br/&gt;
exit 3
&lt;br/&gt;
;;
&lt;br/&gt;
esac
&lt;br/&gt;
:
&lt;/code&gt;
&lt;br/&gt;
Changing the users rights
&lt;br/&gt;
&lt;code&gt;
sudo chmod a+x /etc/init.d/glassfish 
&lt;/code&gt;
&lt;br/&gt;
Then install it on all runlevels:
&lt;br/&gt;
&lt;code&gt;
sudo update-rc.d glassfish defaults
&lt;/code&gt;
&lt;br/&gt;
That is it! I hope this tutorial was helpfull.
&lt;p&gt;
I got help from all around the world to complete this tutorial but special thanks to &lt;a href="https://gfw.appspot.com/computingwithjasper/search/label/Glassfish"&gt;computing with jasper&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4057789319984003600-6500506620726662883?l=blog.skytteren.no' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.skytteren.no/feeds/6500506620726662883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4057789319984003600&amp;postID=6500506620726662883' title='23 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/6500506620726662883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/6500506620726662883'/><link rel='alternate' type='text/html' href='http://blog.skytteren.no/2009/05/installing-glassfish-v3-on-ubuntu.html' title='Installing Glassfish V3 on Ubuntu'/><author><name>Stein Kåre Skytteren</name><uri>http://www.blogger.com/profile/17586128854113779189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://bp1.blogger.com/_4lV768qOI_I/R1LHINwlDDI/AAAAAAAAAEk/gf474KVIzHQ/S220/portrett2_s_h.jpg'/></author><thr:total>23</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057789319984003600.post-7170557203325119102</id><published>2008-06-25T11:15:00.012+02:00</published><updated>2008-06-25T13:35:16.099+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FIT'/><category scheme='http://www.blogger.com/atom/ns#' term='cubictest'/><category scheme='http://www.blogger.com/atom/ns#' term='concordion'/><category scheme='http://www.blogger.com/atom/ns#' term='AAFTT'/><category scheme='http://www.blogger.com/atom/ns#' term='alliance functional testing tools visioning workshop'/><category scheme='http://www.blogger.com/atom/ns#' term='specification'/><title type='text'>concordion:run</title><content type='html'>&lt;p&gt;
I just became a committer at &lt;a href="http://www.concordion.org"&gt;Concordion.org&lt;/a&gt; and I'm really happy for the confidence. 
&lt;/p&gt;
&lt;h2&gt;The basic questions: What have I committed?&lt;/h2&gt;
&lt;p&gt;The answer is: &lt;code&gt;concordion:run&lt;/code&gt; which is a way to run another Concordion testes form this test. An example (would be handy right about now):
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-style:italic;"&gt;&lt;a href="checkThis.html" concordion:run="concordion"&gt;check this test&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;code:&lt;/p&gt;
&lt;code&gt;
&amp;lt;html&amp;gt;...&amp;lt;body&amp;gt;
...
&amp;lt;a href="checkThis.html" concordion:run="concordion"&amp;gt;check this test&amp;lt;/a&amp;gt;
...
&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;
&lt;/code&gt;
&lt;p&gt;
This test will run the "checkThis.html" concordion test. 
&lt;/p&gt;
&lt;p&gt;
You might think that it doesn't matter what you put in attribute value. That it's just there for completeness and the story would end there, but that’s not the case. 
&lt;/p&gt;
&lt;h2&gt;One to rule them all&lt;/h2&gt;
&lt;p&gt;
I think that a lot of people have invested a lot of time and effort in learning other frameworks like FIT, CubicTest and so on. So why can’t we just write Concordion tests like this:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-style:italic;"&gt;&lt;a href="#" concordion:run="fit"&gt;Given users in the database &lt;/a&gt;
when &lt;span&gt;Bob&lt;/span&gt; &lt;a href="#"&gt;logs in&lt;/a&gt; with password "&lt;span&gt;password&lt;/span&gt;"
and &lt;a href="#"&gt;changes password &lt;/a&gt; to "&lt;span&gt;secret&lt;/span&gt;" 
then the password is "&lt;span&gt;secret&lt;/span&gt;".&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;code:&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;
&amp;lt;html&amp;gt;&lt;br/&gt;
...&lt;br/&gt;
&amp;lt;body&amp;gt;&lt;br/&gt;
...&lt;br/&gt;
&amp;lt;p&amp;gt;&lt;br/&gt;
&amp;lt;a href="../fit/userSetup.html" concordion:run="fit"&amp;gt;Given users in the database &amp;lt;/a&amp;gt;&lt;br/&gt;
when &amp;lt;span concordion:set="#user"&amp;gt;Bob&amp;lt;/span&amp;gt; &amp;lt;a href="../cubictest/login.aat" concordion:run="cubictest"&amp;gt;logs in&amp;lt;/a&amp;gt; with password
"&amp;lt;span concordion:set="#password"&amp;gt;password&amp;lt;/span&amp;gt;"&lt;br/&gt;
and &amp;lt;a href="../cubictest/changePassword.aat" &lt;br/&gt;concordion:run="cubictest"&amp;gt;changes password &amp;lt;/a&amp;gt; to "&amp;lt;span concordion:set="#newpassword"&amp;gt;secret&amp;lt;/span&amp;gt;" 
then the password is "&amp;lt;span concordion:assertEquals="passwordFor(#user)"&amp;gt;secret&amp;lt;/span&amp;gt;".&lt;br/&gt;
&amp;lt;/p&amp;gt;&lt;br/&gt;
...&lt;br/&gt;
&amp;lt;/body&amp;gt;&lt;br/&gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
I've just used FIT to set up the database as I had that functionality in a fit test already, then I used concordion to set what user to log in with in CubicTest and changed the username with CubicTest before I used Concordion to check the database to see if the new password was set. The functionality isn’t there yet, but it’s coming. 
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4057789319984003600-7170557203325119102?l=blog.skytteren.no' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.skytteren.no/feeds/7170557203325119102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4057789319984003600&amp;postID=7170557203325119102' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/7170557203325119102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/7170557203325119102'/><link rel='alternate' type='text/html' href='http://blog.skytteren.no/2008/06/concordionrun.html' title='concordion:run'/><author><name>Stein Kåre Skytteren</name><uri>http://www.blogger.com/profile/17586128854113779189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://bp1.blogger.com/_4lV768qOI_I/R1LHINwlDDI/AAAAAAAAAEk/gf474KVIzHQ/S220/portrett2_s_h.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057789319984003600.post-7995639173122523964</id><published>2008-06-14T11:53:00.003+02:00</published><updated>2008-06-14T12:01:19.864+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cubictest'/><category scheme='http://www.blogger.com/atom/ns#' term='release'/><category scheme='http://www.blogger.com/atom/ns#' term='watir'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><category scheme='http://www.blogger.com/atom/ns#' term='selenium'/><category scheme='http://www.blogger.com/atom/ns#' term='alliance functional testing tools visioning workshop'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>CubicTest 1.8.6  is just released</title><content type='html'>&lt;p&gt;The vision of &lt;a href="http://cubictest.openqa.org"&gt;CubicTest&lt;/a&gt; is to be the leading functional Web Testing IDE. The 1.8.6 release is a great step towards that vision.&lt;/p&gt;

&lt;p&gt;There are a lot of different functional web testing frameworks out there but CubicTest stands out. What truly makes CubicTest different is its ability to clearly communicate web interaction to a wide variety of stakeholders. You don’t have to be a programmer to understand CubicTest as it focuses on testing "what you see" on the page, and not "testing the HTML source". It strongly supports principles like DRY and test first. DRY or Don’t Repeat Yourself is made easy with features like “Commons”, parameterization and abstraction through subtests. CubicTest was designed to be used with test first methodologies with features like graphical modeling and html export.&lt;/p&gt;

&lt;p&gt;CubicTest uses the power of outstanding frameworks like Selenium and Watir to drive the tests but in a graphical way which make these frameworks easier to understand and use. Prior to the 1.8.6 release CubicTest users haven’t been able to use the full power of Selenium. Now that is changed and in the near future it will change for Watir as well. The new “Custom Test Step” feature enables that functionality. &lt;/p&gt;

&lt;p&gt;
The new features in the CubicTest 1.8.6 release:
&lt;ul&gt;
&lt;li&gt;Support for frames – now you may model frames in the graphical test editor&lt;/li&gt;
&lt;li&gt;Internationalization support – one test may be launched with different languages to make it easy to support multilingual web sites&lt;/li&gt;
&lt;li&gt;Custom test steps with debug possibilities – now CubicTest isn’t limited to only the elements and possibilities in the editing palette but to the limitation in the underlying test framework like &lt;a href="http://selenium.openqa.org"&gt;Selenium&lt;/a&gt; and &lt;a href="http://wtr.rubyforge.org"&gt;Watir&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Capturing HTML and image of failing test page – whenever a test fails in the new launcher CubicTest records the HTML source code and take a screenshot&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;I hope you like it!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4057789319984003600-7995639173122523964?l=blog.skytteren.no' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.skytteren.no/feeds/7995639173122523964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4057789319984003600&amp;postID=7995639173122523964' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/7995639173122523964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/7995639173122523964'/><link rel='alternate' type='text/html' href='http://blog.skytteren.no/2008/06/cubictest-186-is-just-released.html' title='CubicTest 1.8.6  is just released'/><author><name>Stein Kåre Skytteren</name><uri>http://www.blogger.com/profile/17586128854113779189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://bp1.blogger.com/_4lV768qOI_I/R1LHINwlDDI/AAAAAAAAAEk/gf474KVIzHQ/S220/portrett2_s_h.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057789319984003600.post-1205508563430766698</id><published>2008-05-05T13:01:00.003+02:00</published><updated>2008-05-07T21:45:41.659+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AAFTT'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><category scheme='http://www.blogger.com/atom/ns#' term='specification'/><title type='text'>SpecTool 2.0 - solutions</title><content type='html'>&lt;p&gt;I think that there are two ways to specify a requirement that can be executed by a computer. First we got a natural &lt;span style="font-weight:bold;"&gt;API&lt;/span&gt; or we got the &lt;span style="font-weight:bold;"&gt;XHTML&lt;/span&gt; way.&lt;/p&gt;

&lt;h2&gt;API&lt;/h2&gt;
&lt;p&gt;To use an API for specification requires a DSL(Domain Specific Language) and a natural language interface for nontechnical persons to understand what is going on. At least without being thought how it works. The advantage is that it is code. It makes it a lot easier to use for programmers. Most IDEs (like &lt;a href="http://www.eclipse.org"&gt;eclipse&lt;/a&gt;) will report syntax errors and got good refactoring support which is an advantage.
&lt;/p&gt;
&lt;p&gt;
For this kind of tests I think that we have (most of) the technology that we need. I think that the main focus should be in establishing good patterns and give better understanding. 
&lt;/p&gt;

&lt;h2&gt;XHTML&lt;/h2&gt;
&lt;p&gt;
To write specifications in xhtml gives a lot of flexibility in presentation. It is possible to use tables (frameworks like &lt;a href="http://fit.c2.com/"&gt;FIT&lt;/a&gt;, Concordion), plain text (&lt;a href="http://www.concordion.org"&gt;Concordion&lt;/a&gt;) or what ever that fits the problem. This requires fixtures on different frameworks to bridge the gap between specifications and code. This abstraction is good in the sence that it keeps specifications "stable" despite changes in the domain model. I think that this is good. 
&lt;/p&gt;

&lt;p&gt;
The problem with tools like Concordion and FIT is that they don't work well together. I think that having a framework that is an umbrella framework to the current frameworks is the way to go. So I can use FIT for some database setup and runt the webtests in &lt;a href="http://cubictest.openqa.org"&gt;CubicTest&lt;/a&gt; and do some checks in Concordion. I should be able take some data from one of the frameworks over to another to make these work seamleasly together. The umbrella framework should also support the ide of tags to support the ide of structuring the sepecifications. 
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4057789319984003600-1205508563430766698?l=blog.skytteren.no' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.skytteren.no/feeds/1205508563430766698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4057789319984003600&amp;postID=1205508563430766698' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/1205508563430766698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/1205508563430766698'/><link rel='alternate' type='text/html' href='http://blog.skytteren.no/2008/03/sepctool-20-solutions.html' title='SpecTool 2.0 - solutions'/><author><name>Stein Kåre Skytteren</name><uri>http://www.blogger.com/profile/17586128854113779189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://bp1.blogger.com/_4lV768qOI_I/R1LHINwlDDI/AAAAAAAAAEk/gf474KVIzHQ/S220/portrett2_s_h.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057789319984003600.post-8153706134554216418</id><published>2008-04-06T23:35:00.004+02:00</published><updated>2008-04-06T23:41:29.936+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='slides'/><category scheme='http://www.blogger.com/atom/ns#' term='xp'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>10 ways to screw up with Scrum and XP</title><content type='html'>&lt;p&gt;&lt;a href="http://blog.crisp.se/henrikkniberg/"&gt;Henrik Kniberg&lt;/a&gt; has published his slides from the &lt;a href="http://www.crisp.se/henrik.kniberg/presentations/javaforum-20080403/10-ways-to-screw-up-with-Scrum-and-XP.pdf"&gt;10 ways to screw up with Scrum and XP&lt;/a&gt; presentation he held at JavaForum conference in Malmö. I wasn't there but the slides are excelent. I hope you enjoy them as much as I do!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4057789319984003600-8153706134554216418?l=blog.skytteren.no' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.skytteren.no/feeds/8153706134554216418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4057789319984003600&amp;postID=8153706134554216418' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/8153706134554216418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/8153706134554216418'/><link rel='alternate' type='text/html' href='http://blog.skytteren.no/2008/04/10-ways-to-screw-up-with-scrum-and-xp.html' title='10 ways to screw up with Scrum and XP'/><author><name>Stein Kåre Skytteren</name><uri>http://www.blogger.com/profile/17586128854113779189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://bp1.blogger.com/_4lV768qOI_I/R1LHINwlDDI/AAAAAAAAAEk/gf474KVIzHQ/S220/portrett2_s_h.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057789319984003600.post-825715118840012243</id><published>2008-03-30T12:00:00.002+02:00</published><updated>2008-03-30T12:38:44.280+02:00</updated><title type='text'>Agile means that tests are second class citizens</title><content type='html'>&lt;p&gt;The &lt;a href="http://www.agilemanifesto.org"&gt;Agile Manifesto&lt;/a&gt; states &lt;span style="font-weight:bold;"&gt;working software over comprehensive documentation&lt;/span&gt;. Working software is what the customer really wants and will always be the first class citizen in agile methodologies. Your tests is part of your documentation (at least to some extent). Hence tests are second class citizens.&lt;/p&gt;

&lt;p&gt;By the way I would not like to develop software without tests.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4057789319984003600-825715118840012243?l=blog.skytteren.no' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.skytteren.no/feeds/825715118840012243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4057789319984003600&amp;postID=825715118840012243' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/825715118840012243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/825715118840012243'/><link rel='alternate' type='text/html' href='http://blog.skytteren.no/2008/03/agile-means-that-tests-are-second-class.html' title='Agile means that tests are second class citizens'/><author><name>Stein Kåre Skytteren</name><uri>http://www.blogger.com/profile/17586128854113779189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://bp1.blogger.com/_4lV768qOI_I/R1LHINwlDDI/AAAAAAAAAEk/gf474KVIzHQ/S220/portrett2_s_h.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057789319984003600.post-595785697995224195</id><published>2008-03-30T10:19:00.002+02:00</published><updated>2008-03-30T10:29:09.597+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='exploratory testing'/><category scheme='http://www.blogger.com/atom/ns#' term='AAFTT'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><title type='text'>Exploratory Testing Google Video</title><content type='html'>&lt;p&gt;Exploratory testing has become quite an interesting topic at the &lt;a href="http://tech.groups.yahoo.com/group/aa-ftt/"&gt;AAFTT&lt;/a&gt; user group. Matt Heusser came up with this link: &lt;a href="http://video.google.com/videoplay?docid=7894844001159492923&amp;q=exploratory+testing&amp;total=16&amp;start=0&amp;num=10&amp;so=0&amp;type=search&amp;plindex=0"&gt;Exploratory Testing at Google Video&lt;/a&gt;. For me this is very interesting so I figured I should
pass it on. 
&lt;/p&gt;
Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4057789319984003600-595785697995224195?l=blog.skytteren.no' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.skytteren.no/feeds/595785697995224195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4057789319984003600&amp;postID=595785697995224195' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/595785697995224195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/595785697995224195'/><link rel='alternate' type='text/html' href='http://blog.skytteren.no/2008/03/exploratory-testing-google-video.html' title='Exploratory Testing Google Video'/><author><name>Stein Kåre Skytteren</name><uri>http://www.blogger.com/profile/17586128854113779189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://bp1.blogger.com/_4lV768qOI_I/R1LHINwlDDI/AAAAAAAAAEk/gf474KVIzHQ/S220/portrett2_s_h.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057789319984003600.post-9157669231312558068</id><published>2008-03-06T11:55:00.001+01:00</published><updated>2008-03-06T12:55:44.942+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webdriver'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><category scheme='http://www.blogger.com/atom/ns#' term='selenium'/><title type='text'>Selenium User Meetup</title><content type='html'>I've been using &lt;a href="http://selenium.openqa.org"&gt;Selenium&lt;/a&gt; for quite a while and I think it's amazing what they have done. &lt;a href="http://cubictest.openqa.org"&gt;CubicTest&lt;/a&gt; has of course support for Selenium and uses it for recording as well as running.

It's been a Selenium User Meetup at Mountain View (at Googleplex). There are two youtube videos out there from the meetup (as shown under). I personally think that it's quite cool that &lt;a href="http://webdriver.googlecode.com"&gt;WebDriver&lt;/a&gt; is going to be under the Selenium umbrella.

&lt;h3&gt;The presentation:&lt;/h3&gt;
&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/EDb8yOM3Vpw&amp;rel=1&amp;border=0"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/EDb8yOM3Vpw&amp;rel=1&amp;border=0" type="application/x-shockwave-flash" wmode="transparent"width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;

&lt;h3&gt;The Q&amp;A:&lt;/h3&gt;
&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/4y-3bllkkPc&amp;rel=1&amp;border=0"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/4y-3bllkkPc&amp;rel=1&amp;border=0" type="application/x-shockwave-flash" wmode="transparent"width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4057789319984003600-9157669231312558068?l=blog.skytteren.no' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.skytteren.no/feeds/9157669231312558068/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4057789319984003600&amp;postID=9157669231312558068' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/9157669231312558068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/9157669231312558068'/><link rel='alternate' type='text/html' href='http://blog.skytteren.no/2008/03/selenium-user-meetup.html' title='Selenium User Meetup'/><author><name>Stein Kåre Skytteren</name><uri>http://www.blogger.com/profile/17586128854113779189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://bp1.blogger.com/_4lV768qOI_I/R1LHINwlDDI/AAAAAAAAAEk/gf474KVIzHQ/S220/portrett2_s_h.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057789319984003600.post-1430510306607451208</id><published>2007-12-04T19:49:00.001+01:00</published><updated>2007-12-04T20:34:20.881+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='smidig2007'/><category scheme='http://www.blogger.com/atom/ns#' term='AAFTT'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><category scheme='http://www.blogger.com/atom/ns#' term='open space'/><category scheme='http://www.blogger.com/atom/ns#' term='specification'/><title type='text'>SpecTool2.0</title><content type='html'>&lt;p&gt;At &lt;a href="http://www.smidig.no/smidig2007"&gt;Smidig2007&lt;/a&gt; I invited to an open space session called "SpecTool2.0". The purpose was to look at what the next specification (I prefer that to test) tool would be like. The specifications should of course be executable. It was quite a lot of people that came around to the open space. 
&lt;/p&gt;
&lt;p&gt;
According to the people attending the requirements for spec tool would be:
&lt;ul&gt;
&lt;li&gt;
Abstraction - the need for rather high level specifications that can be defined in more detail another place. 
&lt;/li&gt;
&lt;li&gt;
Readability - make sure that most people with different background can read the specifications.
&lt;/li&gt;
&lt;li&gt;
Representations  - support different kinds of data representations:
&lt;ul&gt;
&lt;li&gt;
Table - data intensive specifications (data driven tests)
&lt;/li&gt;
&lt;li&gt;
Text - plain text. This is the power of &lt;a href="http://www.concordion.org"&gt;Concordion&lt;/a&gt;.
&lt;/li&gt;
&lt;li&gt;
Graphics - support other types of graphical presentations.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Domain language - make it possible to support the domain language that is used in the application.
&lt;/li&gt;
&lt;li&gt;
Tags - possible to find specifications based on tags. It is really handy when you got a lot of specifications. It also got to do with having places to put and group things. This could also aid in the execution of the specifications. You might want to only execute tests that are tagged with "database".
&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;
Pattern support was another interesting point in the discussion. The tool should display examples and guidelines to aid the user in creating good specifications.
&lt;/p&gt;
&lt;p&gt;
You might ask yourself what my mind has been spinning around after this open space. Well I guess it is possible to do some things in this area. I've got few ideas. I'll come back to them. If you want to do this with me please don't hesitate to contact me.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4057789319984003600-1430510306607451208?l=blog.skytteren.no' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.skytteren.no/feeds/1430510306607451208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4057789319984003600&amp;postID=1430510306607451208' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/1430510306607451208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/1430510306607451208'/><link rel='alternate' type='text/html' href='http://blog.skytteren.no/2007/12/spectool20.html' title='SpecTool2.0'/><author><name>Stein Kåre Skytteren</name><uri>http://www.blogger.com/profile/17586128854113779189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://bp1.blogger.com/_4lV768qOI_I/R1LHINwlDDI/AAAAAAAAAEk/gf474KVIzHQ/S220/portrett2_s_h.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057789319984003600.post-7117898081268538110</id><published>2007-11-30T17:33:00.000+01:00</published><updated>2007-12-02T16:09:10.551+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CI'/><category scheme='http://www.blogger.com/atom/ns#' term='AAFTT'/><category scheme='http://www.blogger.com/atom/ns#' term='incremental continuous integration'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Incremental Continuous Integration - Testing the differences</title><content type='html'>&lt;p&gt;The speed of a test execution and the amount of tests can make the continuous integration quite slow. I personally think that a test that takes 5 seconds isn't too bad. However if you got a thousand tests that takes 5 seconds running in sequence it will amount to way over an hour. Not very short feedback loop and it is way under the 10 minutes that are recommended as a maximum. I know of projects that have got a lot of web tests that takes a few hours to run all together. Distributing the tests on different machines surely reduces the time but it still takes a lot of time. So I understand why some people think that web tests suck even if I think they are great.
&lt;/p&gt;
&lt;p&gt;
In the world of backup one wouldn't make a complete backup every time but the first time and then periodically like every week or month. Then every day between those periods the files that have changed are backed up. This is called an incremental backup and it means that only a few files are backed up most of the time. Otherwise the amounts of data stored would be too great. The best backup algorithms can handle changes on parts of large files as well. This means that only parts of the files are backed up every day. This makes a good balance between storage space and speed of restore.
&lt;/p&gt;
&lt;p&gt;
Why isn't the same idea used on continuous integration. Why are we executing all the tests every time? I think that all tests should be executed every night as part of the nightly build. However integrations hooks on commits should not run all the tests as it possibly makes feedback loops way too long. To fix this problem one should only run the tests that are likely to break meaning an incremental continuous integration. 
&lt;/p&gt;
&lt;p&gt;
The algorithm for doing the incremental continuous integration isn’t very difficult. On check-ins one should only run tests that have changed or been added. One should also track all the application code a test touches when it runs. When application code is changed one can look up which tests that executed that application code and only execute those tests in the build. In some applications there are also some resources like configuration files that have great impact on the application. When these resources changes one might have to execute all tests depending on the configuration file.
&lt;/p&gt;
&lt;h2&gt;Examples: &lt;/h2&gt;
&lt;p&gt;
An application with 900 tests that each runs in 4 seconds. The initial nightly build takes at least 3600 seconds to execute if the tests are executed sequentially. That is an hour. This is no problem for a nightly build as it’s done way before people get back to work the next morning.
&lt;/p&gt;
&lt;p&gt;
If one checks in a new test that takes 4 seconds the complete build will still take more than an hour. I think that is way to long. In an incremental approach it should run in 4 seconds. The same is the case if a test is changed.
&lt;/p&gt;
Let’s look at a subset of the tests and classes where the Xs describes which classes a given test executes: 
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;td&gt;
&lt;td&gt;Test A&lt;td&gt;
&lt;td&gt;Test B&lt;td&gt;
&lt;td&gt;Test C&lt;td&gt;
&lt;td&gt;Test D&lt;td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Class 1&lt;td&gt;
&lt;td&gt;X&lt;td&gt;
&lt;td&gt;&lt;td&gt;
&lt;td&gt;X&lt;td&gt;
&lt;td&gt;&lt;td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Class 2&lt;td&gt;
&lt;td&gt;X&lt;td&gt;
&lt;td&gt;&lt;td&gt;
&lt;td&gt;&lt;td&gt;
&lt;td&gt;&lt;td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Class 3&lt;td&gt;
&lt;td&gt;X&lt;td&gt;
&lt;td&gt;X&lt;td&gt;
&lt;td&gt;&lt;td&gt;
&lt;td&gt;X&lt;td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Class 4&lt;td&gt;
&lt;td&gt;&lt;td&gt;
&lt;td&gt;&lt;td&gt;
&lt;td&gt;X&lt;td&gt;
&lt;td&gt;X&lt;td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
So if there is a change in Class 4 only Test 3 and Test 4 should be executed as the other tests doesn't touch the code in Class 4. This gives us only 8 seconds of test execution instead an hour.
&lt;/p&gt;
&lt;p&gt;
This means 12 seconds in total when adding 4 second for the new test and 8 seconds for the tests that executes the class that had changed. This is quite short compared to the hour a complete build would take.
&lt;/p&gt;
&lt;p&gt;
The idea for incremental continuous integration would have to be supported in the continuous integration tools or the build tools. I think test coverage reports can be handy for identifying which tests to run. Another solution would be to use AOP for the same reason. However it shouldn’t be very difficult to do. I hope that build tools and continuous integration tools will support this idea in the future.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4057789319984003600-7117898081268538110?l=blog.skytteren.no' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.skytteren.no/feeds/7117898081268538110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4057789319984003600&amp;postID=7117898081268538110' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/7117898081268538110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/7117898081268538110'/><link rel='alternate' type='text/html' href='http://blog.skytteren.no/2007/11/incremental-continuous-integration.html' title='Incremental Continuous Integration - Testing the differences'/><author><name>Stein Kåre Skytteren</name><uri>http://www.blogger.com/profile/17586128854113779189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://bp1.blogger.com/_4lV768qOI_I/R1LHINwlDDI/AAAAAAAAAEk/gf474KVIzHQ/S220/portrett2_s_h.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057789319984003600.post-6958819360748668750</id><published>2007-11-24T09:50:00.000+01:00</published><updated>2007-12-02T16:09:55.306+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='functional'/><category scheme='http://www.blogger.com/atom/ns#' term='cubictest'/><category scheme='http://www.blogger.com/atom/ns#' term='visioning'/><category scheme='http://www.blogger.com/atom/ns#' term='AAFTT'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Presentations from Agile Alliance Functional Test Tools Visioning Workshop</title><content type='html'>&lt;p&gt;Quite a few of the presentations at &lt;a href="http://www.agilealliance.org/show/1938"&gt;Agile Alliance Functional Test Tools Visioning Workshop&lt;/a&gt; in Portland Oregon this year have be published at &lt;a href="http://video.google.com/videosearch?q=AAFTT&amp;sitesearch="&gt;Google Video&lt;/a&gt;. Christian Schwarz and I was there to present &lt;a href="http://www.cubictest.org"&gt;CubicTest&lt;/a&gt; as it is a graphical test tool for modeling functional web tests.
&lt;/p&gt;
&lt;p&gt;
I'll hold a lightning talk at &lt;a href="http://smidig.no/smidig2007/"&gt;Smidig 2007&lt;/a&gt; where I'll be talking about the different tools presented at the workshop. If you are interrested please check it out.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4057789319984003600-6958819360748668750?l=blog.skytteren.no' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.skytteren.no/feeds/6958819360748668750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4057789319984003600&amp;postID=6958819360748668750' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/6958819360748668750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/6958819360748668750'/><link rel='alternate' type='text/html' href='http://blog.skytteren.no/2007/11/presentations-from-agile-alliance.html' title='Presentations from Agile Alliance Functional Test Tools Visioning Workshop'/><author><name>Stein Kåre Skytteren</name><uri>http://www.blogger.com/profile/17586128854113779189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://bp1.blogger.com/_4lV768qOI_I/R1LHINwlDDI/AAAAAAAAAEk/gf474KVIzHQ/S220/portrett2_s_h.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057789319984003600.post-4472161204173066932</id><published>2007-11-08T16:34:00.000+01:00</published><updated>2007-12-02T16:35:35.918+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FIT'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='concordion'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><title type='text'>Concordion</title><content type='html'>&lt;p&gt;
I've been looking at &lt;a href="http://www.concordion.org"&gt;concordion&lt;/a&gt; lately. It looks like a step in the right direction. I think that it might be a way to push &lt;a href="http://www.cubictest.org"&gt;CubicTest&lt;/a&gt; even further by extending it beyond functional web testing. 
&lt;/p&gt;
&lt;p&gt;
Stay tuned!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4057789319984003600-4472161204173066932?l=blog.skytteren.no' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.skytteren.no/feeds/4472161204173066932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4057789319984003600&amp;postID=4472161204173066932' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/4472161204173066932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/4472161204173066932'/><link rel='alternate' type='text/html' href='http://blog.skytteren.no/2007/11/concordion.html' title='Concordion'/><author><name>Stein Kåre Skytteren</name><uri>http://www.blogger.com/profile/17586128854113779189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://bp1.blogger.com/_4lV768qOI_I/R1LHINwlDDI/AAAAAAAAAEk/gf474KVIzHQ/S220/portrett2_s_h.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057789319984003600.post-3075973920290426730</id><published>2007-10-27T12:07:00.000+02:00</published><updated>2007-12-02T16:10:57.883+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='screen'/><category scheme='http://www.blogger.com/atom/ns#' term='ipod touch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='multi touch'/><title type='text'>Multi touch screen</title><content type='html'>&lt;p&gt;
&lt;a href="http://link.brightcove.com/services/link/bcpid713271701/bclid713073346/bctid709364416"&gt;Perceptive Pixel&lt;/a&gt; have an outstanding touch screen. I guess it comes with a large pricetag, but it will hopefully drop quite a bit when it is introduced. For those of us that can't afford it there are other possiblities. First of all &lt;a href="http://www.microsoft.com/surface/"&gt;MicroSoft Surface&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
I personally think that the &lt;a href="http://www.apple.com/iphone/"&gt;Apple iPhone&lt;/a&gt; got an amazing user interface mostely due to its multi touch interface. I've got a Nokia N95 but despite all it's cool features the user interface is rather slow, with messy menues. I woun't even go into graphics and the battery capacity. The iPhone is easy to use because of the touch screen but also due to better menues. I guess for us living in a country not being able to buy an iPhone a &lt;a href="http://www.apple.com/ipodtouch/"&gt;iPod touch&lt;/a&gt; is quite all right as well.
&lt;/p&gt;
&lt;p&gt;
There are rumors around on the internett about an apple laptop with multi touch screen. I would really like one of those. It probably gone cost me, but I think if Apple does it will be pretty amazing to work with. At least when I get used to it.
&lt;/p&gt;
&lt;p&gt;
To summarize I would say that touch screens are amazing and the way to go.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4057789319984003600-3075973920290426730?l=blog.skytteren.no' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.skytteren.no/feeds/3075973920290426730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4057789319984003600&amp;postID=3075973920290426730' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/3075973920290426730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/3075973920290426730'/><link rel='alternate' type='text/html' href='http://blog.skytteren.no/2007/10/multi-touch-screen.html' title='Multi touch screen'/><author><name>Stein Kåre Skytteren</name><uri>http://www.blogger.com/profile/17586128854113779189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://bp1.blogger.com/_4lV768qOI_I/R1LHINwlDDI/AAAAAAAAAEk/gf474KVIzHQ/S220/portrett2_s_h.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057789319984003600.post-7303875092928695202</id><published>2007-10-17T16:15:00.000+02:00</published><updated>2007-12-02T16:32:51.294+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='api'/><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Web Test Framework API</title><content type='html'>&lt;p&gt;I've looked at different kinds of testing tools (API) to use them as runners for &lt;a href="http://www.cubictest.org"&gt;CubicTest&lt;/a&gt;. The various tools have their own API that provides different kinds of features. They also access the browser in different ways; either through JavaScript like &lt;a href="http://www.openqa.org/selenium"&gt;Selenium&lt;/a&gt;, taking over the browser like &lt;a href="http://code.google.com/p/webdriver"&gt;WebDriver&lt;/a&gt; and &lt;a href="http://wtr.rubyforge.org"&gt;Watir&lt;/a&gt; or being the browser it self like &lt;a href="http://jwebunit.sourceforge.net"&gt;JWebUnit&lt;/a&gt; which relays on &lt;a href="http://htmlunit.sourceforge.net/"&gt;HtmlUnit&lt;/a&gt; to run. 
&lt;/p&gt;
&lt;p&gt;
I think that there should be a basic set of features that a web test tool should have. There might even be a common set of test to pass in order to support the basics. An example could be the &lt;a href="http://jwebunit.sourceforge.net/jwebunit-commons-tests/index.html"&gt;JWebUnit-Commons-Test&lt;/a&gt; that ensures that every API that JWebUnit uses meats their requirements. It is a natural thing for test tool.
&lt;/p&gt;
&lt;p&gt;
There are two parts of testing web applications in addition to setup (connecting to the website) and teardown. First is the assertion or lookup for elements on the page. The other part is performing some sort of action on the elements. This is pretty simple. Ones should be able to support most kind events. For example an onclick event should be fired with a click action. Some events should not be supported. I guess events that are not implemented on most modern browser. Also events that don’t represent user actions like onload, should be omitted. 
&lt;/p&gt;
&lt;p&gt;
I personally think that the system should be object oriented (at least it makes sense to me as a Java and JavaScript programmer). This means that in order to perform actions on objects one should look the up first. This also applies to asserting elements.
&lt;/p&gt;
&lt;h2&gt;Ways of looking up elements are:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;By id or name – this is most common. It is supported by pretty much all modern browsers. However it isn’t very handy for element that doesn’t have an id and for element where its id may changes rapidly due to the web framework in use. 

Example code (Java):
&lt;pre&gt;
Element element = document.get(ELEMENT.id("myId"));
assertThat(element, notNull());
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;By other attributes present – there are different ways to do this. Selenium got support for CSS style lookup. A more common way of doing it is by using XPath. I personally prefer XPath to CSS, but for most people it’s a mater of taste. I think that just being able to look for more than one attribute is as powerful.

Example code (Java):
&lt;pre&gt;
Element element = document.get(ELEMENT.id("myId")
     .class("myCSSClass"));
assertThat(element, notNull());
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;By parts of attribute – One should be able to look up elements that have an attribute that is equal to, begins with, ends with or contains a certain value. Even logic like and/or might be useful. 

Example code (Java):
&lt;pre&gt;
Element element = document.get( ELEMENT.id("myId")
     .class(contains("myCSSClass").
           or(contains("otherCSSClass"))));
assertThat(element, notNull());
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;By probability – Another way to ensure that stuff doesn’t break is to add probability. I guess that I would like to lookup elements that should have an attribute like one value and can have another attribute like another value. One should be able to find the element (or elements) that are the best fit. To push this even further we may use edit distance to handle misspelling. I guess that this might return the wrong element. So the returned element should know how well it fits the element looked for. An element that only fits 65% might be wrong. This raises the question of what attributes the element found actually got. The strength of this is the ability to adjust the lookup attributes to better fit the reality of the web application. I guess this improves robustness and enables tests that run with a “warning” to complete instead of just throwing an exception. 

Example code (Java):
&lt;pre&gt;
TableRow row = document.get(TR.id( SHOULD, equal("myId")
     .class(MUST, contain("myCSSClass")
           .or(contains("otherCSSClass"))));
assertThat(row, notNull());
if(row.getScore() &amp;lt; 100){
 println("Element might be wrong"); 
 println("id: " + row.getId());
 println("class: " + row.getClass());
 println("Contains button: " + row.get(BUTTON));
 println("Contains text: " + row.contains(
     text("mySuper product")));
}
assertThat(row.getScore(), greaterThan(65));
&lt;pre&gt;
&lt;/li&gt;
&lt;li&gt;
By negative - One should not be constrained to one attribute or the only asking for positive. Should not is equally valid.

Example code (Java):
&lt;pre&gt;
TableRow row = document.get(TR.id( SHOULD, equal("myId").class(MUST, 
        contain("myCSSClass"). or(contains("otherCSSClass")))
        .class(MUST_NOT, contain("alianCSSClass"))
        .contains(BUTTON, text("mySuper product")));
assertThat(row, notNull());
if(row.getScore() &amp;lt; 100){
 println("Element might be wrong"); 
 //... figure out what really happende
}
assertThat(row.getScore(), greaterThan(65));
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
When testing web shop application’s product overview I like to be able to say that I’m looking for a table row (which is tend to be a lot of in a table) that contains a buy button (which typically is found in every row) and some text describing the product I’m looking for. This text is only found in the row that I’m looking for. This enables us to create less fragile tests. If I was to look for a row with a given attribute (like id) it would make my test fragile in quite a few web frameworks as it tends to change. I could have said that it should be the fifth row but that can also change quite rapidly. I guess the same “pattern” for testing can be used in different settings. It might be that one shouldn’t have to know what kind of container the button and the text is within. It probably should not be tied to know that it is table row. 

Example code (Java):
&lt;pre&gt;
TableRow row = document.get(TR.contains(BUTTON, 
     text("mySuper product")));
assertThat(row, notNull());
// to actually get the button to click:
row.get(BUTTON).click();
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I think that by adding these features it should be possible to create robust test. I also think that this kind of code is quite readable, at least for Java programmers that don’t know CSS or XPath very well. 
&lt;/p&gt;
&lt;p&gt;
I hope that some framework will add this functionality. We – the CubicTest developers – would sure love to have it.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4057789319984003600-7303875092928695202?l=blog.skytteren.no' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.skytteren.no/feeds/7303875092928695202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4057789319984003600&amp;postID=7303875092928695202' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/7303875092928695202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/7303875092928695202'/><link rel='alternate' type='text/html' href='http://blog.skytteren.no/2007/10/web-test-framework-api.html' title='Web Test Framework API'/><author><name>Stein Kåre Skytteren</name><uri>http://www.blogger.com/profile/17586128854113779189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://bp1.blogger.com/_4lV768qOI_I/R1LHINwlDDI/AAAAAAAAAEk/gf474KVIzHQ/S220/portrett2_s_h.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057789319984003600.post-7410897815316117488</id><published>2007-10-16T16:12:00.000+02:00</published><updated>2007-12-02T16:15:34.297+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AAFTT'/><category scheme='http://www.blogger.com/atom/ns#' term='alliance functional testing tools visioning workshop'/><title type='text'>Reflections from the Agile Alliance Functional Testing Tools Visioning Workshop</title><content type='html'>&lt;p&gt;I’ve just been at the &lt;a href="http://www.agilealliance.org/show/1938"&gt;Agile Alliance Functional Testing Tools Visioning Workshop&lt;/a&gt; (AA-FTT) in Portland Oregon which was a great place to be. A lot of bright people have created some amazing tools or have an awesome understanding of testing. It is really interesting see different angels than we have had on &lt;a href="http://www.cubictest.org"&gt;CubicTest&lt;/a&gt;. I’ve personally learned a lot from the others and I think the others might have learned a great deal as well. 
&lt;/p&gt;
&lt;p&gt;
We (the workshop) got a &lt;a href="http://tech.groups.yahoo.com/group/aa-ftt/"&gt;workshop homepage&lt;/a&gt; which is going to be opened up now as the workshop is over. Please check it out. 
&lt;/p&gt;
&lt;p&gt;
Sadly enough we didn’t come up with a great leap in functional testing tools. It might even be that the progress isn’t a new tool but a new way of thinking. One of the big things I’ve learned lately is that patterns for testing are really important. I’ve just bought &lt;a href="http://xunitpatterns.com"&gt;"xUnit Test Patterns"&lt;/a&gt; by Gerard Meszaros (who was at the workshop). Letting applications be testable from the inside by building in testability from the start might be a better solution. An example of an amazing such an application is Ward Cunningham’s Swim. 
&lt;/p&gt;
&lt;p&gt;
Most innovations are baby step or just combining different ideas in a new way. I personally think integrating tools might also bring us further. Ways to do that is letting existing tools do new things for example if &lt;a href="http://www.cubictest.org"&gt;CubicTest&lt;/a&gt; can learn from model based test tools like what Ben Simo the &lt;a href="http://www.questioningsoftware.com"&gt;Quality Frog - Questioning Software&lt;/a&gt; have done &lt;a href="http://www.questioningsoftware.com/2007/06/modeling-windows-calculator-part-1.html"&gt;testing a calculator&lt;/a&gt;. However we figured out that enabling different levels of abstractions is really smart in order to quickly create tests new tests and to get an easy overview.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4057789319984003600-7410897815316117488?l=blog.skytteren.no' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.skytteren.no/feeds/7410897815316117488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4057789319984003600&amp;postID=7410897815316117488' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/7410897815316117488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057789319984003600/posts/default/7410897815316117488'/><link rel='alternate' type='text/html' href='http://blog.skytteren.no/2007/10/reflections-from-agile-alliance.html' title='Reflections from the Agile Alliance Functional Testing Tools Visioning Workshop'/><author><name>Stein Kåre Skytteren</name><uri>http://www.blogger.com/profile/17586128854113779189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://bp1.blogger.com/_4lV768qOI_I/R1LHINwlDDI/AAAAAAAAAEk/gf474KVIzHQ/S220/portrett2_s_h.jpg'/></author><thr:total>0</thr:total></entry></feed>
