<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">

<channel>
	<title>Refaktor</title>
	
	<link>http://www.refaktor.hu</link>
	<description />
	<lastBuildDate>Sun, 21 Mar 2010 12:21:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
	<copyright>Copyright © Refaktor 2010 </copyright>
	<managingEditor>krisztian@milesz.hu (Refaktor)</managingEditor>
	<webMaster>krisztian@milesz.hu (Refaktor)</webMaster>
	<image>
		<url>http://www.refaktor.hu/wp-content/plugins/podpress/images/powered_by_podpress.jpg</url>
		<title>Refaktor</title>
		<link>http://www.refaktor.hu</link>
		<width>144</width>
		<height>144</height>
	</image>
	<itunes:subtitle />
	<itunes:summary>Just another WordPress weblog</itunes:summary>
	<itunes:keywords />
	<itunes:category text="Society &amp; Culture" />
	<itunes:author>Refaktor</itunes:author>
	<itunes:owner>
		<itunes:name>Refaktor</itunes:name>
		<itunes:email>krisztian@milesz.hu</itunes:email>
	</itunes:owner>
	<itunes:block>no</itunes:block>
	<itunes:explicit>no</itunes:explicit>
	<itunes:image href="http://www.refaktor.hu/wp-content/plugins/podpress/images/powered_by_podpress_large.jpg" />
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Refaktor" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="refaktor" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Paraméterezett tesztek</title>
		<link>http://www.refaktor.hu/2010/03/21/parameterezett-tesztek/</link>
		<comments>http://www.refaktor.hu/2010/03/21/parameterezett-tesztek/#comments</comments>
		<pubDate>Sun, 21 Mar 2010 12:21:45 +0000</pubDate>
		<dc:creator>Krisztian Milesz</dc:creator>
				<category><![CDATA[Praktikák]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[parameterized]]></category>
		<category><![CDATA[tesztelés]]></category>

		<guid isPermaLink="false">http://www.refaktor.hu/?p=10</guid>
		<description><![CDATA[A JUnit4 lehetővé teszi, hogy tesztjeinket paraméterezzük a @Parameterized.Parameters annotáció segítségével. Így az egyes teszt metódusok többször is végrehajtódnak az előzőleg meghatározott paraméterek listáján végighaladva. Példaként nézzük meg a Prime Factors Kata bejegyzésben bemutatott teszteket. A Kata végén kilenc tesztesetet tartalmazott a PrimeFactorsTest osztály: Jól látszik, hogy mind a kilenc teszteset ugyanazt csinálja, csak más-más [...]]]></description>
			<content:encoded><![CDATA[<p>A JUnit4 lehetővé teszi, hogy tesztjeinket paraméterezzük a <code>@Parameterized.Parameters</code> annotáció segítségével. Így az egyes teszt metódusok többször is végrehajtódnak az előzőleg meghatározott paraméterek listáján végighaladva.</p>
<p>Példaként nézzük meg a <a href="http://www.refaktor.hu/2010/03/10/prime-factors-kata/">Prime Factors Kata bejegyzésben</a> bemutatott teszteket. A Kata végén kilenc tesztesetet tartalmazott a <code>PrimeFactorsTest</code> osztály:</p>
<pre class="brush: java; title: ; notranslate">
    @Test
    public void one() throws Exception {
        assertEquals(list(), generate(1));
    }

    @Test
    public void two() throws Exception {
        assertEquals(list(2), generate(2));
    }

    ...

    @Test
    public void nine() throws Exception {
        assertEquals(list(3, 3), generate(9));
    }
</pre>
<p>Jól látszik, hogy mind a kilenc teszteset ugyanazt csinálja, csak más-más értékeket használva. A tesztet paraméterezve mindössze egyetlen tesztmetódusra van szükségünk:</p>
<pre class="brush: java; title: ; notranslate">
@RunWith(Parameterized.class)
public class PrimeFactorsTest {

    private final int number;
    private final List&lt;Integer&gt; expectedPrimes;

    private static List&lt;Integer&gt; list(Integer... integers) {
        return Arrays.asList(integers);
    }

    @Parameters
    public static Collection&lt;Object[]&gt; parameters() {
        return Arrays.asList(new Object[][] {
                { list(), 1 },
                { list(2), 2 },
                { list(3), 3 },
                { list(2, 2), 4 },
                { list(5), 5 },
                { list(2, 3), 6 },
                { list(7), 7 },
                { list(2, 2, 2), 8 },
                { list(3, 3), 9 }
        });
    }

    public PrimeFactorsTest(List&lt;Integer&gt; expectedPrimes, int number) {
        this.expectedPrimes = expectedPrimes;
        this.number = number;
    }

    @Test
    public void primeFactorsOfAnyNumber() throws Exception {
        assertEquals(expectedPrimes, generate(number));
    }
}
</pre>
<p>Ahhoz, hogy paramétereket használhassunk, először is el kell látni a tesztosztályt egy <code>@RunWith(Parameterized.class)</code> annotációval (1. sor). Kell készítenünk egy olyan konstruktort, amelyik megkapja a változó paramétereket (26. sor). Ezután egy statikus metódust kell készítenünk, és a <code>@Parameterized.Parameters</code> annotációval ellátnunk (12. sor). Ez a metódus fogja egy <code>Collection</code> formájában visszaadni a paramétereket. A teszt futtatása során ezeket a paramétereket kapja meg a konstruktor egymás után.</p>
<p>Tehát a tesztet lefuttatva kilencszer fog végrehajtódni a <code>primeFactorsOfAnyNumber()</code> teszteset különböző értékekkel, és ugyanazt az eredményt kapjuk, mint a Prime Factors Kata végére elkészült kilenc tesztesetet tartalmazó teszt lefuttatása esetén.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.refaktor.hu/2010/03/21/parameterezett-tesztek/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kivételek tesztelése JUnit-tal</title>
		<link>http://www.refaktor.hu/2010/03/13/kivetelek-tesztelese-junit-tal/</link>
		<comments>http://www.refaktor.hu/2010/03/13/kivetelek-tesztelese-junit-tal/#comments</comments>
		<pubDate>Sat, 13 Mar 2010 10:08:07 +0000</pubDate>
		<dc:creator>Krisztian Milesz</dc:creator>
				<category><![CDATA[Praktikák]]></category>
		<category><![CDATA[exception]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[tesztelés]]></category>

		<guid isPermaLink="false">http://www.refaktor.hu/?p=9</guid>
		<description><![CDATA[Gyakran van szükségünk arra, hogy tesztjeinkben megbizonyosodjunk arról, hogy egy adott metódus bizonyos körülmények között kivételt dobjon. Az ilyen helyzeteket JUnit3-al általában a következő mintával kezeltük: A fenti teszt akkor fut le sikeresen, ha az ExceptionThrower osztály statikus throwIOException() metódusa egy IOException-t dob, melynek a szövege: &#8220;Message of the exception&#8221;. A JUnit4 megjelenésével a tesztek [...]]]></description>
			<content:encoded><![CDATA[<p>Gyakran van szükségünk arra, hogy tesztjeinkben megbizonyosodjunk arról, hogy egy adott metódus bizonyos körülmények között kivételt dobjon. Az ilyen helyzeteket <strong>JUnit3</strong>-al általában a következő mintával kezeltük:</p>
<pre class="brush: java; title: ; notranslate">
public class ExpectingExceptionsJunit3 extends TestCase {

    public void testExpectedException() throws Exception {
        try {
            ExceptionThrower.throwIOException();
            fail(&quot;Exception was expected!&quot;);
        } catch (IOException e) {
            assertEquals(&quot;Message of the exception&quot;, e.getMessage());
        }
    }
}
</pre>
<p>A fenti teszt akkor fut le sikeresen, ha az <code>ExceptionThrower</code> osztály statikus <code>throwIOException()</code> metódusa egy <code>IOException</code>-t dob, melynek a szövege: <em>&#8220;Message of the exception&#8221;</em>.</p>
<pre class="brush: java; title: ; notranslate">
public class ExceptionThrower {

    public static void throwIOException() throws IOException {
        throw new IOException(&quot;Message of the exception&quot;);
    }

}
</pre>
<p>A <strong>JUnit4</strong> megjelenésével a tesztek annotálhatóvá váltak, és a kivételek tesztelése egyszerűbb lett. A <code>@Test</code> annotáció <code>expected</code> paraméterével megadhatjuk az elvárt kivétel típusát:</p>
<pre class="brush: java; title: ; notranslate">
public class ExpectingExceptionsJunit4 {

    @Test(expected = IOException.class)
    public void expectedException() throws Exception {
        ExceptionThrower.throwIOException();
    }

}
</pre>
<p>Több kollégától is hallottam, hogy ezt a módszert azért nem szeretik használni, mert így csak a kivétel típusát ellenőrizhetjük, a szövegét viszont nem, pedig sokszor arra is szükség van. A <strong>JUnit4 4.7</strong>-es verziójába bekerült <code>Rule</code>-ok használatával ez is könnyen és elegánsan megoldható. Az <code>ExpectedException</code> szabály alkalmazásával a tesztmetóduson belül adhatjuk meg az elvárt kivétel típusát és szövegét.</p>
<pre class="brush: java; title: ; notranslate">
public class ExpectingExceptionsJunit4 {

    @Rule
    public ExpectedException thrown = ExpectedException.none();

    @Test
    public void expectedException() throws Exception {
        thrown.expect(IOException.class);
        thrown.expectMessage(is(&quot;Message of the exception&quot;));

        ExceptionThrower.throwIOException();
    }
}
</pre>
<p>Mint az a fenti példán is látható, létre kell hoznunk egy publikus <code>ExpectedException</code> típusú mezőt <code>@Rule</code> annotációval. Ezután az egyes tesztesetekben beállíthatjuk a várt kivétel típusát, és szövegét. Az <code>expectMessage()</code> metódus paramétere lehet <code>String</code> (ekkor azt ellenőrzi, hogy a kivétel szövege tartalmazza-e a megadott szöveget), vagy <code>Matcher</code> (amivel gyakorlatilag bármit ellenőrizhetünk).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.refaktor.hu/2010/03/13/kivetelek-tesztelese-junit-tal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prime Factors Kata</title>
		<link>http://www.refaktor.hu/2010/03/10/prime-factors-kata/</link>
		<comments>http://www.refaktor.hu/2010/03/10/prime-factors-kata/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 15:07:40 +0000</pubDate>
		<dc:creator>Krisztian Milesz</dc:creator>
				<category><![CDATA[Katák]]></category>
		<category><![CDATA[kata]]></category>
		<category><![CDATA[prime factors]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://www.refaktor.hu/?p=4</guid>
		<description><![CDATA[A kata (型) eredetileg a japán harcművészetek formagyakorlatait jelenti, melyeket mindig ugyanúgy kell végrehajtani. A szoftverfejlesztésben Dave Thomas, a The Pragmatic Programmer társszerzője honosította meg a fogalmat, és a küzdősportokhoz hasonlóan itt is egy olyan rövid gyakorlatot jelent, amit meghatározott lépések szerint célszerű megoldani. A Prime Factors Kata pedig Robert C. Martinnak (a későbbiekben az egyszerűség [...]]]></description>
			<content:encoded><![CDATA[<p>A kata (型) eredetileg a japán harcművészetek formagyakorlatait jelenti, melyeket mindig ugyanúgy kell végrehajtani. A szoftverfejlesztésben <a href="http://codekata.pragprog.com/">Dave Thomas</a>, a <a href="http://en.wikipedia.org/wiki/The_Pragmatic_Programmer">The Pragmatic Programmer</a> társszerzője honosította meg a fogalmat, és a küzdősportokhoz hasonlóan itt is egy olyan rövid gyakorlatot jelent, amit meghatározott lépések szerint célszerű megoldani.</p>
<p>A <a href="http://www.butunclebob.com/ArticleS.UncleBob.ThePrimeFactorsKata">Prime Factors Kata</a> pedig <a href="http://en.wikipedia.org/wiki/Robert_Cecil_Martin">Robert C. Martin</a>nak (a későbbiekben az egyszerűség kedvéért csak Uncle Bob) köszönhető.</p>
<p><strong>A feladat a következő:</strong></p>
<p>írj egy <code>PrimeFactors</code> nevű osztályt, aminek egyetlen statikus metódusa van, a <code>generate()</code>, ami egy egész számot kap paraméterül és visszaad egy prímtényezőket tartalmazó listát.</p>
<p>Az alábbi videó mutatja be a feladat megoldását <a href="http://en.wikipedia.org/wiki/Test-driven_development">Test Driven Development (TDD)</a> módon <a href="http://eclipse.org">Eclipse</a> környezetben (gyorsbillentyűk és egyéb finomságok).</p>
<p><a href="http://www.refaktor.hu/2010/03/10/prime-factors-kata/"><em>Kattints ide a beágyazott videó megtekintéséhez.</em></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.refaktor.hu/2010/03/10/prime-factors-kata/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

