2011. július 25., hétfő

IBM 48 órás programozó bajnokság - Ne maradj le!

Idén is megrendezésre kerül az IBM 48 órás programozói verseny melynek célja, hogy a hazai felsőoktatásban résztvevő tehetséges hallgatók - csapatmunka keretében - összemérjék Java EE szoftverfejlesztői tudásukat, IBM-es technológiák felhasználásával. A jól teljesítő diákok álláslehetőséggel és értékes nyereményekkel lehetnek gazdagabbak, melyet az IBM Magyarország és partnerei biztosítanak. A versennyel kapcsolatos további információk megtalálhatók hivatalos honlapon.

Mielőtt megosztanék pár hasznos tanácsot a versennyel kapcsolatosan, következzen egy személyes vonatkozású áttekintés a 2007-es és 2009-es IBM 48 versenyről.

Először 2007. novemberében vettem részt az IBM 48 versenyen. Akkoriban kezdtem el ismerkedni a Java Enterprise világgal, az Imre Gábor által tartott Szoftverfejlesztés J2EE platformon választható tárgy keretében. Úgy emlékszem valamelyik óra végén szólt, hogy van ez a jó kis verseny és szívesen venné ha indulnánk rajta. Bár a csapatot (BBS) csak a verseny előtti napokban sikerült összeállítanunk és túl sokat nem is tudtunk rá készülni, különdíjasok lettünk.











A 2009. novemberi versenyre - a már meglévő tapasztalatokra építve - egy hétvégét készültünk, ahol is egy korábbi feladatot oldottunk meg, átnéztük az IBM technológiák használatát és megbeszéltük hogy ki mivel fog foglalkozni. A JBoss Seam keretrendszert választottuk a fejlesztéshez, melynek a WebSphere AS 6.1-el való integrációjáért én voltam a felelős. Bár a bekonfigurálás igénybe vett egy kis időt, végül mindannyian úgy láttuk hogy megérte a JBoss Seam-et választani, ugyanis nagyban felgyorsította a fejlesztés menetét és a további JBoss-os technológiák használatát (JBoss RichFaces, JBoss Rules) is megkönnyítette. A 2009-es csapatommal (SeamTeam) második helyezést értünk el, aminek nagyon örültünk! Az előző bajnoksághoz hasonlóan a verseny és a díjkiosztó is nagyon jó hangulatban telt el, ezúton is köszönet a szervezőknek!











Végül következzenek a beígért tippek, melyeket érdemes megfogadni a csapatoknak:

  • Készítsetek el legalább egy, de inkább két régebbi verseny feladatot, így még a verseny előtt kibuknak a nehézségek és a csapat is jól összeszokik!
  • Ismerjétek meg az IBM-es technológiák alapszintű használatát, mert a versenyen erre biztos nem lesz idő!
  • Olyan webes keretrendszert használjatok, amit már jól ismertek. Nem szerencsés amikor a versenyen derülnek ki a keretrendszer rejtett hibái.
  • A fejlesztéssel párhuzamosan, folyamatosan dokumentáljatok. Nem kell túlzásba vinni, de a fontosabb döntésekhez legyenek ábrák, diagramok és egy pár soros magyarázó szöveg. 
  • Az értékelés során az én meglátásom szerint, fontosabb szempont volt az hogy ki meddig jutott el, mint a kód minősége vagy éppen a felhasznált technológiák sokrétűsége. Továbbá nem javaslom, hogy tesztek készítésével töltsétek az időt, - annak ellenére hogy a csapból is a TDD folyik - mert a feladatot nem fogjátok tudni befejezni.
  • Nem érdemes apróbb dolgokon szöszölni, ha problémába futottatok inkább hagyjátok ki, majd a verseny vége fele vegyétek elő újra.
  • A feladat bemutatása előtt mindenféleképpen klikkeljétek végig a művet, mert elég rosszul néz ki ilyenkor egy nemvárt kivétel.
  • Java EE alapú webalkalmazást készítsetek, AJAX-os keretrendszer felhasználásával, mert a zsűri nem desktop Java alkalmazásokat vár.
  • Használjátok ki, hogy a versenyre bármilyen saját kódot bevihettek. Érdemes előre elkészíteni egy alap projektet ami tartalmaz egy bejelentkeztető oldalt és egy felhasználó management modult, mert ezek szinte minden versenyen előfordulnak!
  • Nem mindig volt előre telepített SCM, így készüljetek arra, hogy lehet nektek kell majd összerakni és beállítani egy CVS vagy SVN szervert.
  • Ha van rá lehetőségetek, vigyetek saját laptopot amin már be vannak állítva a fejlesztéshez szükséges eszközök!
  • A verseny előtti napon aludjátok ki magatokat, de a verseny alatt is legalább 4-5 óra alvást iktassatok be mindkét napon! :)

