java blog jAbLoK

... řekněte Javě Ja!

/** * @author Tomáš Zvěřina * @date 12.2.2004 v 18:06 */

Testování Server Side

Včera jsem tu nakousnul pratické otázky testování, které bych dnes rád převedl do (na Jabloku oblíbeného) J2EE prostředí.

Dříve nebo později dojde zodpovědný tester k smutnému zjištění, že je pro něj nezbytné, aby testy běžely v prostředí web containeru. Tady se sice dostáváme na tenký led definice toho co je a co už není unit testování, ale pro potřeby tohoto článku budeme tento aspekt zcela ignorovat :-)

Za předpokladu, že nám framework JUnit vyhovuje, měli bychom se poohlédnout po nějaké jeho nadstavbě. Já myslím můžu s klidným svědomím doporučit Cactus (ano, ten ze širokých apačských plání).

Nejdřív bychom si asi měli připravit nějaký Test Case.

import org.apache.cactus.ServletTestCase;
import org.apache.cactus.WebRequest;
import junit.framework.Test;
import junit.framework.TestSuite;

public class CactusTest extends ServletTestCase {

    public CactusTest(String name) {
        super(name);
    }

    public void testSimple() {
        assertTrue(true);
    }

    private String advancedData;

    public void beginAdvanced(WebRequest theRequest) {
        advancedData = "Test";
        theRequest.addParameter("test", "brekeke");
    }

    public void testAdvanced() {
        assertNull(advancedData);
        assertEquals(request.getParameter("test"), "brekeke");
    }

    public static Test suite() {
        return new TestSuite(CactusTest.class);
    }

}

Vidíme, že se stále jedná o starý dobrý JUnit, jenom nám k testu "testAdvanced", přibyla pomocná metoda "beginAdvanced". Tato metoda se odehrává "na klientovi" a zodpovídá za přípravu parametrů, které bychom chtěli na server odeslat. Více lze samozřejmě vyčíst v dokumentaci.

Teď je na čase upravit naší J2EE aplikaci. Do web.xml přidáme Cactus servlet:

<servlet>
    <servlet-name>ServletRedirector</servlet-name>
    <servlet-class>org.apache.cactus.server.ServletTestRedirector</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>ServletRedirector</servlet-name>
    <url-pattern>/ServletRedirector</url-pattern>
</servlet-mapping>

V build.xml rozšíříme volání junit testů o konfiguraci cactusu:

<junit fork="yes" haltonfailure="no">
    <sysproperty key="cactus.config" file="cactus.properties"/>
...
</junit>

A můžeme vesele testovat (opět budeme trochu laškovat s knihovnami a classpath, ale na to jsme zvyklí). Při provádění testů nejprve klient připraví request, pohovoří s Cactus servletem, ten spustí vaši Test Case a vrátí výsledek. Ukázkový test demonstruje, že se část procesu odehrává u klienta, a že funguje předávání parametrů. Což se hodí vědět.

Cactus je poměrně obsáhlý (testování JSP, taglibů, filtrů,..), ale naštěstí má stejně obsáhlou dokumentaci. Bohužel ani prostor blogu ani moje lenost mi nedovoluje rozebrat problematiku do detailů, ale případné dotazy asi rád zodpovím. A pamatujte — kdo testuje, má za tři.

Updated (18.3.2004)

Komu dělá angličtina větší problémy než slovenština může ve studiu Cactusu pokračovat na Intervalu.

/** * @author Tomáš Zvěřina * @date 11.2.2004 v 18:10 */

Testování JUnitem

Roman Pichlík se na svém Dablogu chvályhodně rozepisuje o důležitosti testování. Na můj vkus se ovšem příspěvek málo věnuje praxi, tak alespoň z rychlíku, Pichlíku! :-).

JUnit

Napište si Test Case ...

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

public class JunitTest extends TestCase {

    public JunitTest(String name) {
        super(name);
    }

    public void testSimple() {
        assertTrue(true);
    }

    public static Test suite() {
        return new TestSuite(JunitTest.class);
    }
}

... a v build.xml svého projektu zavolejte testy:

<junit fork="yes" haltonfailure="no">
    <test name="JunitTest" todir="vas/report-dir"/>
    <formatter type="xml" />
    <formatter type="plain" usefile="no"/>
    <classpath refid="classpath-pro-testy"/>
</junit>

<junitreport todir="">
     <fileset dir="vas/report-dir" includes="TEST-*.xml"/>
     <report format="frames" todir="vas/report-dir"/>
</junitreport>

Budete si muset pohrát s ant-optional, stáhnout si jUnit, classpath nastavit a všechen tenhle zábavný "stuff", ale to už rozepisovat nebudu. Až to všechno rozběháte, tak na vás v příslušném adresáři bude čekat úhledný rozframovaný report.

Další postup je jasný. Šup s tím do cronu! Stáhnout z CVS aktuální verzi projektu, pustit testy a vyspamovat vývojáře :-).

K dalšímu studiu doporučuju: