<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
		>
<channel>
	<title>Comments on: Utenfra-og-inn programmering</title>
	<atom:link href="http://blog.kjempekjekt.com/2009/08/25/utenfra-og-inn-programmering/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.kjempekjekt.com/2009/08/25/utenfra-og-inn-programmering/</link>
	<description>om livet som .net utvikler</description>
	<lastBuildDate>Wed, 08 Feb 2012 09:53:01 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
	<item>
		<title>By: Str&#248;mlinjeformede enhetstester</title>
		<link>http://blog.kjempekjekt.com/2009/08/25/utenfra-og-inn-programmering/#comment-110946</link>
		<dc:creator>Str&#248;mlinjeformede enhetstester</dc:creator>
		<pubDate>Sat, 22 Jan 2011 07:24:26 +0000</pubDate>
		<guid isPermaLink="false">http://blog.kjempekjekt.com/2009/08/25/utenfra-og-inn-programmering/#comment-110946</guid>
		<description>[...] Les også mine mest populære testrelaterte artikler: Utenfra-og-inn programmering og TDD og mocking i praksis.  tweetmeme_source = &#039;tormaroe&#039;; tweetmeme_style = &#039;compact&#039;; [...]</description>
		<content:encoded><![CDATA[<p>[...] Les også mine mest populære testrelaterte artikler: Utenfra-og-inn programmering og TDD og mocking i praksis.  tweetmeme_source = &#8216;tormaroe&#8217;; tweetmeme_style = &#8216;compact&#8217;; [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Torbjørn</title>
		<link>http://blog.kjempekjekt.com/2009/08/25/utenfra-og-inn-programmering/#comment-73552</link>
		<dc:creator>Torbjørn</dc:creator>
		<pubDate>Fri, 06 Nov 2009 17:34:41 +0000</pubDate>
		<guid isPermaLink="false">http://blog.kjempekjekt.com/2009/08/25/utenfra-og-inn-programmering/#comment-73552</guid>
		<description>Har du sett :) Ja, jeg er overaskende godt plassert på enkelte googlesøk. Er f.eks. nesten helt i toppen både på wpf og wcf på google.no, uten at jeg har skrevet ekstremt mye om noen av delene. Teller endel at jeg er en av ytterst få som skriver om systemutvikling på norsk.</description>
		<content:encoded><![CDATA[<p>Har du sett :) Ja, jeg er overaskende godt plassert på enkelte googlesøk. Er f.eks. nesten helt i toppen både på wpf og wcf på google.no, uten at jeg har skrevet ekstremt mye om noen av delene. Teller endel at jeg er en av ytterst få som skriver om systemutvikling på norsk.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Bjørn</title>
		<link>http://blog.kjempekjekt.com/2009/08/25/utenfra-og-inn-programmering/#comment-73544</link>
		<dc:creator>Bjørn</dc:creator>
		<pubDate>Fri, 06 Nov 2009 15:33:15 +0000</pubDate>
		<guid isPermaLink="false">http://blog.kjempekjekt.com/2009/08/25/utenfra-og-inn-programmering/#comment-73544</guid>
		<description>Torbjørn, det er fett når man sitter på båten hjem, gjør følgende googlesøk

http://www.google.no/search?q=crud+moq+repository&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=org.mozilla:nb-NO:official&amp;client=firefox-a

og en kollega dukker opp blandt de første treffene!</description>
		<content:encoded><![CDATA[<p>Torbjørn, det er fett når man sitter på båten hjem, gjør følgende googlesøk</p>
<p><a href="http://www.google.no/search?q=crud+moq+repository&#038;ie=utf-8&#038;oe=utf-8&#038;aq=t&#038;rls=org.mozilla:nb-NO:official&#038;client=firefox-a" rel="nofollow">http://www.google.no/search?q=crud+moq+repository&#038;ie=utf-8&#038;oe=utf-8&#038;aq=t&#038;rls=org.mozilla:nb-NO:official&#038;client=firefox-a</a></p>
<p>og en kollega dukker opp blandt de første treffene!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Torbjørn</title>
		<link>http://blog.kjempekjekt.com/2009/08/25/utenfra-og-inn-programmering/#comment-65431</link>
		<dc:creator>Torbjørn</dc:creator>
		<pubDate>Fri, 28 Aug 2009 09:47:24 +0000</pubDate>
		<guid isPermaLink="false">http://blog.kjempekjekt.com/2009/08/25/utenfra-og-inn-programmering/#comment-65431</guid>
		<description>Jonas, jeg er helt enig, dette har ikke bare med GUI å gjøre. I min &quot;historie fra virkeligheten&quot; implementerte jeg f.eks. en meldingshåndterer-modul som skulle kjøre i en win service.

Når det gjelder begrepsforvissingen så er jeg enig med @kzu - utvikleren bak moq - da han sier at det egentlig ikke gir noen spesiell verdi å kunne skille mellom mocks, fakes, stubs, etc. Se min siste post: http://blog.kjempekjekt.com/2009/08/27/avhengighetsisolering-aka-mocking-i-net/</description>
		<content:encoded><![CDATA[<p>Jonas, jeg er helt enig, dette har ikke bare med GUI å gjøre. I min &#8220;historie fra virkeligheten&#8221; implementerte jeg f.eks. en meldingshåndterer-modul som skulle kjøre i en win service.</p>
<p>Når det gjelder begrepsforvissingen så er jeg enig med @kzu &#8211; utvikleren bak moq &#8211; da han sier at det egentlig ikke gir noen spesiell verdi å kunne skille mellom mocks, fakes, stubs, etc. Se min siste post: <a href="http://blog.kjempekjekt.com/2009/08/27/avhengighetsisolering-aka-mocking-i-net/" rel="nofollow">http://blog.kjempekjekt.com/2009/08/27/avhengighetsisolering-aka-mocking-i-net/</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jonas Follesø</title>
		<link>http://blog.kjempekjekt.com/2009/08/25/utenfra-og-inn-programmering/#comment-65429</link>
		<dc:creator>Jonas Follesø</dc:creator>
		<pubDate>Fri, 28 Aug 2009 09:41:32 +0000</pubDate>
		<guid isPermaLink="false">http://blog.kjempekjekt.com/2009/08/25/utenfra-og-inn-programmering/#comment-65429</guid>
		<description>Flott post, med god diskusjon knyttet til den.

Par kommentarer: Utenfra-og-inn-programmering fungerer like bra på API-er, web tjenester eller hvilken som helst kode. Det er ingen forutsetning at det du lager har et brukergrensesnitt. Og gjennom å skrive testen først, er du hele tiden en &quot;klient&quot; av koden du skal skrive, og på den måten kun implementerer det som strengt tatt er nødvendig. Så teknikken kan like gjerne brukes om du skal lage et API for å snakke med Twitter, eller en GUI applikasjon.

Kommentar to: Det er en god del forvirring rundt begrepsbruken Mock, Fake, Test-Double, Stub osv. Jeg velger å følge Roy Osherove&#039;s beskrivelse fra NDC. Alt er en stub inntil du gjør en assert. Da blir den en Mock. Og du skal kun ha en Mock per test (en logisk Assert).

Så dvs. at Mocking vs Stubbing handler ikke så mye om hvilken &quot;teknologi&quot; eller verktøy du bruker, men snarere hvilken rolle objektet får når testen kjøres. De objektene du gjør assert mot blir mocks, de som spiller på lag for å returnere fake data er stubs.

På prosjektet jeg jobber på nå skriver vi alle Mockene våre for hånd. Det er enkelt, lett og forstå og fleksibelt. Vi bruker public fields for å styre oppførsel.

F.eks &quot;KunderSomSkalReturneres&quot;, &quot;HentKundeBleKalt&quot;, eller &quot;SkalKasteException&quot; osv.</description>
		<content:encoded><![CDATA[<p>Flott post, med god diskusjon knyttet til den.</p>
<p>Par kommentarer: Utenfra-og-inn-programmering fungerer like bra på API-er, web tjenester eller hvilken som helst kode. Det er ingen forutsetning at det du lager har et brukergrensesnitt. Og gjennom å skrive testen først, er du hele tiden en &#8220;klient&#8221; av koden du skal skrive, og på den måten kun implementerer det som strengt tatt er nødvendig. Så teknikken kan like gjerne brukes om du skal lage et API for å snakke med Twitter, eller en GUI applikasjon.</p>
<p>Kommentar to: Det er en god del forvirring rundt begrepsbruken Mock, Fake, Test-Double, Stub osv. Jeg velger å følge Roy Osherove&#8217;s beskrivelse fra NDC. Alt er en stub inntil du gjør en assert. Da blir den en Mock. Og du skal kun ha en Mock per test (en logisk Assert).</p>
<p>Så dvs. at Mocking vs Stubbing handler ikke så mye om hvilken &#8220;teknologi&#8221; eller verktøy du bruker, men snarere hvilken rolle objektet får når testen kjøres. De objektene du gjør assert mot blir mocks, de som spiller på lag for å returnere fake data er stubs.</p>
<p>På prosjektet jeg jobber på nå skriver vi alle Mockene våre for hånd. Det er enkelt, lett og forstå og fleksibelt. Vi bruker public fields for å styre oppførsel.</p>
<p>F.eks &#8220;KunderSomSkalReturneres&#8221;, &#8220;HentKundeBleKalt&#8221;, eller &#8220;SkalKasteException&#8221; osv.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Gøran Hansen</title>
		<link>http://blog.kjempekjekt.com/2009/08/25/utenfra-og-inn-programmering/#comment-65421</link>
		<dc:creator>Gøran Hansen</dc:creator>
		<pubDate>Fri, 28 Aug 2009 08:51:12 +0000</pubDate>
		<guid isPermaLink="false">http://blog.kjempekjekt.com/2009/08/25/utenfra-og-inn-programmering/#comment-65421</guid>
		<description>Hei  Torbjørn!

Jeg vil også skrive meg inn i fanklubben din! Det er morsomt å lese dine poster. Du er flink til å skrive og kommunisere ditt budskap. Stå på!

Jeg er også en stor fan av utenfra-og-inn fremgangsmåten, og bruker det selv flittig når jeg utvikler systemer med grafiske brukergrensesnitt. Jeg er helt enig med deg i at dette er en god fremgangsmåte for å oppdage avhengighetene – utenfra og inn, men det er ikke hovedgrunnen til at jeg selv jobber på denne måten. 

Jeg jobber utenfra-og-inn er på grunn av kunden. Kunder flest oppfatter datasystemer som brukergrensesnittet han/hun ser på skjermen. I mange tilfeller bryr de seg ikke om hvordan database som brukes, om det er 3-lags arkitektur, om det er tjenester (SOA), programmeringsspråk, platform osv. Selvsagt er det unntak, men de ødelegger poenget mitt:p Hvis jeg begynner med brukergrensesnittet, kan jeg ta kunden med i feedback loopen fra dag 1. Allerede etter noen linjer med programmering har jeg noe å vise frem til kunden – noe som kunden også forstår, nemlig skjermbilder. Jeg behøver ikke å si til kunden: du må vente en eller to måneder, for vi jobber med å få på plass ”arkitekturen”. Dette stimulerer til tettere samarbeid mellom leverandør og kunde, og minsker risiko. Kunden behøver ikke ”brenne” to måneder med utvikling for å se den første funksjonaliteten. Selvsagt er arkitektur viktig, men alt behøves ikke å gjøres up front – den kan også vokse organisk mens vi utvikler programvaren.

Når det gjelder persistence ignorance er jeg helt enig. Jeg personlig, begynner ALDRI med relasjonsdatabasen. Jeg tenker ikke engang relasjonsdatabaser – jeg tenker persistering. Men jeg må vell også nevne at jeg i de fleste tilfeller jobber med OO :) Relasjonsdatabaser har sine bruksområder.

Mocking er nyttig for å isolere avhengighetene, men ikke den enste måten å gjøre det på. Jeg har også gode erfaringer med å skrive FAKE implementeringer som benyttes i stedet for MOCK objekter. Da er det enklere for mindre erfarne utviklere å forstå hva som foregår. Jeg er helt enig med Johannes at MOCKs er for viderekommende. Dersom jeg jobber i et team med utviklere som ikke har erfaring fra TDD og mocking, begynner jeg forsiktig med å introdusere dem for FAKE implementeringer før MOCKs.

Vi drives helt klart av forretningsbehov. Det er prosjektenes sponsorer (stakeholders) som sitter på pengesekken, og vi må gjøre som de vil. Det er ikke uvanlig at disse er ambivalent, og ønsker endringer fortere enn vi rekker å implementere eksisterende krav. For at vi som utviklere skal klare å være fleksibel ovenfor våre sponsorer, må vi ha en fleksibel kodebase. For å få en fleksibel kodebase så er TDD, BDD og mocking gode ”verktøy”. For å oppdage endringer tidlig er utenfra-og-inn en veldig god taktikk.


Gøran</description>
		<content:encoded><![CDATA[<p>Hei  Torbjørn!</p>
<p>Jeg vil også skrive meg inn i fanklubben din! Det er morsomt å lese dine poster. Du er flink til å skrive og kommunisere ditt budskap. Stå på!</p>
<p>Jeg er også en stor fan av utenfra-og-inn fremgangsmåten, og bruker det selv flittig når jeg utvikler systemer med grafiske brukergrensesnitt. Jeg er helt enig med deg i at dette er en god fremgangsmåte for å oppdage avhengighetene – utenfra og inn, men det er ikke hovedgrunnen til at jeg selv jobber på denne måten. </p>
<p>Jeg jobber utenfra-og-inn er på grunn av kunden. Kunder flest oppfatter datasystemer som brukergrensesnittet han/hun ser på skjermen. I mange tilfeller bryr de seg ikke om hvordan database som brukes, om det er 3-lags arkitektur, om det er tjenester (SOA), programmeringsspråk, platform osv. Selvsagt er det unntak, men de ødelegger poenget mitt:p Hvis jeg begynner med brukergrensesnittet, kan jeg ta kunden med i feedback loopen fra dag 1. Allerede etter noen linjer med programmering har jeg noe å vise frem til kunden – noe som kunden også forstår, nemlig skjermbilder. Jeg behøver ikke å si til kunden: du må vente en eller to måneder, for vi jobber med å få på plass ”arkitekturen”. Dette stimulerer til tettere samarbeid mellom leverandør og kunde, og minsker risiko. Kunden behøver ikke ”brenne” to måneder med utvikling for å se den første funksjonaliteten. Selvsagt er arkitektur viktig, men alt behøves ikke å gjøres up front – den kan også vokse organisk mens vi utvikler programvaren.</p>
<p>Når det gjelder persistence ignorance er jeg helt enig. Jeg personlig, begynner ALDRI med relasjonsdatabasen. Jeg tenker ikke engang relasjonsdatabaser – jeg tenker persistering. Men jeg må vell også nevne at jeg i de fleste tilfeller jobber med OO :) Relasjonsdatabaser har sine bruksområder.</p>
<p>Mocking er nyttig for å isolere avhengighetene, men ikke den enste måten å gjøre det på. Jeg har også gode erfaringer med å skrive FAKE implementeringer som benyttes i stedet for MOCK objekter. Da er det enklere for mindre erfarne utviklere å forstå hva som foregår. Jeg er helt enig med Johannes at MOCKs er for viderekommende. Dersom jeg jobber i et team med utviklere som ikke har erfaring fra TDD og mocking, begynner jeg forsiktig med å introdusere dem for FAKE implementeringer før MOCKs.</p>
<p>Vi drives helt klart av forretningsbehov. Det er prosjektenes sponsorer (stakeholders) som sitter på pengesekken, og vi må gjøre som de vil. Det er ikke uvanlig at disse er ambivalent, og ønsker endringer fortere enn vi rekker å implementere eksisterende krav. For at vi som utviklere skal klare å være fleksibel ovenfor våre sponsorer, må vi ha en fleksibel kodebase. For å få en fleksibel kodebase så er TDD, BDD og mocking gode ”verktøy”. For å oppdage endringer tidlig er utenfra-og-inn en veldig god taktikk.</p>
<p>Gøran</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Torbjørn</title>
		<link>http://blog.kjempekjekt.com/2009/08/25/utenfra-og-inn-programmering/#comment-65387</link>
		<dc:creator>Torbjørn</dc:creator>
		<pubDate>Fri, 28 Aug 2009 05:04:17 +0000</pubDate>
		<guid isPermaLink="false">http://blog.kjempekjekt.com/2009/08/25/utenfra-og-inn-programmering/#comment-65387</guid>
		<description>Hva er overdesign? Er det om du har flere klasser enn nødvendig? Er det når objektstrukturene blir så komplekse at de blir vanskelige å forstå, og man dermed mister produktivitet? Eller kan det være brudd på subjektive regler og oppfatninger om estetikk? 

Det finnes ikke noe klart svar på dette, hvor mye design som er fornuftig eller ikke, uten å ta hensyn til kontekst.

Vår oppgave som utviklere er å lage kode som kommuniserer godt, lage gode abstraksjoner. Er ikke et design med ti klasser potensielt dobbelt så kommunikativt som et design med fem klasser? Etter min erfaring er underdesign et større problem enn overdesign, og jeg setter faktisk pris på kode som den du viser i kommentaren. Kan du si noe mer om hvorfor dette er dårlig design?

Kanskje jeg har gått for langt. Jeg vet ikke.., jeg endrer/utvikler jo både min egen oppfatning og fremgangsmåte hele tiden, så det er vanskelig å være alt for bastant når man ikke får erfaring med å gjør det samme over lang tid (selv om jeg ikke lar det stoppe meg fra å hardnakket argumentere for mine meninger). Det er derfor jeg liker så godt å blogge, sånn at jeg kan få testet mine erfaringer og meninger ut i den store verden.</description>
		<content:encoded><![CDATA[<p>Hva er overdesign? Er det om du har flere klasser enn nødvendig? Er det når objektstrukturene blir så komplekse at de blir vanskelige å forstå, og man dermed mister produktivitet? Eller kan det være brudd på subjektive regler og oppfatninger om estetikk? </p>
<p>Det finnes ikke noe klart svar på dette, hvor mye design som er fornuftig eller ikke, uten å ta hensyn til kontekst.</p>
<p>Vår oppgave som utviklere er å lage kode som kommuniserer godt, lage gode abstraksjoner. Er ikke et design med ti klasser potensielt dobbelt så kommunikativt som et design med fem klasser? Etter min erfaring er underdesign et større problem enn overdesign, og jeg setter faktisk pris på kode som den du viser i kommentaren. Kan du si noe mer om hvorfor dette er dårlig design?</p>
<p>Kanskje jeg har gått for langt. Jeg vet ikke.., jeg endrer/utvikler jo både min egen oppfatning og fremgangsmåte hele tiden, så det er vanskelig å være alt for bastant når man ikke får erfaring med å gjør det samme over lang tid (selv om jeg ikke lar det stoppe meg fra å hardnakket argumentere for mine meninger). Det er derfor jeg liker så godt å blogge, sånn at jeg kan få testet mine erfaringer og meninger ut i den store verden.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Johannes Brodwall</title>
		<link>http://blog.kjempekjekt.com/2009/08/25/utenfra-og-inn-programmering/#comment-65338</link>
		<dc:creator>Johannes Brodwall</dc:creator>
		<pubDate>Thu, 27 Aug 2009 23:21:11 +0000</pubDate>
		<guid isPermaLink="false">http://blog.kjempekjekt.com/2009/08/25/utenfra-og-inn-programmering/#comment-65338</guid>
		<description>Mitt hovedproblem med mocking er at det ofte kan lede til overdesign. Et prima eksempel finnes i en introduksjon til JBehave: http://www.ryangreenhall.com/articles/bdd-by-example.html

Her ender man opp med store mengder mocking, men det er ikke så ille. Det som er ille er kode som minner om ting jeg har sett i min egen kode når jeg mocker:

    public class Guitar {

        public List notesPlayed = new ArrayList();

        public void play(Tab tab) {
            notesPlayed = tab.notesToBePlayed();
        }

    }


    public class Tab {

        private final List notes;

        public Tab(String asciiTab,
               TabParser parser) {
            notes = parser.parse(asciiTab);
        }

    }

Her har først Tab og så TabParser vært mocket. De er naturligvis bare flesk i dette designet. Sløsing. Muda!

Dette er tulleeksempler, men gjenspeiler kode som er skrevet av uerfarne eller overivrige mockere. Mocking er for viderekommende, og bør ikke brukes før du virkelig vet hva du holder på med!</description>
		<content:encoded><![CDATA[<p>Mitt hovedproblem med mocking er at det ofte kan lede til overdesign. Et prima eksempel finnes i en introduksjon til JBehave: <a href="http://www.ryangreenhall.com/articles/bdd-by-example.html" rel="nofollow">http://www.ryangreenhall.com/articles/bdd-by-example.html</a></p>
<p>Her ender man opp med store mengder mocking, men det er ikke så ille. Det som er ille er kode som minner om ting jeg har sett i min egen kode når jeg mocker:</p>
<p>    public class Guitar {</p>
<p>        public List notesPlayed = new ArrayList();</p>
<p>        public void play(Tab tab) {<br />
            notesPlayed = tab.notesToBePlayed();<br />
        }</p>
<p>    }</p>
<p>    public class Tab {</p>
<p>        private final List notes;</p>
<p>        public Tab(String asciiTab,<br />
               TabParser parser) {<br />
            notes = parser.parse(asciiTab);<br />
        }</p>
<p>    }</p>
<p>Her har først Tab og så TabParser vært mocket. De er naturligvis bare flesk i dette designet. Sløsing. Muda!</p>
<p>Dette er tulleeksempler, men gjenspeiler kode som er skrevet av uerfarne eller overivrige mockere. Mocking er for viderekommende, og bør ikke brukes før du virkelig vet hva du holder på med!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Torbjørn</title>
		<link>http://blog.kjempekjekt.com/2009/08/25/utenfra-og-inn-programmering/#comment-65257</link>
		<dc:creator>Torbjørn</dc:creator>
		<pubDate>Thu, 27 Aug 2009 06:47:31 +0000</pubDate>
		<guid isPermaLink="false">http://blog.kjempekjekt.com/2009/08/25/utenfra-og-inn-programmering/#comment-65257</guid>
		<description>Johannes: Jeg vil ikke si at den ene fremgangsmåten er bedre eller dårligere enn den andre. Det virker som om dere har en gjennomtenkt teknikk som fungerer for dere, og det er bra. Men det er en forskjell der, som lar meg påpeke poenget med min fremgangsmåte...

Hva skjer med din approach om du ikke har en lineær avhengighetstruktur, men har et voksende tre med avhengigheter? La oss si at du skal lage en kontroller som har fire avhengigheter. Og hva om disse igjen har flere avhengigheter? Da vil du ikke få noen feedback på om det du har gjort på toppen er riktig før alle disse avhengighetene er implementert - og det kan ta lang tid. Jeg foretrekker å gå i små steg med mye tilbakemelding - jeg tror det bør skalere bedre når kompleksiteten øker.

UPDATE: Jeg har en kommende post hvor jeg demonstrerer TDD i praksis. Håper du leser den, hvor min fremgangsmåte skal komme klart frem.

Du sier at jeg ikke skal sage systemet i to. Jeg vil påstå at det er hele poenget med objektorientering: Splitt opp systemet ditt i små, autonome enheter, som kan sammarbeide om å få jobben gjort. Hver enhet er et lite program som gjør én ting, og gjør den godt. Da føles det helt greit for meg - ja, jeg vil faktisk si filosofisk riktig - å utvikle enhetene i vakum, sålenge kravspesifiksjonen til enheten allerede er drevet frem av kodeeksempler/tester.

Enkelte har påpekt et skille mellom det de kaller klassisk TDD (eller State TDD) og \&quot;mockist TDD\&quot;. I klassisk TDD sies det at man er opptatt av å verifisere tilstandsendringer, og at man bruker mocks kun der hvor det i praksis er vanskelig eller tungvidt å bruke de faktiske implementasjonene. Mockist TDD fokuserer mer på å teste interaksjonen mellom objekter. For meg betyr det at denen formen er mer opptatt av adferd, som er en god ting. Martin FOwler sier (i Mocks Aren\&#039;t Stubs) at BDD er et \&quot;offshoot\&quot; fra mockist TDD.

Så det virker altså som om du står for en mer klassisk TDD (og da har du muligens flest på din side), mens jeg \&quot;reklamerer\&quot; for BDD (gjengen med mest momentum for tiden). Er du enig i det?

Takk for en solid kommentar.., jeg liker debatten!</description>
		<content:encoded><![CDATA[<p>Johannes: Jeg vil ikke si at den ene fremgangsmåten er bedre eller dårligere enn den andre. Det virker som om dere har en gjennomtenkt teknikk som fungerer for dere, og det er bra. Men det er en forskjell der, som lar meg påpeke poenget med min fremgangsmåte&#8230;</p>
<p>Hva skjer med din approach om du ikke har en lineær avhengighetstruktur, men har et voksende tre med avhengigheter? La oss si at du skal lage en kontroller som har fire avhengigheter. Og hva om disse igjen har flere avhengigheter? Da vil du ikke få noen feedback på om det du har gjort på toppen er riktig før alle disse avhengighetene er implementert &#8211; og det kan ta lang tid. Jeg foretrekker å gå i små steg med mye tilbakemelding &#8211; jeg tror det bør skalere bedre når kompleksiteten øker.</p>
<p>UPDATE: Jeg har en kommende post hvor jeg demonstrerer TDD i praksis. Håper du leser den, hvor min fremgangsmåte skal komme klart frem.</p>
<p>Du sier at jeg ikke skal sage systemet i to. Jeg vil påstå at det er hele poenget med objektorientering: Splitt opp systemet ditt i små, autonome enheter, som kan sammarbeide om å få jobben gjort. Hver enhet er et lite program som gjør én ting, og gjør den godt. Da føles det helt greit for meg &#8211; ja, jeg vil faktisk si filosofisk riktig &#8211; å utvikle enhetene i vakum, sålenge kravspesifiksjonen til enheten allerede er drevet frem av kodeeksempler/tester.</p>
<p>Enkelte har påpekt et skille mellom det de kaller klassisk TDD (eller State TDD) og \&#8221;mockist TDD\&#8221;. I klassisk TDD sies det at man er opptatt av å verifisere tilstandsendringer, og at man bruker mocks kun der hvor det i praksis er vanskelig eller tungvidt å bruke de faktiske implementasjonene. Mockist TDD fokuserer mer på å teste interaksjonen mellom objekter. For meg betyr det at denen formen er mer opptatt av adferd, som er en god ting. Martin FOwler sier (i Mocks Aren\&#8217;t Stubs) at BDD er et \&#8221;offshoot\&#8221; fra mockist TDD.</p>
<p>Så det virker altså som om du står for en mer klassisk TDD (og da har du muligens flest på din side), mens jeg \&#8221;reklamerer\&#8221; for BDD (gjengen med mest momentum for tiden). Er du enig i det?</p>
<p>Takk for en solid kommentar.., jeg liker debatten!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Johannes Brodwall</title>
		<link>http://blog.kjempekjekt.com/2009/08/25/utenfra-og-inn-programmering/#comment-65167</link>
		<dc:creator>Johannes Brodwall</dc:creator>
		<pubDate>Wed, 26 Aug 2009 20:02:00 +0000</pubDate>
		<guid isPermaLink="false">http://blog.kjempekjekt.com/2009/08/25/utenfra-og-inn-programmering/#comment-65167</guid>
		<description>Jeg tror jeg skal prøve meg på å være uenig i fremgangsmåten, selv om jeg er enig i poenget ditt.

To essensielle punkter:
* Start med brukerhistorien
* Ta ansvar fra topp til tå av arkitekturen - altså: ikke sag systemet i to

Men jeg har aldri likt mocking selv. Jeg bruker en annen innfallsvinkel. Her er eksempel fra dagens kodesesjon:
* Vi skal søke etter kontoer basert på navn og adresse
* Vi lager en test som sier &quot;gitt at x, y og z finnes i basen (dvs: legg x, y og z i en blank in-memory base), når brukere fyller ut navn slik og adresse slik, og brukeren trykker på &#039;søk&#039; knappen, så skal x finnes i tabellen&quot;
* Testen feiler naturligvis voldsomt.
* Vi koder det som skal til på brukergrensesnittet til vi kommer til at vi har skrevet &quot;Repository.find(KontoSpecification.medNavnOgAdresse(...))&quot;
* SÅ SETTER VI DENNE TESTEN TIL IGNORE og starter å jobbe med en test mot repository-nivået
* Tilsvarende med andre deltester

Resultatet er at vi har en system som er koblet samme fra topp til tå, med utgangspunkt i brukerhistorien. Men vi har hatt en test som har feilet (eller vært kommentert ut) i 30-60 minutter! På den andre siden har vi færre indireksjonslag, fordi vi har brukt mindre mocking.

Å kommentere ut toppnivåtesten framfor å mocke den gir altså en fordel i at man unngår mocking. Men det gjør at vi har feilende tester veldig lenge. Hva tror du? Er det en ok innfallsvinkel? Bedre, dårligere?</description>
		<content:encoded><![CDATA[<p>Jeg tror jeg skal prøve meg på å være uenig i fremgangsmåten, selv om jeg er enig i poenget ditt.</p>
<p>To essensielle punkter:<br />
* Start med brukerhistorien<br />
* Ta ansvar fra topp til tå av arkitekturen &#8211; altså: ikke sag systemet i to</p>
<p>Men jeg har aldri likt mocking selv. Jeg bruker en annen innfallsvinkel. Her er eksempel fra dagens kodesesjon:<br />
* Vi skal søke etter kontoer basert på navn og adresse<br />
* Vi lager en test som sier &#8220;gitt at x, y og z finnes i basen (dvs: legg x, y og z i en blank in-memory base), når brukere fyller ut navn slik og adresse slik, og brukeren trykker på &#8216;søk&#8217; knappen, så skal x finnes i tabellen&#8221;<br />
* Testen feiler naturligvis voldsomt.<br />
* Vi koder det som skal til på brukergrensesnittet til vi kommer til at vi har skrevet &#8220;Repository.find(KontoSpecification.medNavnOgAdresse(&#8230;))&#8221;<br />
* SÅ SETTER VI DENNE TESTEN TIL IGNORE og starter å jobbe med en test mot repository-nivået<br />
* Tilsvarende med andre deltester</p>
<p>Resultatet er at vi har en system som er koblet samme fra topp til tå, med utgangspunkt i brukerhistorien. Men vi har hatt en test som har feilet (eller vært kommentert ut) i 30-60 minutter! På den andre siden har vi færre indireksjonslag, fordi vi har brukt mindre mocking.</p>
<p>Å kommentere ut toppnivåtesten framfor å mocke den gir altså en fordel i at man unngår mocking. Men det gjør at vi har feilende tester veldig lenge. Hva tror du? Er det en ok innfallsvinkel? Bedre, dårligere?</p>
]]></content:encoded>
	</item>
</channel>
</rss>