Remélem hasznos információkat tartalmazott a bejegyzés. Jó versenyzést kívánok mindenkinek!

2011. július 19., kedd

FitNesse, a wiki alapú tesztkeretrendszer

A FitNesse egy acceptance tesztelési keretrendszer, melynek célja hogy a teszteket készítő fejlesztők és a területi szakértők közti szakadékot megszüntesse, azáltal hogy a szakértők számára is elérhetővé teszi a tesztek kezelését és végrehajtását.

Működésileg egy saját web-szerveren futó wiki site, amely strukturált és könnyen olvasható formában teszi elérhetővé a teszteket. A teszteket wikis formázással megadott táblázatok reprezentálják, melyekhez egy-egy Fixture java osztály tartozik. A Fixture osztályok teremtik meg a kapcsolatot a wikis táblázatok és a java tesztkód között. A táblázatok input adatokat és a várt output adatot tartalmazzák, valamint a Fixture kód elérhetőségét. A FitNesse egyszerű felépítése és koncepciói nagyban hozzájárulnak a kiváló használhatóságához, melyek lehetővé teszik széleskörű alkalmazását!

FitNesse telepítése és a menüstruktúra ismertetése

A FitNesse telepítése és indítása nagyon egyszerű! Töltsük le a legfrisebb fitnesse.jar-t a FitNesse hivatalos oldaláról, majd másoljuk be abba a könyvtárba ahova telepíteni szeretnénk, végül adjuk ki a java -jar fitnesse.jar -p 6666 parancsot. Amennyiben a 80-as port már foglalt, a –p opcióval jelölhetünk ki egy szabad portot. A parancs futtatása után létrejön a FitNesseRoot nevű könyvtár a sablon wiki oldalakkal feltöltve, melyet a http://localhost:6666/ címen tekinthetünk meg.


Rövid áttekintés a baloldali menük funkcióiról:
  • Edit: Az aktuális - jobb oldalon megjelenő - wiki oldal tartalmának szerkesztése.
  • Properties: Az aktuális wiki oldal tulajdonságainak szerkesztése.
    • Page Type: Az oldal típusának meghatározása, ami lehet egyszerű wiki oldal, teszt oldal vagy suite oldal.
    • Actions: A baloldalt megjelenő akció funkcionalitású menüelemek meghatározása.
    • Navigation: A baloldalt megjelenő navigációt biztosító menüelemek kiválasztása.
    • Securtiy: Biztonsági megszorítások az aktuális wiki oldalra vonatkozólag.
  • Refactor: Az aktuális wiki oldal törlése, átnevezése vagy új helyre mozgatása.
  • Where Used: Az aktuális wiki oldal más oldalakon történő hivatkozásait mutatja.
  • Search: Kifejezés keresése a wiki oldalakon.
  • Files: A fájlrendszerbeli könyvtárstruktúra áttekintése és böngészése.
  • Versions: Az aktuális wiki oldal módosítás utáni verzióinak megtekintése és visszaállási lehetőség egy korábbi verzióra. (rollback)
  • Recent Changes: A legutóbbi változások teljes wiki struktúrát tekintve.
  • User Guide: Általános ismertető a FitNesse keretrendszerről.
  • Test History: Az elindított tesztek sikerességéről kaphatunk információkat.
  • Suite: A suite oldalak esetén megjelenő menüelem, amivel a suite alatt lévő teszteseteket futtathatjuk a wiki oldalon keresztül.
  • Test: Az adott oldalhoz tartozó teszteset futtatása a wiki oldalról indítva.

FitNesse Suite létrehozása és konfigurálása

Az ExampleTestSuite oldal létrehozásához kattintsunk a cím melletti ”add child” linkre majd adjuk meg az oldal típusát és nevét, végül kattintsunk az add gombra.


