<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule">

<channel>
	<title>Thinking Inside a Bigger Box &#187; Norsk</title>
	<atom:link href="http://johannesbrodwall.com/category/norsk/feed/" rel="self" type="application/rss+xml" />
	<link>http://johannesbrodwall.com</link>
	<description>Johannes Brodwall&#039;s Musings on Software Architecture and Programming</description>
	<lastBuildDate>Mon, 19 Mar 2012 12:44:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<creativeCommons:license>http://creativecommons.org/licenses/by/3.0/</creativeCommons:license>		<item>
		<title>Retrospective techniques</title>
		<link>http://johannesbrodwall.com/2010/11/28/retrospective-techniques/</link>
		<comments>http://johannesbrodwall.com/2010/11/28/retrospective-techniques/#comments</comments>
		<pubDate>Sun, 28 Nov 2010 00:48:29 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Non-technical]]></category>
		<category><![CDATA[Norsk]]></category>

		<guid isPermaLink="false">http://johannesbrodwall.com/?p=730</guid>
		<description><![CDATA[At the Smidig 2010 Agile User Group confererence in Oslo, I conducted an open space workshop where I tested out a few retrospective techniques on the participants. The workshop was very well attended, and so I&#8217;ve posted a Norwegian language summary on the company blog for Steria Norway. Go check it out if you understand [...]]]></description>
			<content:encoded><![CDATA[<p>At the Smidig 2010 Agile User Group confererence in Oslo, I conducted an open space workshop where I tested out a few retrospective techniques on the participants.</p>
<p>The workshop was very well attended, and so I&#8217;ve posted a Norwegian language summary on the company blog for Steria Norway. <a href="http://sterkblanding.no/blog/2010/11/28/retrospektivteknikker/">Go check it out</a> if you understand Norwegian!</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2010/11/28/retrospective-techniques/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>The effective product owner</title>
		<link>http://johannesbrodwall.com/2010/11/14/the-effective-product-owner/</link>
		<comments>http://johannesbrodwall.com/2010/11/14/the-effective-product-owner/#comments</comments>
		<pubDate>Sun, 14 Nov 2010 20:04:54 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Norsk]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://johannesbrodwall.com/?p=724</guid>
		<description><![CDATA[I&#8217;ve published a Norwegian language article titled: &#8220;Min supre produkteier&#8221; (&#8220;My excellent product owner&#8221;) at the company blog for Steria Norway. Go check it out if you understand Norwegian!]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve published a Norwegian language article titled: &#8220;<a href="http://sterkblanding.no/blog/2010/11/14/min-supre-produkteier/">Min supre produkteier</a>&#8221; (&#8220;My excellent product owner&#8221;) at the company blog for Steria Norway. <a href="http://sterkblanding.no/blog/2010/11/14/min-supre-produkteier/">Go check it out</a> if you understand Norwegian!</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2010/11/14/the-effective-product-owner/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to succeed on you agile project</title>
		<link>http://johannesbrodwall.com/2010/10/29/how-to-succeed-on-you-agile-project/</link>
		<comments>http://johannesbrodwall.com/2010/10/29/how-to-succeed-on-you-agile-project/#comments</comments>
		<pubDate>Fri, 29 Oct 2010 12:28:22 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Norsk]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://johannesbrodwall.com/?p=712</guid>
		<description><![CDATA[I&#8217;ve published a Norwegian language article titled: &#8220;Slik lykkes du med smidig utvikling&#8221; (&#8220;How to succeed with agile development&#8221;) at the company blog for Steria Norway. Go check it out if you understand Norwegian!]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve published a Norwegian language article titled: &#8220;<a href=" http://sterkblanding.no/blog/2010/10/29/slik-lykkes-du-med-smidig-utvikling/">Slik lykkes du med smidig utvikling</a>&#8221; (&#8220;How to succeed with agile development&#8221;) at the company blog for Steria Norway. <a href="http://sterkblanding.no/blog/2010/10/29/slik-lykkes-du-med-smidig-utvikling">Go check it out</a> if you understand Norwegian!</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2010/10/29/how-to-succeed-on-you-agile-project/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Husk å melde deg på til Smidig 2010</title>
		<link>http://johannesbrodwall.com/2010/09/13/husk-a-melde-deg-pa-til-smidig-2010/</link>
		<comments>http://johannesbrodwall.com/2010/09/13/husk-a-melde-deg-pa-til-smidig-2010/#comments</comments>
		<pubDate>Mon, 13 Sep 2010 19:54:27 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Non-technical]]></category>
		<category><![CDATA[Norsk]]></category>

		<guid isPermaLink="false">http://johannesbrodwall.com/?p=611</guid>
		<description><![CDATA[Smidig 2010: Norges største smidige konferanse Har du fått med deg at Smidig 2010 arrangeres 16.-17. November på Radisson BLU, Holberg plass i Oslo? Konferansen har åpnet for foredrag. Early bird prisen på billetter varer KUN TIL TORSDAG, så det gjelder å bestemme seg fort! Opplev vårt unike format, med over 70 lyntaler og 100 [...]]]></description>
			<content:encoded><![CDATA[<h3>Smidig 2010: Norges største smidige konferanse</h3>
<p>Har du fått med deg at Smidig 2010 arrangeres 16.-17. November på Radisson BLU, Holberg plass i Oslo? Konferansen har åpnet for foredrag. Early bird prisen på billetter varer KUN TIL TORSDAG, så det gjelder å bestemme seg fort!</p>
<p>Opplev vårt unike format, med over 70 lyntaler og 100 diskusjonsgrupper! Smidigkonferansen er den årlige nasjonale hendelsen som samler mennesker fra alle typer roller i IT-bransjen; prosjektledere, produkteiere, utviklere, bedriftsledere og testere og flere.</p>
<ul>
<li><a href="http://smidig2010.no/users/new">Meld deg på som deltager eller foredragsholder</a></li>
<li><a href="http://events.linkedin.com/Smidig-2010/pub/388694">Meld deg på LinkedIn-gruppa vår</a></li>
<li><a href="http://groups.google.com/group/smidigkonferansen">Meld deg på mailingslista for de som er interessert i Smidig 2010</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2010/09/13/husk-a-melde-deg-pa-til-smidig-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Å trene på Java EE</title>
		<link>http://johannesbrodwall.com/2009/12/02/trene-pa-java-ee/</link>
		<comments>http://johannesbrodwall.com/2009/12/02/trene-pa-java-ee/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 19:25:52 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Norsk]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://johannesbrodwall.com/?p=489</guid>
		<description><![CDATA[For å bli bedre må man trene. For å bli bedre med avanserte ting, må man forstå de grunnleggende tingene bra. For å vite hvorfor man bruker avanserte verktøy, må man prøve å jobbe uten dem. Derfor har jeg de siste ukene trent mange ganger på å lage en veldig enkel webapplikasjon i Java. For hele applikasjonen har jeg startet med å skrive testene før koden som implementerer funksjonaliteten.

Dersom du vil prøve deg på samme øvelse, inneholder denne artikkelen litt informasjon for å komme i gang. Start med koden under og <em>følg feilmeldingene.</em> Send en kommentar dersom du ikke kommer videre fra en feilmelding, så får vi en FAQ.

<h3>Oppgaven</h3>

Løs et så enkelt som mulig problem som involverer websider og database med så enkel teknologi om mulig.

Oppgaven jeg har laget går ut på å <em>opprette personer med fullt navn og søke etter personer basert på navnet deres</em>. For å gjøre oppgaven så lite som mulig har jeg valgt å la personer kun ha ett informasjonsfelt: Fullt navn. Denne oppgaven tar cirka 2-3 timer uten øvelse og du kan få den ned i 60-90 minutter med trening.

Du kan naturligvis velge en annen oppgave, men uansett hva du velger: Det er mer lærerikt å gjenta den samme oppgaven flere ganger enn å utføre en avansert oppgave.

Når jeg utfører oppgaven er det viktigste jeg lærer meg å forstå feilmeldingene som guider meg gjennom utviklingen. Dersom du trenger hjelp til å komme til de første feilmeldingene kan du se resten av artikkelen.
]]></description>
			<content:encoded><![CDATA[<p>For å bli bedre må man trene. For å bli bedre med avanserte ting, må man forstå de grunnleggende tingene bra. For å vite hvorfor man bruker avanserte verktøy, må man prøve å jobbe uten dem. Derfor har jeg de siste ukene trent mange ganger på å lage en veldig enkel webapplikasjon i Java. For hele applikasjonen har jeg startet med å skrive testene før koden som implementerer funksjonaliteten.</p>
<p>Dersom du vil prøve deg på samme øvelse, inneholder denne artikkelen litt informasjon for å komme i gang. Start med koden under og <em>følg feilmeldingene.</em> Send en kommentar dersom du ikke kommer videre fra en feilmelding, så får vi en FAQ.</p>
<h3>Oppgaven</h3>
<p>Løs et så enkelt som mulig problem som involverer websider og database med så enkel teknologi om mulig.</p>
<p>Oppgaven jeg har laget går ut på å <em>opprette personer med fullt navn og søke etter personer basert på navnet deres</em>. For å gjøre oppgaven så lite som mulig har jeg valgt å la personer kun ha ett informasjonsfelt: Fullt navn. Denne oppgaven tar cirka 2-3 timer uten øvelse og du kan få den ned i 60-90 minutter med trening.</p>
<p>Du kan naturligvis velge en annen oppgave, men uansett hva du velger: Det er mer lærerikt å gjenta den samme oppgaven flere ganger enn å utføre en avansert oppgave.</p>
<p>Når jeg utfører oppgaven er det viktigste jeg lærer meg å forstå feilmeldingene som guider meg gjennom utviklingen. Dersom du trenger hjelp til å komme til de første feilmeldingene kan du se resten av artikkelen.</p>
<p><!-- more --></p>
<h3>Steg for steg: Startpunktet</h3>
<p>Selv om jeg valgte veldig enkel teknologi for implementasjonen, har jeg valgt et større sett med biblioteker for å skrive testene. Jeg bruker følgende når jeg skriver testene:</p>
<ul>
<li>JUnit 4.6</li>
<li>Jetty 6.1.22</li>
<li>HSqlDb 1.8.0.10</li>
<li>WebDriver-HtmlUnit 0.6.1039</li>
<li>Mockito 1.8.0</li>
<li>FEST-assert 1.2 (ikke påkrevd, men gjør testene søtere)</li>
</ul>
<p>Den eneste teknologien jeg har valgt for implementasjonen er Servlet-API 2.5 og Hibernate-Annotations 3.4.0.GA.</p>
<p>For at du skal slippe å plundre så mye med avhengigheter før du kommer i gang har jeg laget en <a href="http://svn.brodwall.com/demo/java-ee-spike-kata/pom.xml">pom.xml</a>-fil som du kan ta utgangspunkt i.</p>
<h3>Web-tester</h3>
<p>For å starte utviklingen, er det lurt med en test som starter på utsiden av applikasjonen. Noe slikt:</p>
<ol>
<li>Start opp miljøet</li>
<li>Legg inn en person</li>
<li>Søk etter personen</li>
</ol>
<p>Slik kommer du i gang med en test som går mot en web applikasjon:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">int</span> SERVER_PICKS_PORT <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
org.<span style="color: #006633;">mortbay</span>.<span style="color: #006633;">jetty</span>.<span style="color: #006633;">Server</span> server <span style="color: #339933;">=</span> 
       <span style="color: #000000; font-weight: bold;">new</span> org.<span style="color: #006633;">mortbay</span>.<span style="color: #006633;">jetty</span>.<span style="color: #006633;">Server</span><span style="color: #009900;">&#40;</span>SERVER_PICKS_PORT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
server.<span style="color: #006633;">addHandler</span><span style="color: #009900;">&#40;</span>
       <span style="color: #000000; font-weight: bold;">new</span> org.<span style="color: #006633;">mortbay</span>.<span style="color: #006633;">jetty</span>.<span style="color: #006633;">webapp</span>.<span style="color: #006633;">WebAppContext</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;src/main/webapp&quot;</span>, <span style="color: #0000ff;">&quot;/&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
server.<span style="color: #006633;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">int</span> serverPort <span style="color: #339933;">=</span> server.<span style="color: #006633;">getConnectors</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #006633;">getLocalPort</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
org.<span style="color: #006633;">openqa</span>.<span style="color: #006633;">selenium</span>.<span style="color: #006633;">WebDriver</span> browser <span style="color: #339933;">=</span>
       <span style="color: #000000; font-weight: bold;">new</span> org.<span style="color: #006633;">openqa</span>.<span style="color: #006633;">selenium</span>.<span style="color: #006633;">htmlunit</span>.<span style="color: #006633;">HtmlUnitDriver</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
browser.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;http://localhost:&quot;</span> <span style="color: #339933;">+</span> serverPort <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;/&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
browser.<span style="color: #006633;">findElement</span><span style="color: #009900;">&#40;</span>By.<span style="color: #006633;">linkText</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Create person&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Dette oppsettet forventer å finne <code>web.xml</code>-fila på <code>src/main/webapp/WEB-INF/web.xml</code>.</p>
<h3>Funksjonell test</h3>
<p>En funksjonell test definerer <em>kravene</em> i applikasjonen. Det er lurt å gjøre funksjonelle tester så raske som overhode mulig, samtidig som de går gjennom alle kravene. En funksjonell test trenger ikke være en ende-til-ende test, slik som eksempelet over. Dette er viktig, fordi ende-til-ende tester er ofte veldig trege. Her er noen eksempler på funksjonelle tester:</p>
<ul>
<li>Vis en siden for å opprette nye personer</li>
<li>Opprett en ny person</li>
<li>Verifiser at personens navn er oppgitt og ikke inneholder ulovlige tegn</li>
<li>Vis en side for å søke etter personer</li>
<li>Vis alle personer dersom søkestreng ikke er angitt</li>
<li>Søk etter angitt søkestreng</li>
</ul>
<p>En funksjonell test kan se slik ut:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">PersonServlet servlet <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> PersonServlet<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
HttpServletRequest req <span style="color: #339933;">=</span>
    org.<span style="color: #006633;">mockito</span>.<span style="color: #006633;">Mockito</span>.<span style="color: #006633;">mock</span><span style="color: #009900;">&#40;</span>HttpServletRequest.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
HttpServletResponse resp <span style="color: #339933;">=</span>
    org.<span style="color: #006633;">mockito</span>.<span style="color: #006633;">Mockito</span>.<span style="color: #006633;">mock</span><span style="color: #009900;">&#40;</span>HttpServletResponse.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
PersonDao personDao <span style="color: #339933;">=</span>
    org.<span style="color: #006633;">mockito</span>.<span style="color: #006633;">Mockito</span>.<span style="color: #006633;">mock</span><span style="color: #009900;">&#40;</span>PersonDao.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
servlet.<span style="color: #006633;">setPersonDao</span><span style="color: #009900;">&#40;</span>personDao<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
org.<span style="color: #006633;">mockito</span>.<span style="color: #006633;">Mockito</span>.<span style="color: #006633;">when</span><span style="color: #009900;">&#40;</span>req.<span style="color: #006633;">getMethod</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">thenReturn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;POST&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
org.<span style="color: #006633;">mockito</span>.<span style="color: #006633;">Mockito</span>.<span style="color: #006633;">when</span><span style="color: #009900;">&#40;</span>req.<span style="color: #006633;">getPathInfo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">thenReturn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/create.html&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
org.<span style="color: #006633;">mockito</span>.<span style="color: #006633;">Mockito</span>.<span style="color: #006633;">when</span><span style="color: #009900;">&#40;</span>req.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;full_name&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">thenReturn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Johannes Brodwall&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003399;">StringWriter</span> pageSource <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">StringWriter</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
org.<span style="color: #006633;">mockito</span>.<span style="color: #006633;">Mockito</span>.<span style="color: #006633;">when</span><span style="color: #009900;">&#40;</span>resp.<span style="color: #006633;">getWriter</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">thenReturn</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">PrintWriter</span><span style="color: #009900;">&#40;</span>pageSource<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
servlet.<span style="color: #006633;">service</span><span style="color: #009900;">&#40;</span>req, resp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
org.<span style="color: #006633;">mockito</span>.<span style="color: #006633;">Mockito</span>.<span style="color: #006633;">verify</span><span style="color: #009900;">&#40;</span>personDao<span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">create</span><span style="color: #009900;">&#40;</span>Person.<span style="color: #006633;">byName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Johannes Brodwall&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
org.<span style="color: #006633;">fest</span>.<span style="color: #006633;">assertions</span>.<span style="color: #006633;">Assertions</span>.<span style="color: #006633;">assertThat</span><span style="color: #009900;">&#40;</span>pageSource.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">contains</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Personen er opprettet&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>Data-aksess-test</h3>
<p>Hibernate forenkler databasebruken mye. Men Hibernate er selv komplekst og når man bruker det på mer avanserte måter fortjener det egne tester. En typisk test med Hibernate kan være:</p>
<ol>
<li>Legg i tre personer i database</li>
<li>Søk etter en del av navnet på en av dem</li>
<li>Sjekk at du får tilbake akkurat den du forventet</li>
</ol>
<p>Når jeg starter med Hibernate, lager jeg en test som dette, og følger feilmeldingene. Pass på å både følge feilmeldinger i loggen og stack tracer.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">AnnotationConfiguration conf <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> AnnotationConfiguration<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">setProperty</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Environment</span>.<span style="color: #003399;">URL</span>, <span style="color: #0000ff;">&quot;jdbc:hsqldb:mem:persondaotest&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
PersonDao dao <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> HibernatePersonDao<span style="color: #009900;">&#40;</span>conf.<span style="color: #006633;">buildSessionFactory</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
dao.<span style="color: #006633;">create</span><span style="color: #009900;">&#40;</span>Person.<span style="color: #006633;">withName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;foo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
org.<span style="color: #006633;">fest</span>.<span style="color: #006633;">assertions</span>.<span style="color: #006633;">Assertions</span>.<span style="color: #006633;">assertThat</span><span style="color: #009900;">&#40;</span>dao.<span style="color: #006633;">find</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">containsExactly</span><span style="color: #009900;">&#40;</span>Person.<span style="color: #006633;">withName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;foo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Følg feilmeldingene herfra.</p>
<h3>Integrasjon</h3>
<p>En veldig vanlig måte for web serveren å overlevere spesielt ting som DataSources til applikasjonen er via JNDI. I Jetty kan du gjøre dette i Web-testen på følgende måte:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">org.<span style="color: #006633;">hsqldb</span>.<span style="color: #006633;">jdbc</span>.<span style="color: #006633;">jdbcDataSource</span> ds <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> org.<span style="color: #006633;">hsqldb</span>.<span style="color: #006633;">jdbc</span>.<span style="color: #006633;">jdbcDataSource</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
ds.<span style="color: #006633;">setDatabase</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;jdbc:hsqldb:mem:personwebtest&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
ds.<span style="color: #006633;">setUser</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;sa&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">new</span> org.<span style="color: #006633;">mortbay</span>.<span style="color: #006633;">jetty</span>.<span style="color: #006633;">plus</span>.<span style="color: #006633;">naming</span>.<span style="color: #006633;">Resource</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;jdbc/primaryDs&quot;</span>, ds<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Oppstart av Jetty som vist over</span></pre></div></div>

<h3>Konklusjon</h3>
<p>Å gjøre en liten øvelse som dette er en god måte å bli bevisst hvilke vaner du har og hvor lang tid det egentlig tar for deg å gjøre oppgavene dine. Du vil oppleve at det å skrive tester før koden føles som om det går saktere enn du tror du er vant til.</p>
<p>Men dersom du er som meg, vil du også oppleve noe annet: Når du tester ut applikasjonen første gang (du kan gjøre dette med Jetty, naturligvis) så er sjansene gode for at den vil være nokså feilfri og at debugging i stor grad er overflødig. Jeg vet ikke med deg, men debugging er en aktivitet jeg gjerne blir kvitt.</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2009/12/02/trene-pa-java-ee/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Tips for databasemigreringer</title>
		<link>http://johannesbrodwall.com/2009/11/24/tips-for-databasemigreringer/</link>
		<comments>http://johannesbrodwall.com/2009/11/24/tips-for-databasemigreringer/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 18:10:42 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Norsk]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://johannesbrodwall.com/?p=486</guid>
		<description><![CDATA[En kollega spurte i dag om mine topp tips når det gjelder databaserefactorings. Her er mitt svar:

<ol>
  <li>Ha en organisert struktur med at man gjennomfører navngitte migreringer (a la <a href="http://api.rubyonrails.org/classes/ActiveRecord/Migration.html">Ruby-on-Rails sine migrations</a> eller <a href="http://dbdeploy.com/">dbdeploy</a>). Typisk er det vanlig og velfungerende å navngi scripts med løpenummer (001, 002, ...) eller timestamp (20091124071300, ...) og ha en tabell i databasen som holder styr på hva som har blitt kjørt</li>
  <li>Bruk views og materialiserte views for å støtte tilbakekompabilitet (NB: Oracle er veldig sterk på dette, andre databaser kan slite)</li>
  <li>Om mulig, gjør hver migrering bakoverkompatibel på en versjon av programvaren. Dette er lettere å få til jo hyppigere du releaser programvaren</li>
  <li>Skill endringer i skjema (for eksempel: legg på en kolonne) fra migrering av data (for eksempel: populere kolonnen). Feilene vil typisk ligge i #2 av disse, og den er lett å gjøre transaksjonell, mens skjemaendringer ikke er transaksjonelle i de fleste baser.</li>
</ol>

Har jeg dekket det viktigste da?]]></description>
			<content:encoded><![CDATA[<p>En kollega spurte i dag om mine topp tips når det gjelder databaserefactorings. Her var mitt svar:</p>
<ol>
<li>Ha en organisert struktur med at man gjennomfører navngitte migreringer (a la <a href="http://api.rubyonrails.org/classes/ActiveRecord/Migration.html">Ruby-on-Rails sine migrations</a> eller <a href="http://dbdeploy.com/">dbdeploy</a>). Typisk er det vanlig og velfungerende å navngi scripts med løpenummer (001, 002, &#8230;) eller timestamp (20091124071300, &#8230;) og ha en tabell i databasen som holder styr på hva som har blitt kjørt</li>
<li>Bruk views og materialiserte views for å støtte tilbakekompabilitet (NB: Oracle er veldig sterk på dette, andre databaser kan slite)</li>
<li>Om mulig, gjør hver migrering bakoverkompatibel på en versjon av programvaren. Dette er lettere å få til jo hyppigere du releaser programvaren</li>
<li>Skill endringer i skjema (for eksempel: legg på en kolonne) fra migrering av data (for eksempel: populere kolonnen). Feilene vil typisk ligge i #2 av disse, og den er lett å gjøre transaksjonell, mens skjemaendringer ikke er transaksjonelle i de fleste baser.</li>
</ol>
<p>Har jeg dekket det viktigste da?</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2009/11/24/tips-for-databasemigreringer/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Lær Scrum på 3 minutter</title>
		<link>http://johannesbrodwall.com/2009/09/07/l%c3%a6r-scrum-pa-3-minutter/</link>
		<comments>http://johannesbrodwall.com/2009/09/07/l%c3%a6r-scrum-pa-3-minutter/#comments</comments>
		<pubDate>Mon, 07 Sep 2009 20:31:05 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Non-technical]]></category>
		<category><![CDATA[Norsk]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://johannesbrodwall.com/?p=453</guid>
		<description><![CDATA[<blockquote><em>This Norwegian language article introduces a short two-page guide I've written to explain Scrum to people who've only just heard of it.</em></blockquote>

I samarbeid med våre dyktige redaksjonelle medarbeidere på Steria, har jeg forfattet en "3 minutters guide" til Scrum. Denne tar for seg spørsmålene som "hva er egentlig Scrum".

[caption id="" align="alignnone" width="360" caption="Dette er Scrum"]<a href="http://steria.no/gloria/id/11004571/subid/0"><img alt="Hva er egentlig Scrum" src="http://steria.no/image/4954/1/4954_1.jpg" title="Hva er egentlig Scrum" width="360" height="152" /></a>[/caption]
  
3-minutterguidene kan lastes ned fra <a href="http://steria.no/gloria/id/11004571/subid/0">Sterias hjemmesider</a>.
  
Jeg planlegger å følge opp denne guiden med en guide som beskriver hva som skal til for å faktisk lykkes med Scrum. Har du noen ideer?]]></description>
			<content:encoded><![CDATA[<blockquote><p><em>This Norwegian language article introduces a short two-page guide I&#8217;ve written to explain Scrum to people who&#8217;ve only just heard of it.</em></p></blockquote>
<p>I samarbeid med våre dyktige redaksjonelle medarbeidere på Steria, har jeg forfattet en &#8220;3 minutters guide&#8221; til Scrum. Denne tar for seg spørsmålene som &#8220;hva er egentlig Scrum&#8221;.</p>
<div class="wp-caption alignnone" style="width: 370px"><a href="http://steria.no/gloria/id/11004571/subid/0"><img alt="Hva er egentlig Scrum" src="http://steria.no/image/4954/1/4954_1.jpg" title="Hva er egentlig Scrum" width="360" height="152" /></a><p class="wp-caption-text">Dette er Scrum</p></div>
<p>3-minutterguidene kan lastes ned fra <a href="http://steria.no/gloria/id/11004571/subid/0">Sterias hjemmesider</a>.</p>
<p>Jeg planlegger å følge opp denne guiden med en guide som beskriver hva som skal til for å faktisk lykkes med Scrum. Har du noen ideer?</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2009/09/07/l%c3%a6r-scrum-pa-3-minutter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>En lynrask innføring i Scrum</title>
		<link>http://johannesbrodwall.com/2009/07/30/en-lynrask-innf%c3%b8ring-i-scrum/</link>
		<comments>http://johannesbrodwall.com/2009/07/30/en-lynrask-innf%c3%b8ring-i-scrum/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 09:33:09 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Non-technical]]></category>
		<category><![CDATA[Norsk]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://johannesbrodwall.com/?p=411</guid>
		<description><![CDATA[<blockquote>This Norwegian language post talks a little about a quick intro to Scrum that I wrote for my employer</blockquote>

Jeg har forfattet en "3-minutters guide" til Scrum. Dette er en to siders lettlest artikkel som publiserer via min arbeidsgiver Steria. Denne har som mål å være tilgjengelig både for tekniske og ikke-tekniske prosjektdeltagere som gjerne vil forstå litt mer om hva Scrum dreier seg om.

Du finner artikkelen på <a href="http://steria.no/gloria/id/11004571/subid/0">Sterias arkiv over 3-minuttersguider</a>. Du kan <a href="mailto:johannes@brodwall.com">ta kontakt</a> dersom du ønsker et eller flere eksemplarer av guiden trykket på solid papir.

Jeg regner med å lage flere iterasjoner av denne guiden, så tips om forbedringer mottas med takk.]]></description>
			<content:encoded><![CDATA[<blockquote><p>This Norwegian language post talks a little about a quick intro to Scrum that I wrote for my employer</p></blockquote>
<p>Jeg har forfattet en &#8220;3-minutters guide&#8221; til Scrum. Dette er en to siders lettlest artikkel som publiserer via min arbeidsgiver Steria. Denne har som mål å være tilgjengelig både for tekniske og ikke-tekniske prosjektdeltagere som gjerne vil forstå litt mer om hva Scrum dreier seg om.</p>
<p>Du finner artikkelen på <a href="http://steria.no/gloria/id/11004571/subid/0">Sterias arkiv over 3-minuttersguider</a>. Du kan <a href="mailto:johannes@brodwall.com">ta kontakt</a> dersom du ønsker et eller flere eksemplarer av guiden trykket på solid papir.</p>
<p>Jeg regner med å lage flere iterasjoner av denne guiden, så tips om forbedringer mottas med takk.</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2009/07/30/en-lynrask-innf%c3%b8ring-i-scrum/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Den Smidige myte?</title>
		<link>http://johannesbrodwall.com/2009/05/25/den-smidige-myte/</link>
		<comments>http://johannesbrodwall.com/2009/05/25/den-smidige-myte/#comments</comments>
		<pubDate>Mon, 25 May 2009 18:53:40 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Norsk]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://brodwall.com/johannes/blog/?p=358</guid>
		<description><![CDATA[This is a Norwegian language copy of an article I published with Niklas Bjørnerstedt in the Norwegian computing magazine ComputerWorld Studier som utgir seg for å være vitenskapelig utført viser seg stadig å ikke tåle nærmere granskning. Kommersielle tenkesmier tar mange snarveier i kampen om å få frem oppsiktsvekkende resultater. Forskeren Magne Jørgensen har gjennom [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><em>This is a Norwegian language copy of an article I published with <a href="http://www.leanway.no/?p=125">Niklas Bjørnerstedt</a> in the Norwegian computing magazine ComputerWorld</em></p></blockquote>
<p>Studier som utgir seg for å være vitenskapelig utført viser seg stadig å ikke tåle nærmere granskning. Kommersielle tenkesmier tar mange snarveier i kampen om å få frem oppsiktsvekkende resultater. Forskeren Magne Jørgensen har gjennom årene bidratt til å “avsløre” flere tvilsomme studier og dermed bidratt til å heve den vitenskapelige standarden innenfor systemutvikling. Vi synes dette er en hederverdig innsats som vi har lært mye av. Vi synes dog at Magne har blitt overivrig i det siste. I både artikler og foredrag virker han å fremfekte et syn som stiller spørsmålstegn ved all erfaring som ikke er vitenskapelig bevist. Det siste eksemplet på dette synet sto å lese i CW den 24. mars. Når artikkelen bruker denne skepsisen til å koble smidig utvikling med ord som “mote” og “tro” så føler vi at forskeren er i ferd med å kaste ut barnet med badevannet.</p>
<p>Kan det noen gang bevises at smidig utvikling er effektivere enn “tradisjonell utvikling”? Problemstillingen er sannsynligvis for åpen. Det finnes mange måter man kan definere “effektiv” på, en uendelig antall måter å være smidig på og enda flere måter å utvikle på som ikke er smidige. Vitenskapelige studier må redusere en problemstilling til noe som lar seg måle. For eksempel: Gir parprogrammering færre defekter enn individuell programmering? Faren med å redusere problemstillinger på denne måten er at det som gjenstår kan bli et meningsløst spørsmål uten kontekst. Et studie har for eksempel nylig vist at en naken mann (eller kvinne) ikke mister mer varme gjennom hodet enn resten av kroppen. Men dette er ikke relevant til hvor vidt vi bør ta på oss lue om vinteren: I det virkelige livet er det få som velger å gå ut nakne på vinteren, men mange som går barhodet. I sitt foredrag på Software 2009 hevdet Magne tilsvarende at Fred Brooks berømte påstand “Adding manpower to a late software project makes it later” ikke er verdt mye da det er en overforenkling (Brooks skal selv ha innrømmet at det er en “outrageous oversimplification”). De fleste prosjektledere vil derimot si at dette er et godt eksempel på en erfaringsbasert regel. Selvfølgelig er den ikke sann i alle tilfeller, men man bør ha gode grunner for å bryte den.</p>
<p>Som et komplement til vitenskapelige studier er det jo vanlig å bruke erfaringsbaserte slutninger. Disse erfaringene kan være falske, vi mennesker er mestere på å lure oss selv, men det må likevel være bedre å basere seg på en erfaring enn å bare gjette. Hvis det så kommer vitenskapelige studier som tilsier at erfaringen er falsk så er det et grunnlag for å endre adferd. Det er viktig å samle erfaring på en måte som er tilnærmet vitenskapelig for å unngå noen av de fallgruvene Magne gir eksempler på i sine innlegg.</p>
<p>Systematisk bruk av erfaringer er også fundamentet for smidige metoder. Etter en kort iterasjon revurderer teamet resultatet og sin arbeidsform. Målet er nettopp å basere seg på erfaring og empiri framfor blind tro. Slik vil et smidig team bruke iterasjonene på å hente inn mer informasjon om teknikkene de bruker, måten de jobber på og hvor vidt arbeidet deres tilfredsstiller kundens behov.</p>
<p>Smidige metoder er heller ikke en moteting, slik Magne ser ut til å hevde. Smidig utvikling har en lang tradisjon. Det oppsto ikke med det smidige manifestet i 2001. Tankeretningen vokste ut fra det samme miljøet som ble kalt objektorientert på 90-tallet. Dette er et miljø med sterke bånd til akademia tilbake fra Smalltalk og Simula67 før dette. I tillegg har man lånt fra Toyota Production System sin erfaring innen prosessindustrien. En tradisjon som bygger på det W. Edwards Deming kalte Plan-Do-Check-Act &#8211; en tilpasning av den vitenskapelige metode til industrien.</p>
<p>Smidig utvikling er et rammeverk for å lære fra erfaring. På samme måte som man kan bruke vitenskapens verktøy bra eller dårlig, kan man bruke smidig utvikling bra eller dårlig. Det vil aldri finnes metoder som garanterer at vi lykkes. I stedet ønsker vi metoder som hjelper oss å oppdage når vi ikke gjør det.</p>
<p>Niklas Bjørnerstedt, Leanway<br />
Johannes Brodwall, Steria</p>
<p>Publisert i Computerworld 22. mai 2009 (kun i papirutgaven)</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2009/05/25/den-smidige-myte/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Alt kan refaktoreres</title>
		<link>http://johannesbrodwall.com/2009/05/23/alt-kan-refaktoreres/</link>
		<comments>http://johannesbrodwall.com/2009/05/23/alt-kan-refaktoreres/#comments</comments>
		<pubDate>Sat, 23 May 2009 21:12:33 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Norsk]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://brodwall.com/johannes/blog/?p=355</guid>
		<description><![CDATA[This blogpost is a Norwegian language tribute to one of my home city&#8217;s great poets Med takk til Joachim Nielsen Ta en titt inn på skjermen din æ&#8217;kke testen grønn Det var mye værre her om da&#8217;n da var alle tester røde Skulle vært her i forrige uke, da hadde byggserver&#8217;n stopp Alt jeg tenker [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><em>This blogpost is a Norwegian language tribute to one of my home city&#8217;s great poets</em></p></blockquote>
<blockquote><p><em>Med takk til Joachim Nielsen</em></p></blockquote>
<p>Ta en titt inn på skjermen din æ&#8217;kke testen grønn<br />
Det var mye værre her om da&#8217;n da var alle tester røde<br />
Skulle vært her i forrige uke, da hadde byggserver&#8217;n stopp<br />
Alt jeg tenker på er test og kode og bygg og mat hver bidige dag</p>
<p>Alt kan refaktoreres, alt kan leveres<br />
Alt kan refaktoreres, og ingen ting blir bedre</p>
<p>Jeg våkner i den samme gamle klassen og håper på det beste<br />
Tomme tester og tommere metoder, her er gutten som kan refaktorere<br />
Alle koderne som var her i går har forsvinni til no&#8217; bedre<br />
Hver dag er den samme som den neste, ut og refaktorere</p>
<p>Alt kan refaktoreres, ingen ting kan heles<br />
Alt kan refaktoreres, og ingen ting blir bedre</p>
<p>Jeg sitter her og tester igjen, min oppfinnsomhet har grenser<br />
Skulle hatt no&#8217; design eller no&#8217; krav, eller begge deler<br />
Alle folka går å prater om meg her skal det konverseres<br />
Dem begynner å bli skikkelig lei, her må det kritiseres</p>
<p>Ta en titt på skjermen din, æ&#8217;kke testen grønn (ikke vær så kjedelig)<br />
Det var mye værre her om da&#8217;n da var alle tester røde (ikke reproduserbar)<br />
Skulle vært her i forrige uke, da hadde byggserver&#8217;n stopp (kan det være mulig)<br />
Alt jeg tenker på er test og kode og bygg og mat hver bidige dag</p>
<p>Alt kan refaktoreres, alt kan leveres<br />
Alt kan refaktoreres, og ingen ting blir bedre</p>
<p>Jeg våkner i den samme gamle klassen og håper på det beste<br />
Tomme tester og tommere metoder, her er gutten som kan refaktorere<br />
Alle koderne som var her i går har forsvinni til no&#8217; bedre<br />
Hver dag er den samme som den neste, ut og refaktorere</p>
<p>Alt kan refaktoreres<br />
Alt kan leveres<br />
Alt kan refaktoreres<br />
Og ingen ting blir bedre</p>
<p>Alt kan refaktoreres<br />
Alt kan leveres<br />
Alt kan kopieres<br />
Og ingen ting blir bedre</p>
<p>Alt kan refaktoreres<br />
Alt kan refaktoreres<br />
Alt kan refaktoreres<br />
Alt kan refaktoreres</p>
<p><em>Forslag til refaktorering av sangen mottas med takk</em></p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2009/05/23/alt-kan-refaktoreres/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

