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

<channel>
	<title>Sterk blanding &#187; spesifikasjon</title>
	<atom:link href="http://sterkblanding.no/blog/tag/spesifikasjon/feed/" rel="self" type="application/rss+xml" />
	<link>http://sterkblanding.no</link>
	<description>– Sterke meninger om IT og ledelse</description>
	<lastBuildDate>Wed, 11 Jan 2012 10:00:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Tre tips til hvordan du kan dele opp brukerhistoriene dine</title>
		<link>http://sterkblanding.no/blog/2011/06/30/tre-tips-til-hvordan-du-kan-dele-opp-brukerhistoriene-dine/</link>
		<comments>http://sterkblanding.no/blog/2011/06/30/tre-tips-til-hvordan-du-kan-dele-opp-brukerhistoriene-dine/#comments</comments>
		<pubDate>Thu, 30 Jun 2011 12:34:36 +0000</pubDate>
		<dc:creator>Finn-Robert Kristensen</dc:creator>
				<category><![CDATA[Smidig]]></category>
		<category><![CDATA[spesifikasjon]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=1185</guid>
		<description><![CDATA[I smidige prosjekter jeg har deltatt i dukker det ofte opp problemer med å splitte opp brukerhistorier. Enten er de for store til å kunne estimeres eller til å passe inn i en iterasjon. Spørsmålet mange stiller er hvordan kan jeg splitte opp brukerhistorien min?]]></description>
			<content:encoded><![CDATA[<p>I smidige prosjekter jeg har deltatt i dukker det ofte opp problemer med å splitte opp brukerhistorier. Enten er de for store til å kunne estimeres eller til å passe inn i en iterasjon. Spørsmålet mange stiller er hvordan kan jeg splitte opp brukerhistorien min?</p>
<p>Her er tre ting du kan gjøre:</p>
<p><span id="more-1185"></span></p>
<p><strong>Splitt opp på domene</strong></p>
<p>Dette er kanskje den vanligste og enkleste måten å splitte opp brukerhistorier på. I domenet ditt vil du gjerne finne flere type kategorier av for eksempel produkter. Disse er ideelle å dele opp historiene dine på. La oss tenke oss et forsikringsselskap som tilbyr en rekke forskjellige forsikringsprodukter. Mye av tiden går til å behandle forsikringssaker og man skal lage et nytt system for å forbedre saksbehandlingstiden.</p>
<p>Eksempel:<br />
Som en saksbehandler<br />
Ønsker jeg å behandle en forsikringssak<br />
Slik at ..</p>
<p>Hva slags type forsikring er dette? Er det en skadeforsikring eller kanskje en livsforsikring? Her kan vi dele brukerhistorien opp på de forskjellige produktkategoriene.</p>
<p>Som en saksbehandler,<br />
Ønsker jeg å behandle en <strong>skadeforsikringssak</strong>,<br />
Slik at..</p>
<p>Hvis 70% av alle forsikringssaker er skadeforsikring vil jeg anta at denne vil ha en høyere prioritet enn en livsforsikringssak som kanskje gjelder 5% av alle sakene. Dette hjelper deg til å prioritere brukerhistoriene dine bedre.</p>
<p><strong>Splitt opp på operasjon</strong></p>
<p>Mange brukerhistorier handler om å skrive eller lese noe data. Dette kan vi dele opp i fire operasjoner: opprett, oppdater, slett og les.</p>
<p>Som en administrator,<br />
Ønsker jeg å administrere brukere<br />
Slik at jeg har kontroll på hvem som har tilgang til systemet</p>
<p>Etter samtaler med administratoren finner vi ut at han har behov for å opprette, endre og slettte brukere. Og ikke minst vise en brukerprofil som da blir les operasjonen. Du har nå mulighet til å dele opp en brukerhistorien i fire nye brukerhistorier.</p>
<p>Eksempel på å opprette:<br />
Som en administrator,<br />
Ønsker jeg å <strong>opprette en ny bruker</strong><br />
Slik at jeg enkelt kan gi nye brukere tilgang</p>
<p><strong>Splitt opp på roller</strong></p>
<p>Når vi diskuterer en brukerhistorie handler den som oftest om flere type brukere. Det kan være alt fra brukere som skal ha begrenset tilgang til brukere som bruker funksjonaliteten mer enn andre. Det kan lønne seg å identifisere hva slags type brukere som skal bruke funksjonaliteten og ut i fra dette bryte opp historien som beskriver hvem disse brukerene er og hva de trenger å kunne gjøre.</p>
<p>Som en kunde,<br />
Ønsker jeg å angi en leveringsadresse,<br />
Slik at …</p>
<p>Du har sikkert mange forskjellig typer kunder. Noen er kanskje innom daglig? Kanskje har du noen gode kunder som du ønsker å gjøre brukeropplevelsen bedre for?</p>
<p>Som en jevnlig kunde,<br />
Ønsker jeg å kunne velge en leveringsadresse fra mine tidligere ordre,<br />
Slik at jeg sparer tid på å fylle ut adressen min hver gang</p>
<p><strong>Konklusjon</strong></p>
<p>Ved å bryte ned historiene så får du noe som er enklere å prioritere innenfor en leveranse. Bryter du ned historiene dine vil du også ha mulighet til å implementere den viktigste funksjonaliteten først og unngå å bruke tid på å implementere funksjonalitet som sjelden blir brukt.</p>
<p>Her var tre eksempler på hvordan du kan bryte ned brukerhistoriene dine. Det er ikke alle brukerhistorier dette vil fungere på, men stort sett de fleste av dem.</p>
<p>Hvilke teknikker bruker du på å bruker historiene dine?</p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2011/06/30/tre-tips-til-hvordan-du-kan-dele-opp-brukerhistoriene-dine/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hemmeligheten bak gode spesifikasjoner</title>
		<link>http://sterkblanding.no/blog/2010/01/21/hemmeligheten-bak-gode-spesifikasjoner/</link>
		<comments>http://sterkblanding.no/blog/2010/01/21/hemmeligheten-bak-gode-spesifikasjoner/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 23:48:08 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Smidig]]></category>
		<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[FitNesse]]></category>
		<category><![CDATA[spesifikasjon]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=82</guid>
		<description><![CDATA[Mange prosjekter har startet å ta i bruk verktøy som FitNesse eller Cucumber til å automatisere funksjonelle tester. Disse verktøyene gjør det lett å skrive akseptansetester, men det er opp til oss som bruker dem å sørge for at disse testene blir til en god spesifikasjon av systemet som skal utvikles, og ikke bare testscript. [...]]]></description>
			<content:encoded><![CDATA[<p>Mange prosjekter har startet å ta i bruk verktøy som <a href="http://fitnesse.org">FitNesse</a> eller <a href="http://cukes.info">Cucumber</a> til å automatisere funksjonelle tester. Disse verktøyene gjør det lett å skrive akseptansetester, men det er opp til oss som bruker dem å sørge for at disse testene blir til en god spesifikasjon av systemet som skal utvikles, og ikke bare testscript. Her er noen tips for å forbedre dine spesifikasjoner.</p>
<p><span id="more-82"></span></p>
<h3>Fokus på &#8220;hvorfor&#8221;, ikke &#8220;hvordan&#8221;</h3>
<p>Hva forsøker denne testen å uttrykke:</p>
<blockquote><p>Når en bruker registrerer en betaling med beløp &#8220;-1234567890&#8243;, så skal brukeren se en feilmelding</p></blockquote>
<p>Hva med denne:</p>
<blockquote><p>Når en bruker registrerer en betaling med et negativt beløp så skal brukeren få en passende feilmelding</p></blockquote>
<p>Magiske tall, tekster og verdier i tester skjuler hva vi forsøker å <em>spesifisere</em>. Noen flere eksempler: &#8220;når en bruker utelater et eller flere påkrevde felter, så skal brukeren få en feilmelding knyttet til de manglende feltene&#8221;, &#8220;gitt at brukeren leverer en lottorekke med for få tall&#8221;.</p>
<p>Å koble slike tester mot systemet krever mer arbeid, spesielt de første gangene, men testene blir mye klarere etterpå. Og hovedformålet med en akseptansetest er at den er en spesifikasjon som kan diskuteres mellom prosjektet og omverdenen. Og da er det viktig å være klar. Noen ganger vil det virke svært vanskelig å automatisere forståelige spesifikasjoner. Da bør du huske at en god beskrivelse er mer verdifull enn en dårlig test.</p>
<h3>Given-when-then</h3>
<p>Noe av det første du lærer med tester er &#8220;bruk formen &#8216;gitt X, når Y, så Z&#8217;&#8221;. Men det er ikke alltid så klart hva X, Y og Z skal være. Tester består av tre typer steg:</p>
<ul>
<li><strong>Arrange</strong> (oppsett, &#8220;given&#8221;): Beskriver tilstanden til systemet før testen starter. Typiske eksempler er &#8220;<em>gitt at det eksisterer en bruker med utestående betalinger</em>&#8220;, &#8220;<em>gitt at tjenesten levert fra vår partner har registrert et varenummer</em>&#8221; eller kanskje &#8220;<em>gitt at det er en fredag</em>&#8221; (du får vente til freddan). Avhengig av systemet og tilstanden vi beskriver, kan testen benytte disse stegene på forskjellige måter: Vi kan <em>sette opp</em> brukeren og betalingene i systemet, vi kan se på steget som en forutsetning som vi <em>sjekker</em> om er oppfylt, for eksempel ved å gjøre et søk mot tjenesten fra vår partner, vi kan <em>forutsette</em>, eller endog håpe at det er oppfylt og vi kan la steget kun være dokumentasjon, slik at når testen feiler, så vet vi noen ting vi kan verifisere manuelt, eller det kan være en ren løgn. Kanskje systemet er satt opp på en spesiell måte slik at det ikke er avhengig av ukedagen. Men vi har lyst til å dokumentere hvordan det hadde sett ut om det hadde vært &#8220;på ordentlig.&#8221;</li>
<li><strong>Act</strong> (utfør, &#8220;when&#8221;): Beskriver stimuli inn fra omverden. &#8220;Når brukeren registrerer en ny betaling,&#8221; &#8220;når klientsystemet sender en betalingsforespørsel med manglende kundeinformasjon&#8221;. Disse kan implementeres på flere måter i de fleste systemer: Et test av et web-grensesnitt kan simulere en klient med for eksempel <a href="http://code.google.com/p/selenium/wiki/GettingStarted?redir=1">webdriver</a>, den kan gjøre et http-kall og direkte, eller testen kan bruke klassene som implementerer tjenesten direkte. For funksjonelle tester foretrekker jeg nesten alltid det siste. Det gjør at testene vil kjøre hundre ganger raskere, og vil som regel innebære mindre jobb. Husk: Det er ikke nødvendig å teste brukergrensesnittet på nytt for hver valideringsregel eller spesialtilfelle i applikasjonen din.</li>
<li><strong>Assert</strong> (sjekk, &#8220;then&#8221;): Beskriver hvordan systemet skal reagere på stimuli og hva tilstanden til systemet skal være etterpå. For eksempel &#8220;så skal brukeren få en feilmelding om at alle betalinger må være utført før en ny betaling kan registreres&#8221;, &#8220;så skal den nye betalingen ikke lagres i systemet.&#8221;</li>
</ul>
<h3>Veien fra testscript til spesifikasjoner</h3>
<p>Når prosjekter først tar i bruk FitNesse er det veldig vanlig å se tester som ser cirka slik ut:</p>
<ul>
<li>Putt inn <em>en kjempeliste med rader med en bråte kolonner</em> inn i tabell A.</li>
<li>Putt inn <em>en ny kjempelist med rader etc</em> i tabell B</li>
<li>Send inn et kjempemessig XML dokument</li>
<li>Sjekk at svaret matcher et nytt XML dokument</li>
</ul>
<p>Dette er ikke en spesifikasjon &#8211; det er et testscript. Og det er ikke slike tester som gir verdi til et prosjekt. Men det er et sted å starte, for det krever ikke så veldig mye kreativitet. Og vi kan gjenbruke lærdommen fra slike tester. Men før det blir en hel skog av tester som dytter XML-dokumenter hit og dit, kan det være lurt å løfte testene opp på et mer logisk nivå:</p>
<ul>
<li>Gitt at det ikke eksisterer noen betalingsforespørsler</li>
<li>Og en bruker er registrert</li>
<li>Når brukeren sender inn en betalingsforespørsel med <em>ett gitt problem</em></li>
<li>Så skal brukeren få feilmeldingen <em>en gitt feilmelding</em></li>
</ul>
<p>I FitNesse-terminologi kan en slik test implementeres som en ColumnFixture. Det vil si: Hvert par av &#8220;problem&#8221; og &#8220;feilmelding&#8221; er en rad i en tabell. Slik kan vi uttrykke mange regler ved systemet klart og konsist.</p>
<p>Dersom du har startet å gå veien med testscript, er det ikke vanskelig å snu: For hver rad i den nye spesifikasjonen din skal du utføre alt det testscriptet ditt gjorde.</p>
<p>Jeg vil bruke jobben med akseptansetester til ikke bare å gjøre automatiske kjøringer av systemet mitt, men til å spesifisere og diskutere de egentlige kravene brukerne mine bryr seg om. Og dersom jeg må velge mellom tester som lar seg automatisere og spesifikasjoner som beskriver kravet, vil jeg alltid velge det siste.</p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2010/01/21/hemmeligheten-bak-gode-spesifikasjoner/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