Ahhoz hogy a felvett oldalt használni tudjuk válasszuk ki az Edit menüt, majd a megjelenő wiki szerkesztő felületen írjuk be az oldal nevét, esetleg töröljük a számunkra szükségtelen részeket az oldalról.


A mentés után megjelenő oldalon az ExampleTestSuite[?]-re kattintva létrehozhatjuk magát a wiki oldalt. Ha az újonnan létrehozott oldal baloldali menüjében nem jelent volna meg a Suite menüelem, akkor a Properties menü alatt módosítsuk a megfelelőre.


Az ExampleTestSuite oldalon kerül definiálásra a classpath valamint két Fitnesse változó a define kulcsszó megadásával. A classpath sorokkal a szükséges könyvtárak és a Fixture kódot tartalmazó class ill. jar helyét adhatjuk meg, a define kulcsszóval pedig a teszteseteknél is használni kívánt változókat definiálhatjuk. Azáltal, hogy a classpath és a define értékeket az ExampleTestSuite-nál adjuk meg, a hierarchiában alatta lévő suite-okra és tesztekre (pl.: ExampleTest) is tovább öröklődnek, bár az alsóbb szinteken szükség szerint felüldefiniálhatók.



FitNesse teszt létrehozása és futtatása

A következőkben egy egyszerű String összefűzési funkció tesztelését fogom ismertetni a ColumnFixture felhasználásával.

Az ExampleTestSuite véglegesítése után, a suite alá vegyünk fel egy ExampleTest oldalt az ”add child” linkre kattintással úgy hogy az oldal típusa test legyen, majd hozzuk létre a tesztesethez tartozó táblázatot. A táblázat első sorában definiáljuk a Fixture osztályt (MyFitnesseTest), valamint a felhasználni kívánt változókat melyek a Fixture osztályban a getArgs() metódussal érhetők el. A táblázat második sora az oszlop neveket tartalmazza (username, password), melyeket a Fixture osztályban publikus mezőként kell megadni, valamint a tesztmetódust. (testConcatenation). A táblázat további sorai a bemeneti adatokat és a kimenet elvárt eredményeit tartalmazzák, melyek egy-egy teszt lefutásnak felelnek meg.

 


A teszthez tartozó Fixture osztály kódja az alábbi forráskódrészleten látható:
package fitnesse.example;

import fit.ColumnFixture;

public class MyFitnesseTest extends ColumnFixture{

    public String username;
    public String password;
    
    public String testConcatenation(){
        
        System.out.println(username);
        System.out.println(password);
        System.out.println("myVariable1: "+getArgs()[0]);
        System.out.println("myVariable2: "+getArgs()[1]);
        
        return new StringBuilder()
                    .append(username)
                    .append(password)
                    .append(getArgs()[0])
                    .append(getArgs()[1]).toString();
    }
}

Az elkészült tesztet az ExampleTestSuite oldalon látható suite gombra klikkelve vagy az ExampleTest oldal test gombjára kattintva indíthatjuk el, melynek eredményét egyből megtekinthetjük az oldalon.


FitNesse oldalstruktúra kialakítása

A tesztek végrehajtását teszt oldalanként vagy suite-onként van lehetőségünk elindítani. Egy suite, teszteket és további suite-okat tartalmazhat. A wiki oldal struktúrát úgy érdemes kialakítani, hogy készítünk egy gyökér suite oldalt ahova további suite oldalakat veszünk fel, majd az alsóbb szintekre helyezzük a tesztoldalakat. Ez a kialakítás azért hasznos, mert a suite-ok csoportba fogják a teszteket így a tesztek futtatását is ezen csoportok alapján hajthatjuk végre. A suite-os csoportosítás további előnye, hogy a classpath ill. változó deklarációk is öröklődnek a hierarchiában lentebb található suite-okra és tesztekre, így azokat elég csak a felsőbb szinten megadni. Persze egy alsóbb szinten deklarált változó mindig erősebb hatókörrel bír, így névegyezés esetén az alsóbb szintű fog érvényre jutni.


Zárszó

A wiki-s táblázat alapú tesztek az olvashatóságot és a karbantarthatóságot tekintve is előnyösebbek a programozott tesztekkel szemben, igaz a kiegészítő kódok elkészítésére időt kell szánni.

A cikk folytatása hamarosan következik...!