<?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>AspectWorks Blog &#187; Testování</title>
	<atom:link href="http://www.aspectworks.com/cs/blog/category/testing/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.aspectworks.com/cs/blog</link>
	<description>Blog o softwarovém vývoji</description>
	<lastBuildDate>Fri, 23 Jul 2010 07:02:06 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>JUnit result interceptor</title>
		<link>http://www.aspectworks.com/cs/blog/2010/07/junit-result-interceptor/</link>
		<comments>http://www.aspectworks.com/cs/blog/2010/07/junit-result-interceptor/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 09:18:40 +0000</pubDate>
		<dc:creator>Luboš Račanský</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Testování]]></category>

		<guid isPermaLink="false">http://www.aspectworks.com/cs/blog/?p=648</guid>
		<description><![CDATA[Před nějakou dobou jsme psali o vlastní anotaci @AfterFailure v JUnit testech. Naší motivací byly screenshoty neúspěšných selenium testů. JUnit od verze 4.7 má svoje řešení jménem TestWatchman.
TestWatchman je v podstatě interceptor, který můžete zavěsit na události failed, finished, starting a succeeded. Ukažme si na následujícím příkladě, jak zareagovat na neúspěšný test a zjistit jméno [...]]]></description>
			<content:encoded><![CDATA[<p>Před nějakou dobou jsme psali o vlastní <a href="http://www.aspectworks.com/cs/blog/2010/04/junit-anotace-afterfailure/">anotaci @AfterFailure v JUnit testech</a>. Naší motivací byly screenshoty neúspěšných selenium testů. JUnit od verze 4.7 má svoje řešení jménem <a href="http://kentbeck.github.com/junit/javadoc/latest/org/junit/rules/TestWatchman.html">TestWatchman</a>.<span id="more-648"></span></p>
<p>TestWatchman je v podstatě interceptor, který můžete zavěsit na události <em>failed, finished, starting a succeeded</em>. Ukažme si na následujícím příkladě, jak zareagovat na neúspěšný test a zjistit jméno třídy a název testu. Tento string používáme jako jméno screenshotu v našich selenium testech. Metoda failed se volá jak při assertationFailed tak při výjimce.</p>
<pre class="brush: java;">
import static junit.framework.Assert.fail;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.MethodRule;
import org.junit.rules.TestWatchman;
import org.junit.runners.model.FrameworkMethod;

public class MyTest {

	@Rule
	public MethodRule watchman = new TestWatchman() {
		@Override
		public void failed(Throwable e, FrameworkMethod method) {
			String methodName = MyTest.this.getClass().getSimpleName() + &quot;.&quot; + method.getName();
			System.out.println(methodName + &quot; has failed!&quot;);
		}
	};

	@Test
	public void testFailed() {
		fail();
	}

}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/cs/blog/2010/07/junit-result-interceptor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Generátor rodných čísel</title>
		<link>http://www.aspectworks.com/cs/blog/2010/05/generator-rodnych-cisel/</link>
		<comments>http://www.aspectworks.com/cs/blog/2010/05/generator-rodnych-cisel/#comments</comments>
		<pubDate>Thu, 13 May 2010 08:51:43 +0000</pubDate>
		<dc:creator>Pavel Müller</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Testování]]></category>

		<guid isPermaLink="false">http://www.aspectworks.com/cs/blog/?p=589</guid>
		<description><![CDATA[V poslední době se věnuji automatizovaným Selenium testům jednoho obchodního systému. Při vkládání osob do systému je nutné zadat rodné číslo a systém provádí jeho validaci a sleduje, jestli je v systému unikátní. Abych mohl automatizovat funkčnost zakládání osob, tak jsem se rozhodl, že vytvořím generátor rodných čísel. Není vše ale tak jednoduché, jak by [...]]]></description>
			<content:encoded><![CDATA[<p>V poslední době se věnuji automatizovaným Selenium testům jednoho obchodního systému. Při vkládání osob do systému je nutné zadat rodné číslo a systém provádí jeho validaci a sleduje, jestli je v systému unikátní. Abych mohl automatizovat funkčnost zakládání osob, tak jsem se rozhodl, že vytvořím generátor rodných čísel. Není vše ale tak jednoduché, jak by se mohlo zdát.</p>
<p><span id="more-589"></span>Obvykle každý ví, že rodná čísla se tvoří od roku 1954 ve tvaru <em>yymmdd/xxxx</em> a ta starší mají tvar <em>yymmdd/xxx</em>. Pokud je to žena, přičte se k měsíci 50. Také si každý myslí, že by mělo být rodné číslo dělitelné jedenáci. Ale zde je právě kámen úrazu. Vše je trochu jinak.</p>
<p>Poslední desátá číslice přidávaná od roku 1954 je kontrolní a tvoří se tak, že se vydělí devitimístné číslo jedenácti a zbytek po dělení se použije jako desátá kontrolní číslice. Tím je výsledné desetimístné číslo dělitelné jedenácti. Tedy v případě, že zbytek po dělení nebyl 10. V takovém případě je kontrolní číslice rovna 0, ale tím pádem není celé rodné číslo dělitelné jedenácti. Do roku 1985 bylo přiděleno cca 1000 rodných čísel, která nejsou 				dělitelná 11. Není vyloučeno, že se v minimálním počtu vyskytly i po 				tomto roce.</p>
<p>Navíc od roku 2004 je zavedena možnost v případě, že jsou v nějaký den vyčerpána všechna  platná čtyřčíslí, použít alternativní rodné číslo, u kterého mají muži k  číslu měsíce přičteno 20 a ženy 70. A i rodná čísla před rokem 1954 mohou mít čtyřčíslí, pokud se jednalo o dodatečně přidělená rodná čísla (např. při získání občanství).</p>
<p>Více informací třeba na <a title="Wikipedii" href="http://cs.wikipedia.org/wiki/Rodn%C3%A9_%C4%8D%C3%ADslo">Wikipedii</a> nebo na <a href="http://latrine.dgx.cz/jak-overit-platne-ic-a-rodne-cislo">tomto blogu</a>.</p>
<p>Většina aplikací se spokojí s ověřením dělitelnosti jedenácti. Ale to je evidentně špatně. Ještěže nemám tu smůlu a nemám nestandardní rodné číslo <img src='http://www.aspectworks.com/cs/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Napsal jsem pro účely Selenium testů generátor rodných čísel s několika možnostmi, jak číslo generovat:</p>
<ul>
<li>pro konkrétní datum a pohlaví</li>
<li>pro věkové rozpětí &#8211; vhodné třeba pro generování mladistvých</li>
<li>oficiální rodné číslo &#8211; dle výše popsaných pravidel</li>
<li>běžné rodné číslo &#8211; takové, které čeká většina aplikací &#8211; dělitelnost 11, standarní tvary</li>
<li>speciální rodné číslo &#8211; takové, které není běžné &#8211; vhodné pro test validace</li>
</ul>
<p>Ukázka použití generátoru:</p>
<pre class="brush: java;">

// generates random personal number from 1900 till today
String personalNumber = RcGenerator.generateRc();

// men between 18 and 30
personalNumber = RcGenerator.generateRcForAge(18, 30, Gender.MALE);

// common personal number modulo 11 == 0 which passes most validators
personalNumber = RcGenerator.generateRc(RcType.COMMON);
</pre>
<p>Přiložené třídy můžete volně použít. Budu rád, když najdete chyby nebo generátor vylepšíte, rozšíříte funkčnost a s kódem se zase podělíte.</p>
<p><a rel="attachment wp-att-594" href="http://www.aspectworks.com/cs/blog/2010/05/generator-rodnych-cisel/rcgenerator/"></a><a href="http://www.aspectworks.com/cs/blog/wp-content/uploads/2010/05/RcGenerator.zip">RcGenerator.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/cs/blog/2010/05/generator-rodnych-cisel/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>JUnit anotace @AfterFailure</title>
		<link>http://www.aspectworks.com/cs/blog/2010/04/junit-anotace-afterfailure/</link>
		<comments>http://www.aspectworks.com/cs/blog/2010/04/junit-anotace-afterfailure/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 11:07:42 +0000</pubDate>
		<dc:creator>Luboš Račanský</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Testování]]></category>

		<guid isPermaLink="false">http://www.aspectworks.com/cs/blog/?p=545</guid>
		<description><![CDATA[Na automatické testování GUI našeho produktu Orinoco používáme framework Selenium. Pro identifikaci a opravu chyby je často klíčové vědět, co uživatel(respektive selenium test) v okamžiku chyby viděl. Selenium umí uložit snímek obrazovky, ale jak definovat okamžik, kdy ho má vytvořit? Nechtěli jsme mít přesně definované, které obrazovky má pokaždé ukládat. Naopak jsme  chtěli snímek [...]]]></description>
			<content:encoded><![CDATA[<p>Na automatické testování GUI našeho produktu <a href="http://www.orinoco.cz">Orinoco</a> používáme framework <strong>Selenium</strong>. Pro identifikaci a opravu chyby je často klíčové vědět, co uživatel(respektive selenium test) v okamžiku chyby viděl. Selenium umí uložit snímek obrazovky, ale jak definovat okamžik, kdy ho má vytvořit? Nechtěli jsme mít přesně definované, které obrazovky má pokaždé ukládat. Naopak jsme  chtěli snímek jen v případě, když Selenium test selže. A k tomu právě lze využít vlastní anotaci <em>@AfterFailure</em>.<br />
<span id="more-545"></span><br />
Na začátku byla jasná představa: ukládat snímky obrazovky, pokud Selenium test selže. Zbývalo jen   doplnit metodu <i>Selenium#captureScreenshot(String)</i> na správné místo. Narazil jsem na zajímavý článek <a href="https://dev.youdevise.com/YDBlog/index.php?title=capture_screenshots_of_selenium_browser_&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1">Capture Screenshots of Selenium Failures</a>, který popisuje, jak anotaci @AfterFailure a vlastní Runner naprogramovat.</p>
<p>Pozor na pořadí anotací! Řešení popsané ve zmiňovaném článku volá nejprve metodu anotovanou @After a poté teprve @AfterFailure. To samo o sobě není problém, pokud stejně jako my v metodě anotované @After nevoláte metodu <i>Selenium#stop()</i>, která zavírá prohlížeč. To pak vám je získaný snímek obrazovky k ničemu. Rešení je jednoduché, stačí v runneru jen prohodit volání metod v metodě <i>#withAfters(FrameworkMethod, Object, Statement)</i>.
<pre class="brush: java;">
@Override
protected Statement withAfters(FrameworkMethod method, Object target, Statement statement) {
      statement = withAfterFailures(method, target, statement);
      return super.withAfters(method, target, statement);
}
</pre>
<p>Věřím, že vám snímky v případě selhání Selenium testů ušetří čas při opravování bugů.</p>
<p><em>Edit</em><br />
JUnit od verze 4.7 má svoje <a href="http://www.aspectworks.com/cs/blog/2010/07/junit-result-interceptor/">řešení jménem TestWatchman</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/cs/blog/2010/04/junit-anotace-afterfailure/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Unit testy nad in-memory databází</title>
		<link>http://www.aspectworks.com/cs/blog/2010/03/unit-testy-nad-in-memory-databazi/</link>
		<comments>http://www.aspectworks.com/cs/blog/2010/03/unit-testy-nad-in-memory-databazi/#comments</comments>
		<pubDate>Sun, 21 Mar 2010 13:02:31 +0000</pubDate>
		<dc:creator>Richard Šerý</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Testování]]></category>

		<guid isPermaLink="false">http://www.aspectworks.com/cs/blog/?p=496</guid>
		<description><![CDATA[Použití in-memory databází pro testování je poněkud kontroverzní téma, ale nedělejte rychlé soudy &#8211; Tomáš Piňos na svém blogu naznačuje, za jakých okolností má testování za pomoci in-memory databáze svoje opodstatnění. Nenechte si ujít zajímavý článek &#8220;Unit testy nad in-memory databází&#8220;.
]]></description>
			<content:encoded><![CDATA[<p>Použití in-memory databází pro testování je poněkud kontroverzní téma, ale nedělejte rychlé soudy &#8211; Tomáš Piňos na svém blogu naznačuje, za jakých okolností má testování za pomoci in-memory databáze svoje opodstatnění. Nenechte si ujít zajímavý článek &#8220;<a href="http://tom2ee-cs.blogspot.com/2010/02/unit-testy-nad-in-memory-databazi.html">Unit testy nad in-memory databází</a>&#8220;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/cs/blog/2010/03/unit-testy-nad-in-memory-databazi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testujeme s rozumem (2.) &#8211; Jak z UC získat TC</title>
		<link>http://www.aspectworks.com/cs/blog/2009/11/testujeme-s-rozumem-2-jak-z-uc-ziskat-tc/</link>
		<comments>http://www.aspectworks.com/cs/blog/2009/11/testujeme-s-rozumem-2-jak-z-uc-ziskat-tc/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 10:29:42 +0000</pubDate>
		<dc:creator>Zdeněk Jonáš</dc:creator>
				<category><![CDATA[Testování]]></category>

		<guid isPermaLink="false">http://www.aspectworks.com/cs/blog/?p=362</guid>
		<description><![CDATA[Při přípravě na testování projektu je zapotřebí vytvořit scénáře (postupy), které budou testeři procházet při testování. Scénáře by v optimálním případě měly pokrývat případy užití, pro které je aplikace vyvíjena. Máme-li rozumně zpracovanou analýzu, může být získání těchto scénářů relativně snadné.

Tyto scénáře testů nazýváme „testovanými scénáři“, anglicky test case, zkratkou TC. Co je to TC? [...]]]></description>
			<content:encoded><![CDATA[<p>Při přípravě na testování projektu je zapotřebí vytvořit scénáře (postupy), které budou testeři procházet při testování. Scénáře by v optimálním případě měly pokrývat případy užití, pro které je aplikace vyvíjena. Máme-li rozumně zpracovanou analýzu, může být získání těchto scénářů relativně snadné.<br />
<span id="more-362"></span></p>
<p>Tyto scénáře testů nazýváme „testovanými scénáři“, anglicky test case, zkratkou TC. Co je to TC? Co by měl obsahovat? TC je soubor vstupů, kroků i podmínek a očekávaných výstupů. Ale kde ho vezmeme?</p>
<p>Každá analýza vyvíjeného systému by měla obsahovat případy užití (use cases), dále UC. Tyto scénáře užití lze s výhodou použít pro vytvoření seznamu TC. Jak na to? Ukážeme si na následujícím příkladu.</p>
<div class="example">
<p>Představte si jednoduchý systémový UC na evidenci vydané faktury v nějakém systému. Daný uživatel má právo zadávat faktury pouze do 100 tisíc.</p>
<h4>Basic Flow</h4>
<ul>
<li>1. Uživatel zadá číslo faktury.</li>
<li>2. Systém provede kontrolu čísla faktury.</li>
<li>3. Uživatel vyplní fakturovanou částku.</li>
<li>4. Systém provede kontrolu výše částky.</li>
<li>5. Uživatel vyplní datum splatnosti.</li>
<li>6. Systém provede kontrolu data splatnosti.</li>
<li>7. Systém vytvoří fakturu a podá uživateli zprávu o jejím úspěšném zaevidování.</li>
</ul>
</div>
<p>Nyní máme zpracovaný zcela jednoduchý UC, kde máme základní průchod aplikací. Bohužel svět není jednoduchý a ani náš příklad nemůže být takto jednoduchý. Je zapotřebí se zamyslet a definovat další toky, kterými může tento scénář být přerušen, či pokračovat zcela jinou cestu. Jedná se o tzv. Alternate flows.</p>
<div class="example">
<h4>Alternate flow 1</h4>
<p class="noBottom">Faktura v systému již existuje, nelze přidat.</p>
<ul>
<li>Basic Flow v bodě 2. Systém podá uživateli zprávu o existenci faktury tohoto čísla a UC se tímto ukončí (faktura se nevytvoří).</li>
</ul>
<h4>Alternate flow 2</h4>
<p class="noBottom">Co když částka na faktuře přesáhne hodnotu 100 tis Kč?</p>
<ul>
<li>Basic Flow v bodě 4. Systém podá uživateli zprávu o převýšení maximální hodnoty faktury a UC se tímto ukončí (faktura se nevytvoří).</li>
</ul>
<h4>Alternate flow 3</h4>
<p class="noBottom">Co když zadáme datum splatnosti v minulosti?</p>
<ul>
<li>Basic Flow v bodě 6. Systém podá uživateli zprávu o špatné hodnotě data splatnosti a UC se tímto ukončí (faktura se nevytvoří).</li>
</ul>
</div>
<p>Nyní si sepíšeme do tabulky pod sebe všechny možné scénáře, a pojmenujeme si je. Pojmenování volte rozumně, neboť by se mělo používat skrze celé testování.</p>
<div class="example">
<h3>Sestavení a pojmenování scénářů</h3>
<table border="0">
<tbody>
<tr>
<th>Scénář 1 – založení faktury</th>
<td>Basic Flow</td>
<td></td>
</tr>
<tr>
<th>Scénář 2 – faktura tohoto čísla již v systému existuje</th>
<td>Basic Flow</td>
<td>Alternate flow 1</td>
</tr>
<tr>
<th>Scénář 3 – částka vyšší než 100 tisíc</th>
<td>Basic Flow</td>
<td>Alternate flow 2</td>
</tr>
<tr>
<th>Scénář 4 – datum splatnosti v minulosti</th>
<td>Basic Flow</td>
<td>Alternate flow 3</td>
</tr>
</tbody>
</table>
</div>
<p>Teď již máme identifikovány hlavní scénáře, které budeme potřebovat otestovat. Pro vlastní testování však toto ještě nestačí. Musíme definovat vstupy a očekávané výstupy jednotlivých TC. Vstupy lze identifikovat dle rozhodovacích bloků v UC. Každé alternative flow by mělo být způsobeno nějakou příčinou, vstupem. V našem případě máme situaci poněkud zjednodušenou. V reálných systémech jsou i desítky vstupů. Zde lze s výhodou použít excel, či vhodný TC management nástroj.</p>
<p>V našem případě dochází k startu alternate flow 3 v scénáři č.4: Datum splatnosti v minulosti.<br />
Je tedy evidentní, že v tomto scénáři se rozhodne o provedení alternativního scénáře v bodě 6. Tudíž je zapotřebí zadat číslo faktury, částku a datum splatnosti. Číslo faktury a částka je validní a datum splatnosti je neplatné (Invalid). Další vstupy jsou již pro tento scénář irelevantní a v tabulce se neobjeví.</p>
<p>Nyní vyplňme tabulku. „V“ představuje potřebný validní vstup a „I“ invalidní vstup. Pokud na vstupech nezáleží nebo jsou irelevantní, zanechte příslušné buňku tabulky prázdnou. Názvy jednotlivých TC volíme ve sloupci TC ID# tak, aby odpovídaly testovanému scénáři. V našem případě jde o evidenci faktury, zvolil jsem tedy zkratku IE (Invoice Evidence). V případě velkých systémů nám toto pojmenování pomůže v orientaci.</p>
<div class="example">
<table border="0">
<tbody>
<tr>
<th>TC ID#</th>
<th>Scénář</th>
<th>číslo faktury</th>
<th>částka</th>
<th>datum splatnosti</th>
<th>Očekávaný výsledek</th>
</tr>
<tr>
<td>IE 1</td>
<td>Scénář 1 – založení faktury</td>
<td>V</td>
<td>V</td>
<td>V</td>
<td>Faktura úspěšně založena</td>
</tr>
<tr>
<td>IE 2</td>
<td>Scénář 2 – faktura tohoto čísla již v systému existuje</td>
<td>I</td>
<td></td>
<td></td>
<td>Faktura nezaložena, uživatel informován.</td>
</tr>
<tr>
<td>IE 3</td>
<td>Scénář 3 – částka vyšší než 100 tisíc</td>
<td>V</td>
<td>I</td>
<td></td>
<td>Faktura nezaložena, uživatel informován.</td>
</tr>
<tr>
<td>IE 4</td>
<td>Scénář 4 – datum splatnosti v minulosti</td>
<td>V</td>
<td>V</td>
<td>I</td>
<td>Faktura nezaložena, uživatel informován.</td>
</tr>
</tbody>
</table>
</div>
<p>Nyní máme tabulku validních a nevalidních vstupů. Víme, na kterých vstupech záleží úspěšnost dané operace. Připravíme si testovací prostředí tak, abychom mohli splnit tyto scénáře. Dost často mají UC tzv. preconditions. Tyto precondititons například říkají, že uživatel, který chce založit jiného uživatele, musí mít administrátorská práva. Musíte tedy do systému před začátkem testovaní založit uživatele s administrátorskými právy.<br />
Na základě takto připraveného testovacího prostředí jste již schopni definovat konkrétní tabulku s konkrétními vstupy.<br />
V našem případě vypadá například takto. Pokud používáte excel, doplňte si tabulku o sloupce precondition a postconditions. Tam definujte, co je zapotřebí udělat před spuštěním testu a zároveň co má tester udělat po ukončení testu. (například po sobě v aplikaci uklidit).</p>
<div class="example">
<table border="0">
<tbody>
<tr>
<th>TC ID#</th>
<th>Scénář</th>
<th>číslo faktury</th>
<th>částka</th>
<th>datum splatnosti</th>
<th>Očekávaný výsledek</th>
</tr>
<tr>
<td>IE 1</td>
<td>Scénář 1 – založení faktury</td>
<td>20</td>
<td>45 000</td>
<td>15.1.2010</td>
<td>Faktura úspěšně založena</td>
</tr>
<tr>
<td>IE 2</td>
<td>Scénář 2 – faktura tohoto čísla již v systému existuje</td>
<td>20</td>
<td></td>
<td></td>
<td>Faktura nezaložena, uživatel informován.</td>
</tr>
<tr>
<td>IE 3</td>
<td>Scénář 3 – částka vyšší než 100 tisíc</td>
<td>21</td>
<td>150 000</td>
<td></td>
<td>Faktura nezaložena, uživatel informován.</td>
</tr>
<tr>
<td>IE 4</td>
<td>Scénář 4 – datum splatnosti v minulosti</td>
<td>22</td>
<td>23 000</td>
<td>11.9.2001</td>
<td>Faktura nezaložena, uživatel informován.</td>
</tr>
</tbody>
</table>
</div>
<p>Dost často na svých školeních se setkávám s názorem, že tento postup je příliš přebyrokratizovaný a prý zdržuje. Praxe ovšem ukazuje, že problémem není vyplnění tabulky, ale neochota některých (test) analytiků se dopředu zamyslet a definovat tyto scénáře a vstupy. Pokud se ovšem nechcete smířit s intuitivním testováním a postoupit například až k objektivnímu měření kvality, zavedení podobných pravidel vás nejspíše nemine.</p>
<p>Pozorný čtenář teď zareaguje: Vždyť v těch TC nemám přeci kroky, jak mám postupovat? Tehdy ale nehledáme artefakt TC ale Test Script. Čili postup, kterým bude tester postupovat při ověřování konkrétního testovaného případu. Test Scripty psát je časově náročné a mnohdy se musí s měnící aplikací znovu přepisovat. Proč je tedy píšeme?</p>
<p>Rozdíl mezi TC a Test Script je v době jejich vzniku a v tom, kdo tyto artefakty vytváří. Zatímco k definici TC dochází na začátku projektu a provádí je test analytik (dosti často i analytik projektu), tak Test Scripty si píší sami testeři.</p>
<p>Oblast okolo názvů, tvorby TC a organizace práce je natolik rozsáhlá, že by vydala na několik článků. Pokud máme menší projekty a sdílené role, potřebujeme relativně malý aparát. Pokud ovšem projekt přerůstá určitou hranici, je zapotřebí zvolit adekvátní metody přístupu k testování.</p>
<p><a href="http://www.aspectworks.com/cs/blog/2009/08/testujme-s-rozumem-serial/">Předchozí díl: Úvod seriálu</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/cs/blog/2009/11/testujeme-s-rozumem-2-jak-z-uc-ziskat-tc/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Jak přesvědčit zákazníka, že potřebuje QA?</title>
		<link>http://www.aspectworks.com/cs/blog/2009/10/jak-presvedcit-zakaznika-ze-potrebuje-qa/</link>
		<comments>http://www.aspectworks.com/cs/blog/2009/10/jak-presvedcit-zakaznika-ze-potrebuje-qa/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 11:34:24 +0000</pubDate>
		<dc:creator>Zdeněk Jonáš</dc:creator>
				<category><![CDATA[Testování]]></category>

		<guid isPermaLink="false">http://www.aspectworks.com/cs/blog/?p=207</guid>
		<description><![CDATA[Dost často jsem v minulosti slyšel od obchodníků: „QA nikdo nechce platit. Jste drazí, nepotřebujeme vás“. Po zkoumání tohoto problému jsem přišel na následující dvě věci:

Obchodník neví jak nabízet QA
Zákazník netuší, proč by QA měl platit, chtít a vyžadovat.

Hledal jsem přirovnání, které by pomohlo odstranit tuto neznalost a vysvětlit člověku neznalému softwarového vývoje, proč je [...]]]></description>
			<content:encoded><![CDATA[<p class="noBottom">Dost často jsem v minulosti slyšel od obchodníků: „<a href="http://en.wikipedia.org/wiki/Quality_assurance" title="Quality Assurance">QA</a> nikdo nechce platit. Jste drazí, nepotřebujeme vás“. Po zkoumání tohoto problému jsem přišel na následující dvě věci:</p>
<ul class="noBottom">
<li>Obchodník neví jak nabízet <acronym title="Quality Assurance">QA</acronym></li>
<li>Zákazník netuší, proč by <acronym title="Quality Assurance">QA</acronym> měl platit, chtít a vyžadovat.</li>
</ul>
<p>Hledal jsem přirovnání, které by pomohlo odstranit tuto neznalost a vysvětlit člověku neznalému softwarového vývoje, proč je <acronym title="Quality Assurance">QA</acronym> nezbytné.<br />
<span id="more-207"></span></p>
<h3>Začínáme</h3>
<p>Potřebuje Vaše firma vyvinout software na míru? Vyberte si spolehlivého dodavatele, neboť výběr kvalitního dodavatele je&nbsp;polovinou úspěchu.<br />
Co prosím? Pouze polovinou? Cožpak dobrý dodavatel nezaručí úspěšnost projektu?<br />
Nezaručí. Abyste skutečně dostali software, jaký potřebujete, bude se i Vaše firma muset naplno zapojit do vývoje – a&nbsp;právě na&nbsp;nezkušenosti zadavatele krachuje značná část softwarových projektů. </p>
<div class="imageRight"><img src="http://www.aspectworks.com/cs/blog/wp-content/uploads/2009/10/house.jpg" alt="Dům" title="Dům" width="350" height="263" class="alignright size-full wp-image-230" /></p>
<div xmlns:cc="http://creativecommons.org/ns#" about="http://www.flickr.com/photos/backkratze/3482233639/"><small><a rel="cc:attributionURL" href="http://www.flickr.com/photos/backkratze/">zdroj: flickr.com</a> / <a rel="license" href="http://creativecommons.org/licenses/by/2.0/">CC BY 2.0</a></small></div>
</div>
<h3>Vývoj softwaru jako stavba domu</h3>
<p>Vývoj softwaru na míru se dosti podobá stavbě domu, hlavně v tom, neboť jak stavba domu, tak i vývoj softwaru Vás nakonec může stát daleko více, než jste původně čekali. Pro omezení tohoto rizika je zapotřebí se pečlivě připravit, nepodcenit plánování, najmout dobrého architekta a na samotnou realizaci najmout stavební dozor, který je&nbsp;nezávislý a&nbsp;zajistí dobrou kvalitu stavby. Tohle je stejné ve stavebnictví i při vývoji aplikací. Pouze v&nbsp;IT místo stavebního dozoru nastupuje QA.</p>
<h3>Jak budete stavět? (zajištění prostředků)</h3>
<p>Dnes si již málokdo postaví dům svépomocí. Splnit všechny normy a požadavky je příliš složité, než aby to běžný člověk dokázal sám zvládnout. Najmout ty správné lidi je první podmínkou úspěchu. Ale dokážete to?<br />
Poraďte se s někým, kdo se na trhu vyzná, vyžádejte si reference a zajistěte, aby Váš nezávislý dozor byl opravdu nezávislý. Dejte si pozor na příliš nízké, ale i neobvykle vysoké cenové nabídky. A nezapomeňte na průběžné testování po celou dobu projektu, neboť náklady na odstranění chyby v hotovém softwaru mohou být mnohonásobně vyšší, než když je chyba odhalena v raných stádiích vývoje.</p>
<h3>Co budete stavět? (stanovení cílů)</h3>
<p>Než začneme, je třeba se rozhodnout, co budeme stavět – zda rodinný dům, chatu, garáž nebo činžák. Víte to u Vašeho softwaru? Řeknete-li dodavateli „Potřebuji program na mzdy“, bude z toho asi tak moudrý jako když architektovi řeknete „Chci dům na bydlení“. Ale kolik má mít pater a místností, pro kolik lidí je určen, jakému životnímu stylu má dům vyhovovat, jak má být vybaven? Mnoho otázek je třeba zodpovědět i při vývoji softwaru a je na dodavateli, aby Vám ty správné otázky položil. Ale jak zjistíte, že opravdu nic nezanedbal? Je zřejmé, že již ve fázi plánování budete potřebovat nezávislého poradce, který zajistí, že cíle projektu se opravdu budou shodovat s Vašimi skutečnými potřebami.</p>
<h3>Kde budete stavět? (integrace)</h3>
<p>Při stavbě domu je nesmírně důležité také okolí. Je na Vašem pozemku zavedená voda, elektřina, plyn, je zde telefonní signál? Nebude stát pozemek vedle čističky či dálnice? Jak snadno se Vaše dítě dostane do školy?<br />
I ve Vaší firmě již určitě je nějaké softwarové prostředí, běží tu další aplikace a je téměř jisté, že bude třeba nějak je s&nbsp;novým systémem propojit. Tomuto procesu říkáme integrace a může výrazně zvýšit náklady na realizaci projektu. Abyste se vyvarovali nepříjemných překvapení, je třeba integraci předvídat a zahrnout ji do svých plánů i finančních odhadů.</p>
<h3>Opravdu se staví to co chcete? (testování)</h3>
<p>Jak zjistit, zda se staví přesně to, co chceme? Jste schopni poznat na základě diagramu tříd, zda je vše v pořádku? U&nbsp;stavby to poznáte? Stojí zdi tam kde chci? To zjistíte letmým pohledem. Ale jsou zdi postaveny tak jak mají? Má vrstva malty správnou tloušťku? Je tloušťka zdi dostatečná? Nezkazí zedník práci hned zítra? Tohle jsou věci, které musíme pečlivě kontrolovat v průběhu celé stavby.<br />
I u softwaru musíme provádět kontroly kvality průběžně. Ponechat testování až na dodání produktu může být cestou do pekel. Testování není pouze finální proklikání aplikace, ale důsledná kontrola, ověřování a měření po celou dobu softwarového vývoje. </p>
<h3>Bude dům pořád stejný? (rozvoj)</h3>
<p>Stavba se vydařila, dům stojí a dokonce se v něm dá i bydlet. Ale ouha, místo plánovaného potomka se narodily trojčata a&nbsp;jeden pokoj jim už nestačí. Co s tím? Je možné dům upravit nebo dokonce něco přistavět? Nebo budete potřebovat jiný dům?<br />
Stejné problémy řeší i provozovatelé firemních aplikací – firma se rozrůstá a stávající software přestává stačit. V platnost vstupují nové směrnice a zákony a aplikace se jim musí přizpůsobit. Úpravy jsou nezbytné, ale nerozbije zdánlivě drobná změna celý systém?<br />
Pokud dodavatel při vývoji nedodržel správné postupy a neodevzdal kvalitní práci, může i malá změna vést k nutnosti přepracovat velké části softwaru. To může vést k neadekvátním nákladům, oprava může trvat neúměrně dlouho a můžete se dokonce stát „rukojmím“ nesolidního dodavatele, který těží z toho, že jediný rozumí Vašemu systému, a tudíž je nenahraditelný.<br />
Co s tím?<br />
Opět doporučujeme si najmout tzv. „stavební dozor“ a dopředu zhodnotit návrh systému. Mezi firmami dodávajícími software totiž existuje spousta garážových firem, které se naoko tváří jako profesionální. Ovšem kvalita jejich práce bývá mizerná a tyto firmy přežívají právě díky tomu, že se staly nenahraditelnými pro své odběratele, neboť jejich aplikacích a řešením nemá šanci nikdo jiný rozumět. V době realizace je tedy vhodné kontrolovat architekturu aplikace a zároveň dohlížet na použité technologie, kvalitu kódu i kvalitu architektury. Pouze kvalitní produkt je dále udržovatelný bez výrazného nárůstu investic.</p>
<h3>Proč zrovna stavebnictví</h3>
<p>Proč jsem si zvolil zrovna tento příklad? Většina lidí, co má pravomoc rozhodnout povětšinou staví, nebo již má postaveno. Budete-li se s nimi bavit, jsou Vám schopni odvykládat kompletní několikahodinové historky o zkušenostech se stavbou svého domu. Lze tedy využít jejich zkušenosti v náš prospěch.<br />
Máte podobnou zkušenost i vy? Museli jste někdy obhajovat testování jako takové v projektu? Napište nám svoje zkušenosti.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/cs/blog/2009/10/jak-presvedcit-zakaznika-ze-potrebuje-qa/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Testujme s rozumem: Seriál</title>
		<link>http://www.aspectworks.com/cs/blog/2009/08/testujme-s-rozumem-serial/</link>
		<comments>http://www.aspectworks.com/cs/blog/2009/08/testujme-s-rozumem-serial/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 14:46:23 +0000</pubDate>
		<dc:creator>Zdeněk Jonáš</dc:creator>
				<category><![CDATA[Testování]]></category>

		<guid isPermaLink="false">http://www.aspectworks.com/cs/blog/?p=87</guid>
		<description><![CDATA[Jak rozumně začít testovat malý nebo středně velký softwarový projekt? Jako specialista na oblast testování a kvality se čas od času dostanu do rozjetého projektu, kde mám pomoci při testování aplikací. Povětšinou se nejedná bohužel o výpomoc, ale o záchranu projektu. Proč k tomu dochází?

Málokdy jsem se setkal s rozumnou přípravou práce pro testery. Povětšinou neexistovaly ani [...]]]></description>
			<content:encoded><![CDATA[<p>Jak rozumně začít testovat malý nebo středně velký softwarový projekt? Jako specialista na oblast testování a kvality se čas od času dostanu do rozjetého projektu, kde mám pomoci při testování aplikací. Povětšinou se nejedná bohužel o výpomoc, ale o záchranu projektu. Proč k tomu dochází?<br />
<span id="more-87"></span></p>
<p>Málokdy jsem se setkal s rozumnou přípravou práce pro testery. Povětšinou neexistovaly ani definované cíle testování, natož popsané jednotlivé testované případy apod. Ale ve většině případů testeři netestovali to, co bylo skutečně zapotřebí.</p>
<p>Pokud začínáte projekt a potřebujete začít nějakým rozumným způsobem řídit testování a aktivity testerů, právě pro vás je určena tato série článků. Provede vás postupně celým procesem testování.</p>
<h3>Jak začít?</h3>
<p>Máme projekt, vyhranou zakázku nebo prostě potřebujeme začít testovat. Jak začít? Co dát testerům?</p>
<h3>Potřebujete klíčové vlastnosti</h3>
<p>Začněte tím, že si definujte (pokud ještě nemáte) podmínky úspěchu. Odpovězte si na otázku: Co musí software (produkt) splňovat, aby byl úspěšný? Co musí umět?</p>
<div class="example">
<h4>Příklad:</h4>
<p>Představme si implementaci systému správy výpůjček do knihovny. Co náš systém musí splňovat?</p>
<ul>
<li>Systém umožní vyhledat konkrétního klienta knihovny.</li>
<li>Systém umožní vyhledat konkrétní knihu k vypůjčení.</li>
<li>Systém umožní zobrazit historii výpůjček daného klienta.</li>
<li>Systém poskytne statistiku o vypůjčovaných knihách.</li>
</ul>
</div>
<h3>Co se může stát</h3>
<p>Nyní si projděte seznam těchto klíčových vlastností a definujte, co všechno se může zkazit, přerušit, přestat fungovat a tím ohrozit splnění požadavků na produkt. Jinými slovy, identifikujte produktová rizika.</p>
<div class="example">
<h4>Příklad:</h4>
<p>Co se může přihodit v našem knihovním systému?</p>
<ul>
<li></li>
<li>Seznam uživatelů nemusí být dostupný.</li>
<li>Seznam knih nemusí být dostupný.</li>
<li>Systém neuloží výpůjčku, knihy nepůjde půjčit.</li>
<li>Systém neuloží vrácení knihy, uživatelé budou následně pokutováni.</li>
</ul>
</div>
<h3>Ohodnoťte rizika</h3>
<table class="dateTable" style="float:right;margin-left:20px">
<tbody>
<tr>
<th colspan="2">Dopad:</th>
</tr>
<tr>
<td>Jednotky uživatelů</td>
<td>1</td>
</tr>
<tr>
<td>Skupiny uživatelů</td>
<td>2</td>
</tr>
<tr>
<td>Všichni  uživatelé</td>
<td>3</td>
</tr>
</tbody>
</table>
<table class="dateTable" style="float:right;margin-left:20px">
<tbody>
<tr>
<th colspan="2">Pravděpodobnost:</th>
</tr>
<tr>
<td>Pravděpodobně nenastane</td>
<td>1</td>
</tr>
<tr>
<td>Může nastat</td>
<td>2</td>
</tr>
<tr>
<td>Velmi pravděpodobně nastane</td>
<td>3</td>
</tr>
</tbody>
</table>
<p>Nyní provedeme kvalifikaci rizik. Není to nic těžkého.  Pouze ohodnotíme, jak jsou daná rizika pro nás podstatná. Jinými slovy, jak moc si jich musíme všímat. Ohodnotíme si rizika například od 1 do 3, a to dle dopadu a pravděpodobnosti výskytu. S tím, že 1 bude nejméně vážný stav a 3 nejhorší možnost.</p>
<p>Můžete si zvolit svoje rozsahy a zvolit dokonce vlastní typ rizika. Například místo dopadu, můžete v určitých aplikacích kalkulovat s finanční ztrátou.</p>
<div class="example">
<h4>Příklad:</h4>
<table class="dateTable">
<thead>
<tr>
<th>Riziko</th>
<th>Dopad</th>
<th>Pravděpodobnost</th>
</tr>
</thead>
<tbody>
<tr>
<td>Systém uživatelů nemusí být dostupný.</td>
<td>3</td>
<td>1</td>
</tr>
<tr>
<td>Seznam knih nemusí být dostupný.</td>
<td>2</td>
<td>1</td>
</tr>
<tr>
<td>Systém neuloží výpůjčku, knihy nepůjde půjčit.</td>
<td>3</td>
<td>2</td>
</tr>
<tr>
<td>Systém neuloží vrácení knihy, uživatelé budou následně pokutováni</td>
<td>3</td>
<td>3</td>
</tr>
</tbody>
</table>
</div>
<h3>Definujte si tabulku závažností</h3>
<p>Zde doporučuji použít metodu <a href="http://en.wikipedia.org/wiki/MoSCoW_Method">MoSCoW</a>. Metoda dělí jednotlivá rizika na Must test, Should test, Could test a Won’t test. </p>
<p>Hodnoty v tabulce jsou součinem jednotlivých vah vynesených na jednotlivých osách tabulky.</p>
<p class="equation">Závažnost = Dopad * Pravděpodobnost</p>
<p>Bodové hodnocení je čistě na vás. Zde pro názornost jsme je zvolili následovně:</p>
<div class="example">
<h4>Příklad:</h4>
<table class="dateTable" style="float:right;margin-left:20px">
<tbody>
<tr>
<th rowspan="2" colspan="2">&nbsp;</th>
<th colspan="3">Pravděpodobnost</th>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<th rowspan="3">Dopad</th>
<td>1</td>
<td class="green">1</td>
<td class="blue">2</td>
<td class="blue">3</td>
</tr>
<tr>
<td>2</td>
<td class="blue">2</td>
<td class="yellow">4</td>
<td class="red">6</td>
</tr>
<tr>
<td>3</td>
<td class="blue">3</td>
<td class="red">6</td>
<td class="red">9</td>
</tr>
</tbody>
</table>
<table class="dateTable">
<thead>
<tr>
<th>Závažnost</th>
<th>Zvolená kategorie</th>
</tr>
</thead>
<tbody>
<tr>
<td class="green">1</td>
<td>Won&#8217;t test (nemusíme testovat)</td>
</tr>
<tr>
<td class="blue">2-3</td>
<td>Could test (můžeme testovat)</td>
</tr>
<tr>
<td class="yellow">4-5</td>
<td>Should test (měli bychom testovat)</td>
</tr>
<tr>
<td class="red">6-9</td>
<td>Must test (musíme testovat)</td>
</tr>
</tbody>
</table>
</div>
<h3>K čemu to bylo dobré</h3>
<p>Nyní máme identifikovaná produktová rizika projektu, máme definovanou jejich závažnost a víme, které jsou pro nás z hlediska úspěšnosti projektu důležité a kterým je zapotřebí věnovat nejvíce síly a energie. Můžeme rovněž prohlásit, že ověření těchto rizik jsou naše cíle testování (Test target).</p>
<div class="example">
<h4>Příklad:</h4>
<table class="dateTable">
<thead>
<tr>
<th>Riziko</th>
<th>Závažnost</th>
<th>Kategorie</th>
</tr>
</thead>
<tbody>
<tr>
<td>Systém uživatelů nemusí být dostupný.</td>
<td>3</td>
<td>Should test</td>
</tr>
<tr>
<td>Seznam knih nemusí být dostupný.</td>
<td>2</td>
<td>Could test</td>
</tr>
<tr>
<td>Systém neuloží výpůjčku, knihy nepůjde půjčit.</td>
<td>6</td>
<td>Must test</td>
</tr>
<tr>
<td>Systém neuloží vrácení knihy, uživatelé budou následně pokutováni.</td>
<td>9</td>
<td>Must test</td>
</tr>
</tbody>
</table>
</div>
<h3>Co dále</h3>
<p>Pokud máte k dispozici test analytika, ten by měl být schopen s tímto vstupem efektivně pracovat. Pokud ho nemáte a není k dispozici  senior tester, musíme ještě naši práci doplnit testovanými scénáři (test cases).<br />
Získání „Test case“ z „Use case“ a další metody získávání potřebných scénářů pro testování budou náplní <a href="http://www.aspectworks.com/cs/blog/2009/11/testujeme-s-rozumem-2-jak-z-uc-ziskat-tc">dalšího článku v tomto seriálu</a>.</p>
<p><a href="http://www.aspectworks.com/cs/blog/2009/11/testujeme-s-rozumem-2-jak-z-uc-ziskat-tc">Následující díl: Jak z UC získat TC</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/cs/blog/2009/08/testujme-s-rozumem-serial/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>LogDigger &#8211; server logy v browseru</title>
		<link>http://www.aspectworks.com/cs/blog/2009/08/logdigger-server-logy-v-browseru/</link>
		<comments>http://www.aspectworks.com/cs/blog/2009/08/logdigger-server-logy-v-browseru/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 10:33:43 +0000</pubDate>
		<dc:creator>Pavel Müller</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Testování]]></category>

		<guid isPermaLink="false">http://www.aspectworks.com/cs/blog/?p=27</guid>
		<description><![CDATA[Dnes jsem narazil na jeden plugin do Firefoxe, který umožňuje sledovat Log4J logy přímo v browseru, resp. ve FireBugu. Jmenuje se LogDigger. Přijde mi to jako skvělá věc, hlavně pro testování, kdy není aplikační server na localhostu. Nakonfiguroval jsem tedy LogDigger pro jeden náš aktuální projekt.

Na serveru je konfigurace jednoduchá &#8211; přidá se jeden servlet [...]]]></description>
			<content:encoded><![CDATA[<p>Dnes jsem narazil na jeden plugin do Firefoxe, který umožňuje sledovat Log4J logy přímo v browseru, resp. ve FireBugu. Jmenuje se <a href="http://logdigger.com"><em>LogDigger</em></a>. Přijde mi to jako skvělá věc, hlavně pro testování, kdy není aplikační server na localhostu. Nakonfiguroval jsem tedy LogDigger pro jeden náš aktuální projekt.<br />
<span id="more-27"></span><br />
Na serveru je konfigurace jednoduchá &#8211; přidá se jeden servlet filter:</p>
<pre class="brush: xml;">
&lt;!-- Define LogDigger filter --&gt;
&lt;filter&gt;
    &lt;filter-name&gt;LogDigger Servlet Filter&lt;/filter-name&gt;
    &lt;filter-class&gt;org.logdigger.servlet.filter.LogDiggerServletFilter&lt;/filter-class&gt;
&lt;/filter&gt;

&lt;!-- Define mapping for the LogDigger filter --&gt;
&lt;filter-mapping&gt;
    &lt;filter-name&gt;LogDigger Servlet Filter&lt;/filter-name&gt;
    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;
</pre>
<p>V našem případě jsem do AspectWorks Frameworku přidal wrapper filter tak, aby šel filter konfigurovat ve Springu, ale to je pouze detail. Wrapper si můžete prohlédnout v <a href="http://www.aspectworks.com/cs/blog/wp-content/uploads/2009/08/LogDiggerWrapperFilter.java">příloze</a>.</p>
<p>Do  browseru se potom nainstaluje plugin integrující s FireBugem. Můžete pak sledovat přímo serverové logy vztažené k HTTP požadavku. Lze nastavit i úroveň, takže třeba sledujete jenom ERROR zprávy. Uvidíme, jak se to osvědčí při testech. Předpokládám, že testeři budou moci snadněji poznat, jestli došlo opravdu k chybě, a bude pro ně snazší přikládat logy do bugreportů.</p>
<p><img class="alignnone size-full wp-image-75" title="capture_11232008_alert_context_w460" src="http://www.aspectworks.com/cs/blog/wp-content/uploads/2009/08/capture_11232008_alert_context_w460.png" alt="capture_11232008_alert_context_w460" width="460" height="143" /></p>
<p>LogDigger umožňuje konfigurovat také appender pro Log4J, takže můžete sledovat jen vybrané části aplikace a vynechat například hlášky z použitých knihoven. Atribut <em>allowLogLevelChange</em> povoluje měnit log level i přímo z prohlížeče.</p>
<pre class="brush: bash;">
# appender to customize output to LogDigger Firefox plugin
log4j.appender.logdigger=com.logdigger.connector.log4j.LogDiggerAppender
#log4j.appender.logdigger.allowLogLevelChange=false
</pre>
<p>Do budoucna plánuje LogDigger integrovat i s aplikací JIRA pro snadné vkládání logů do hlášení chyb. Tak uvidíme.</p>
<p><img class="alignnone size-full wp-image-77" title="capture_11202008_fb" src="http://www.aspectworks.com/cs/blog/wp-content/uploads/2009/08/capture_11202008_fb.png" alt="capture_11202008_fb" width="619" height="186" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/cs/blog/2009/08/logdigger-server-logy-v-browseru/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
