CI Server Jenkins/Hudson Integration

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 27

Continuous Integration Srekli Entegrasyon

KurumsalJava.com
zcan Acar Bilgisayar Mhendisi http://www.ozcanacar.com

zcan Acar - www.KurumsalJava.com

Bu makale zcan Acar tarafndan yazlm olan Extreme Programming isimli kitaptan alntdr. Extreme Programming ve evik Sreler hakknda genel bilgiyi zcan Acar tarafndan KurumsalJava.comda yazlm olan makaleden edinebilirsiniz.

zcan Acar - www.KurumsalJava.com

Giri
Srekli entegrasyon (Continuous Integration = CI) kod zerinde yaplan her deiikliin ardndan, tm sistemin alr durumda olduunu, yaplan deiikliin sistemin baz blmlerinde krlmalara yol amadn tespit etmek iin kullanlan yntemdir. Krlmalar tespit edebilmek iin testlere (JUnit) ihtiya duyulmaktadr. Bu testler, yaplan deiikliin neticesi olarak yeni bir yap (build) hazrlandktan sonra otomatik olarak altrlr. Yaplan deiiklik yeni yapnn bir paras olduu iin, testlerde oluan hatalar, yaplan deiikliin sistemi krd anlamna gelmektedir. Bu durumdan tm programclar haberdar edilerek, hatann bir an nce giderilmesi ve testlerin her zaman olumlu sonu vermesi salanr. Srekli entegrasyon ile programclar tarafndan kod zerinde yaplan almalar neticesinde her zaman alr bir srmn olumas salanm olur. Martin Fowler1 bu konuda yazd makalesinde2 srekli entegrasyonu u ekilde tanmlyor: Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily - leading to multiple integrations per day. Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible. Many teams find that this approach leads to significAntly reduced integration problems and allows a team to develop cohesive software more rapidly. u ekilde tercme edilebilir: Srekli Entegrasyon, programc ekibi tarafndan yaplan deiikliklerin sk aralklarla sisteme entegre edilmesi iin kullanlan yazlm gelitirme yntemidir. Her programc gnde en az bir kere yapt deiiklikleri entegre eder. Bu sayede gn boyunca birden fazla entegrasyon gerekleir. Otomatik srm oluturulmas ve mevcut testler yardm ile entegrasyon kontrol edilir. Birok ekip tarafndan srekli entegrasyon metodu ile entegrasyon sorunlarnn azald tespit edilmitir. Srekli entegrasyon ile bir ekip hzl bir ekilde kendi iinde btn ve alr programlar yazabilmektedirler. evik srelerde srekli entegrasyon nemli bir rol oynamaktadr. Srekli Entegrasyon araclyla proje bnyesinde geri bildirim (feedback) kuvvetlendirilir. Programclar, projenin iinde bulunduu durum hakknda her gn gerekleen entegrasyon sayesinde haberdar olurlar. Olumsuz netice veren bir entegrasyon, program hatalarnn olutuu mesajn verir ve bu programclar iin bir geri bildirimdir. Hata hemen giderilerek, yeniden entegrasyon sreci balatlr. Bu sre proje bitimine kadar geerliliini yitirmez.

Srekli Entegrasyon Nasl alr?


Srekli entegrasyon yntemini uygulayabilmek iin teknik altyapnn oluturulmas gerekmektedir. Bunun iin gerekli aralar:

1 2

Baknz: http://www.martinfowler.com Baknz: http://www.martinfowler.com/articles/continuousIntegration.html

zcan Acar - www.KurumsalJava.com

1. Srekli Entegrasyonu otomatik olarak gerekletiren bir Server, rnein Cruise Control3 2. Versiyon ynetim sistemi, rnein Subversion 4 3. Geri bildirim iin kullanlmak zere bir email serveri 4. Otomatik yaplandrma arac, rnein Ant5 5. JUnit Testleri lk etapta srekli entegrasyonun nasl altna gz atalm.

Email notification

Email Server Developer


commit check

Cruise Control CI Server Developer


commit

Subversion build.xml

Developer

Resim 14.1 Srekli entegrasyon iin gerekli altyap

Srekli entegrasyonu benimsemi bir ekip, aadaki ekilde alr: 1. Her programc sabah mesaiye baladktan sonra Subversion versiyon kontrol sisteminden projenin en son halini alr (update).
3 4 5

Baknz: http://cuisecontrol.sourceforge.net/ Baknz: http://subversion.tigris.org/ Baknz: http://ant.apache.org

zcan Acar - www.KurumsalJava.com

2. Projeyi yaplandrmak (build) iin Ant kullanlr. Programc yapt deiiklikleri kontrol etmek iin kendi bilgisayarnda build.xml yaplandrma skriptini altrr. Olumlu sonu ald taktirde, deiiklikleri versiyon control sistemine gnderir (commit). Olumsuz netice almas durumunda, hatalar giderir ve tekrar build.xml skriptini altrr. Bu ilemi olumlu sonu alana kadar tekrarlar. Entegrasyonu salayabilmek iin yazd kodun alr durumda olmas gerekmektedir. Hibir programc almayan kodu versiyon kontrol sistemine eklemez. 3. Commit ileminden sonra srekli entegrasyonu gerekletiren Cruise Control serveri versiyon kontrol sisteminden en son deiiklikleri alarak, build.xml skriptini altrr. Bu skript ile tm proje yaplandrlr ve testler altrlr. Hata olumas durumunda Cruise Control tm programclara email gndererek, hatay bildirir (feedback). Hata olumamas durumunda, entegrasyon olumlu sonu vermitir ve Cruise Control daha sonra greceimiz gibi yeil k yakarak, durumu dolayl olarak programclara bildirir. 4. Cruise Control versiyon kontrol sistemini belirli aralklarla kontrol etmeye devam eder. Bir deiiklik olduunu tespit ettii zaman otomatik olarak tekrar build.xml skriptini altrarak, tm projeyi yaplandrr ve sonular beyan eder. Bu srete yaplandrma (build) nemli bir rol oynamaktadr. Yaplandrma ilemi esnasnda tm Java snflar derlenir ve testler altrlr. Bu ilem iin Ant gibi otomatik yap (build) oluturma aralarndan faydalanlr. Yaplandrma ilemi esnasnda, kodun kalitesini lmek iin JDepend, PMD, FindBugs, EclEmma ve CheckStyle gibi aralardan faydalanlabilir. Bu ilemler Ant tarafndan otomatik olarak yaplabilecei iin, programc iin ek yk olumamaktadr. Bu aralarn evik srelerde nasl kullanldn detayl olarak bir sonraki blmde inceleyeceiz.

Srekli Entegrasyon ve Geri Bildirim


Srekli entegrasyonun nemli bacaklarndan birisini de geri bildirim (feedback) mekanizmas oluturur. Entegrasyon ve oluan hatalardan haberdar olmayan bir programc iin, srekli entegrasyon ne kadar anlam tayabilir? Bu sorunun cevabn beraber arayalm. Entegrasyon iin tm ekip beraber almak zorundadr, nk entegrasyon birden fazla program parasnn bir araya getirilip, bir btn oluturulmas ilemidir. Bu sre iinde hatalar oluabilir. Entegrasyonun baarl olabilmesi iin oluan hatalarn giderilmesi gerekmektedir. Bu ilem tm hatalar ortadan kaldrlana kadar devam eder. Sonu olarak alan ve entegre edilmi bir sistem oluur. Entegrasyon boyunca oluan hatalar programclar iin bir nevi geri bildirimdir, nk sadece bu sayede sistemin ne durumda olduunu anlayp, hatalar dzeltebilirler. Buradan, baarl bir entegrasyon iin bir geri bildirim mekanizmasna ihtiya duyulduu sonucunu kartabiliriz. Srekli entegrasyon otomatize edilmi bir sretir. Cruise Control gibi srekli entegrasyon iin kullanlan bir ara, email araclyla oluan hatalar ve yap (build) sonularn programclara bildirir. Bu geri dnm sayesinde programclar srekli entegrasyon ileminin hangi safhada olduunu anlayabilirler. Email haricinde baka geri bildirim mekanizmalar kullanlabilir. Aada yer alan resimlerde geri bildirim tamamen grsel bir ekilde salanmtr. Bu ekilde kullanlan aralara Extreme Feedback Device ismi verilmektedir.

zcan Acar - www.KurumsalJava.com

Resim 14.2 Deiik yap statlerini gsteren lambalar 6

Resim 14.3 Yapnn ne durumda olduunu gsteren ara7


6 7

Kaynak: http://www.flickr.com/photos/znachor/255143511 Kaynak: http://www.flickr.com/photos/mchadwick/6373338

zcan Acar - www.KurumsalJava.com

Cruise Control
Cruise Control8 srekli entegrasyon yaplabilecek altyapy ihtiva eden bir aratr. Cruise Control, srekli entegre edilmek istenen projeler iin konfigre edildikten sonra, Subversion gibi bir versiyon kontrol serverinden projeler bnyesinde yaplan deiiklikleri tespit ederek, Ant skriptleri ile projeyi yaplandrr ve tanmlanan testleri altrr. Cruise Control ihtiva ettii pluginler araclyla gereksinimler dorultusunda konfigre edilebilir. Cruise Control email notifikasyonu, Ant ve deiik tipte versiyon kontrol serverlerinin entegrasyonu iin pluginler ihtiva eder. Sunduu web arayz ile projelerin statleri takip edilebilir.

Resim 14.4 Cruise Control web arayz

Cruise Control Kurulumu


Aktel Cruise Control srmn http://cruisecontrol.sourceforge.net/download.html adresinden temin edebilirsiniz. Edindiimiz zip dosyasn herhangi bir dizine ayoruz.

Baknz: http://cruisecontrol.sourceforge.net

zcan Acar - www.KurumsalJava.com

Resim 14.5 Cruise Control dizin yaps Ana Cruise Control dizini iinde work isminde yeni bir dizin oluturuyoruz. Bu dizin projemiz iin gerekli konfigrasyonlar ihtiva edecektir.

Resim 14.6 work dizin yaps work dizini iinde resim 14.6 da yer alan alt dizinleri oluturuyoruz work/artifacts work/checkout work/logs Projeyi yaplandrma ilemi esnasnda oluan her trl kt Cruise Control tarafndan bu dizine yerletirilir. Subversion versiyon kontrol sisteminde bulunan proje bu dizine yklenir (checkout). Yaplandrma esnasnda yaplan ilemleri ihtiva eden raporlar bu dizine yerletirilir.

work dizininde config.xml isminde bir konfigrasyon dosyas oluturmamz gerekiyor. Bu dosyann ierii u ekilde olmaldr:

Kod 14.1 Cruise Control config.xml

zcan Acar - www.KurumsalJava.com

<cruisecontrol> <project name="Shop" buildafterfailed="true"> <bootstrappers> <currentbuildstatusbootstrapper file="logs/Shop/buildstatus.txt"/> </bootstrappers> <modificationset quietperiod="60"> <svn localworkingcopy="checkout/Shop"/> </modificationset> <schedule interval="60"> <ant Antscript="C:\cruisecontrol-bin-2.7.2\apacheAnt-1.7.0\bin\Ant.bat" buildfile="build-Shop.xml" target="build" uselogger="true" usedebug="false"/> </schedule> <log dir="logs/Shop"/> <publishers> <currentbuildstatuspublisher file="logs/Shop/buildstatus.txt"/> <artifactspublisher dir="checkout/Shop/build/junit-report" dest="artifacts/Shop"/> </publishers> </project> </cruisecontrol>

Cruise Control serverini altrmadan nce work/check dizinine Subversion serverinde olan projeyi indirmemiz (checkout) gerekiyor. Bunun iin Subversion Client ile Subversion servere balanarak, Shop projesinin bir kopyasn ediniyoruz. Bu ilemin ardndan work/checkout/Shop dizininde proje bnyesindeki dosyalar yeralr. config.xml dosyasn checkout/Shop dizini kullanacak ekilde konfigre ediyoruz.

zcan Acar - www.KurumsalJava.com

Resim 14.7 TortoiseSVN client ile Shop projesini Subversion serverinden alyoruz (checkout) Cruise Control konfigre ettiimiz projeyi yaplandrmak (build) iin, projenin build.xml Ant skriptinden faydalanr. Proje bnyesindeki deiikliklerin Cruise Control tarafndan kontrol edilebilmesi iin arac bir Ant skript oluturuyoruz. Bunun bir rneini kod 14.2 de grmekteyiz. config.xml bnyesinde <schedule/> tag ile kullandmz build-Shop.xml nce svn (<exec executable=svn>) up (update) komutuyla work/checkouts dizininde bulunan Shop projesini update eder. Daha sonra kontrol Shop/build.xml skriptine devrederek, projenin yaplandrlmasn salar. Kod 14.2 build-Shop.xml <project name="build-Shop" default="build" basedir="checkout/Shop"> <target name="build"> <exec executable="svn"> <arg line="up"/> </exec> <ant antfile="build.xml" target="run-junit"/> </target> </project>

Eer projenin build.xml skripti tarafndan svn update ilemi yaplyorsa, kod 14.2 de yer alan arac skripte ihtiya yoktur. Bu ilemlerin ardnda work dizinine giderek Cruise Control serverini altrabiliriz.

zcan Acar - www.KurumsalJava.com

C:\cruisecontrol-bin-2.7.2\work>C:\cruisecontrol-bin-2.7.2\cruisecontrol.bat Proje iin oluturduumuz config.xml dosyasnn kullanmn salamak iin cruisecontrol.bat programnn work dizini iinden altrlmas gerekmektedir.

Resim 14.8 Cruise Control Dashboard http://localhost:8080/dashboard adresinden Cruise Control serverin arayzne ulaabiliriz. Cruise Control her 60 saniyede bir Subversion serverinde bulunan Shop projesini kontrol edecek ekilde konfigre edildi. Programclar tarafndan yaplan her deiiklik, Cruise Control tarafndan bu zaman diliminde tespit edilir ve proje yeniden yaplandrlr. Resim 14.8 de Cruise Control tarafndan baaryla tamamlanan yaplar sa kolonda yer almaktadr (build. 4, build.3 vs.)

zcan Acar - www.KurumsalJava.com

Email ile Geri Bildirim


Program hatalarndan dolay Cruise Control projeyi yaplandramayabilir. Cruise Control Dashbaord arayz araclyla projenin en son durumunu takip edilebiliriz. Krlan yaplarda programclar daha hzl uyarmak iin Cruise Control programclara uyar emaili gnderecek ekilde konfigre edilebilir.

Kod 14.3 Cruise Control email notifikasyon <email mailhost="localhost" returnaddress="cruise@mydomain.com" buildresultsurl="http://localhost/cc/buildresults/Shop" skipusers="true" spamwhilebroken="true"> <always address="dev1@mydomain.com"/> <always address="dev2@mydomain.com"/> <failure address="failed-builds@mydomain.com"/> </email>

Email notifikasyonu aktive etmek iin kod 14.3 de bulunan satrlar config.xml de bulunan <publishers/> segmentine eklememiz yeterli olacaktr

Firefox CruiseControl Monitor Plugin


https://addons.mozilla.org/en-US/firefox/addon/896 adresinde Firefox iin ilgin bir plugin kefettim. CruiseControl Monitor plugini araclyla bir Cruise Control serverinde olup bitenleri Firefox web taraycsnn sa alt kesindeki panelden takip edebiliriz. Burada bir krmz birde yeil iki lamba bulunmaktadr. Cruise Controldaki projelerin statsne gre krmz yada yeil lamba yanarak, bizi projeler hakknda bilgilendirir. Bylece devaml Cruise Control Dashboard arayzne bakmak zorunda kalmadan, stat panelin zerinden Cruise Control serverini dolayl olarak takip edebiliriz.

zcan Acar - www.KurumsalJava.com

Resim 14.9 Firefox CruiseControl Monitor Plugin

Resim 14.10 Plugin ayarlar

zcan Acar - www.KurumsalJava.com

JUnit Testleri ve Srekli Entegrasyon


Srekli entegrasyon yapabilmek iin, entegre edilen sistem paralarnn test edilebilmesi gerekir. JUnit testleri olmayan bir projenin Cruise Control serveri tarafndan srekli entegre edilmesi bir anlam ifade etmez, nk entegrasyon neticesinin geri bildirim yoktur. Cruise Control sadece snflar derlemekte yetinir ki, bu da aslnda Cruise Control gibi bir aracn kullanm iin yeterli bir argman deildir. Kitabn onuncu blmnde implemente ettiimiz login modl iin JUnit, entegrasyon ve akseptans tarz test snflar oluturmutuk Bu testlerden JUnit tarz olanlar en hzl ekilde koturulabilen testlerdir, nk bu testlerin d dnyaya olan bamllklarn mock nesneler kullanarak simule ettik. JUnit testlerini koturmak iin build.xml bnyesinde run-junit isminde bir hedef (target) tanmlamtk. Bu hedef, tm snflar nce derledikten sonra, tanmladmz test snfn koturur ve test sonularn HTML raporu haline getirir. Birden fazla test snfn koturabilmek iin bir test suite oluturmamz gerekiyor. Bunun bir rnegi kod 14.4 de yer almaktadr. Kod 14.4 AllTests.java JUnit Test Suite
package test.shop.junit; import import import import import test.shop.junit.business.login.LoginManagerImplTest; test.shop.junit.persistence.login.LoginDaoImplTest; test.shop.junit.presentation.login.controller.LoginControllerTest; junit.framework.Test; junit.framework.TestSuite;

public class AllTests { private AllTests () { } public static Test suite() { TestSuite suite = new TestSuite("JUNIT TEST SUITE"); suite.addTestSuite(LoginControllerTest.class); suite.addTestSuite(LoginManagerImplTest.class); suite.addTestSuite(LoginDaoImplTest.class); return suite; }

suite() metodunda deiik test snfn bir araya getirerek, bu testlerin ardarda koturulmalarn salayabiliriz.

zcan Acar - www.KurumsalJava.com

Kod 14.5 build.xml run-junit target


<target name="run-junit" depends="compile"> <junit fork="false" failureproperty="tests.failed" showoutput="true" printsummary="yes" haltonfailure="yes"> <classpath refid="compile.classpath" /> <classpath path="${build.dir.classes}" /> <test name="${junit.testcase.class}" haltonfailure="yes" outfile="build/junit-result"> <formatter type="xml" /> </test> </junit> <fail if="tests.failed"> ******************************************************* ******************************************************* JUnit testlerinde hata olustu. Ltfen kontrol et ******************************************************* ******************************************************* </fail> <junitreport todir="${junit.report.dir}"> <fileset dir="${build.dir}"> <include name="junit-result.xml" /> </fileset> <report format="noframes" todir="${junit.report.dir}" /> </junitreport> </target>

Oluturduumuz test suite snfn Ant build.xml dosyasnda tanmladmz run-junit hedefi bnyesinde ${junit.testcase.class} deikeni araclyla kullanabiliriz. Bu deikeni ant.properties dosyas iinde tanmlyoruz:
#junit junit.testcase.class=test.shop.junit.AllTests junit.report.dir=${base.dir}/build/junit-report

Cruise Control tarafndan bu hedefin kullanlmasn istiyorsak, kod 14.2 de grld gibi <ant antfile="build.xml" target="run-junit"/> build.xml dosyasn ve run-junit hedefini antfile komutu ile tanmlamamz gerekiyor.

zcan Acar - www.KurumsalJava.com

Resim 14.11 Cruise Control Artifacts sayfas Eger run-junit hedefi Cruise Control tarafndan testler krlmadan koturulabilirse, aktel yapnn (build) Artifacts panelinde oluturulan JUnit raporlarna ulaabiliriz.

Resim 14.12 JUnit test raporu zcan Acar - www.KurumsalJava.com

Artifaklar projenin Ant ile yaplandrlmas esnasnda oluan ktlardr. Bunlar html, xml yada baka bir formatta loglar, raporlar yada baka trl yaplandrma sonularn ihtiva eden dosyalar olabilir. Oluan artifaklar Cruise Control Dashboard zerinden eriilebilir hale getirmek iin config.xml (kod 14.1) <publishers/> segmentine aada yeralan <artifactspublisher/> tagn yerletirmemiz gerekiyor.
<artifactspublisher dir="checkout/Shop/build/junit-report" dest="artifacts/Shop"/>

Cruise Control <artifactspublisher/> ile her build ardndan Shop/build/junit-report dizininde bulunan dosyalar (JUnit rapor) Artifacts panelinde (resim 14.11) gsterir.

Entegrasyon Testleri ve Srekli Entegrasyon


Entegrasyon testlerinin koturulmas altyap bamllklarndan dolay JUnit testlerine nazaran daha zaman alcdr. Yap gerei entegrasyon testleri entegrasyonu test ettikleri iin, bu testler entegre edilen komponentlerin alr durumda olmalarn gerekli klar. rnein bilgibankasn test eden bir entegrasyon testi iin, test ncesi bilgibankasnn alr durumda olmas gerekir. Bilgibankas zerinde ilem yapan test, bilgibankas serverine balanma, ilem yapma ve test iin gerekli fikstrn oluturulmas iin JUnit testlerine nazaran daha zaman fazla zaman harcar. Cruise Control bnyesinde entegrasyon testlerinin koturulabilir olmas iin kullanlan Ant skriptinin entegrasyon iin gerekli altyapy oluturabilecek yapda olmas gerekiyor. Onuncu blmde oluturduumuz entegrasyon testleri bir bilgibankasna ve Spring konfigrasyonuna ihtiya duymaktadr. Bu yzden test ncesi bilgibankas serverinin (HSQLDB) alr hale getirilmesi gerekiyor. Entegrasyon testleri iin oluturduumuz bir Ant hedefin (target) nasl yaplandrlmas gerektiini imdi yakndan inceleyelim: Kod 14.6 build.xml run-integration target
<target name="run-integration" depends="compile, hbm2ddl"> <junit fork="false" failureproperty="tests.failed" showoutput="true" printsummary="yes" haltonfailure="yes"> <classpath refid="compile.classpath" /> <classpath path="${build.dir.classes}" /> <test name="${integration.testcase.class}"

zcan Acar - www.KurumsalJava.com

haltonfailure="yes" outfile="build/integration-result"> <formatter type="xml" /> </test> </junit> <fail if="tests.failed"> ******************************************************* ******************************************************* JUnit testlerinde hata olustu. Ltfen kontrol et ******************************************************* ******************************************************* </fail> <junitreport todir="${integration.report.dir}"> <fileset dir="${build.dir}"> <include name="integration-result.xml" /> </fileset> <report format="noframes" todir="${integration.report.dir}" /> </junitreport> <Antcall target="hsqldb-stop"/> </target>

run-integration hedefi yap olarak run-junit hedefi ile hemen hemen ayn. Sadece kullanlan test snf farkl ve bu run-integration hedefinin bamllk listesinde compile hedefi yan sra birde hbm2ddl ismini tayan ikinci bir hedef daha yer almaktadr. Gerekli deikenleri ant.properties dosyasnda tanmladktan sonra, hbm2ddl hedefi nedir, onu inceleyelim.

Kod 14.7 ant.properties


#entegrasyon junit integration.testcase.class=test.shop.integration.AllTests integration.report.dir=${base.dir}/build/integration-report

zcan Acar - www.KurumsalJava.com

Onuncu blmde oluturduumuz entegrasyon testleri bilgibankasnda olmas gereken bir veri bazn gerekli klar. Bu verilerin her test ncesi bilgibankasna yerletirilmesi gerekmektedir. Bu ilem iin DBUniti kullanmtk. Bilgibankasnda olmas gereken verileri dbunitdataset.xml dosyasnda tanmlayarak, DBUnit araclyla test ncesi bilgibanbasna yerletirilmesini saladk. Entegrasyon testlerinin alabilmesi iin bu verilerin test ncesi bilgibankasnda olmas gerekiyor, aksi taktirde testler olumsuz sonu verecektir. Test snflar otomatik olarak her test ncesi DBUnit araclyla gerekli verileri bilgibankasna yklerler. Verilerin bilgibankas tablolarna yklenebilmesi iin, gerekli emalarn (table structure) daha nce bilgibankasnda oluturulmu olmas gerekir. Aksi taktirde gerekli tablolar bulunamad iin veriler bilgibankasna aktarlamaz. Gerekli bilgibankas tablolarn oluturmak iin hbm2ddl hedefini oluturduk.

Kod 14.8 build.xml hbm2ddl


<taskdef name="hibernatetool" classname="org.hibernate.tool.Ant.HibernateToolTask" classpathref="compile.classpath" /> <target name="hbm2ddl" depends="clean, hsqldb-start"> <hibernatetool destdir="${build.dir}"> <classpath> <path location="${base.web.web-inf.classes}" /> </classpath> <annotationconfiguration configurationfile="$ {base.dir}/properties/hibernate.cfg.xml" /> <hbm2ddl drop="true" create="true" export="true" outputfilename="shop.sql" delimiter=";" format="true" /> </hibernatetool> </target>

Bildiiniz gibi login blmnn implementasyonunda Hibernate ORM teknolojisini kullanmtk. yelik bilgilerini Customer isimli bir snfta tuttuk. Kullandmz anotasyonlar araclyla bu snf bir Hibernate managed entity object haline geldi, yani bu snfn nesneleri bilgibankasnn customer isimli tablosunda tutulabilecek zellikte. Customer snfnn bu zelliinden faydalanarak customer tablosunun yapsn HibernateToolTask snf yardmyla otomatik olarak oluturabiliriz. Bu ilemi gerekletirmek iin hbm2ddl isminde yeni bir hedef tanmlyoruz. HibernateToolTask snf hibernate-tools.jar dosyasnda bulunmaktadr. Bu snfn bulunabilmesi iin ad geen Jar dosyasnn lib dizinine eklenmesi gerekiyor. lk olarak hibernatetool isminde <taskdef/> tag ile yeni bir task tanmlyoruz. Ant hibernatetool isimli task tanmad iin <taskdef/> tag ile bu yeni taskn tanmlanmas gerekiyor.

zcan Acar - www.KurumsalJava.com

Akabinde hbm2ddl isminde yeni bir hedef tanmlyoruz. Bu hedef bnyesinde hibernate.cfg.xml dosyasnda bulunan Hibernate ayarlar kullanlarak, derlenen snflar iinde Hibernate anotasyonlarn tayan snflar taranarak, gerekli bilgibankas tablolar oluturulur. Bu ilemin yaplabilmesi iin HSQLDB bilgibankas sisteminin alr durumda olmas gerekir. Bu sebeple depends tagnda clean ve hsqldb-start hedefleri yer almaktadr. Buna gre hbm2ddl hedefi komadan nce clean, akabinde hsqldb-start hedefleri devreye girer. Bylece HSQLDB bilgibankas alr hale getirilir ve hbm2ddl ile gerekli tablo yaps oluturulur.

zcan Acar - www.KurumsalJava.com

Kod 14.9 shop.sql oluturulan ddl skript


drop table customer if exists; create table customer ( id bigint generated by default as identity (start with 1), email varchar(255) not null, password varchar(255) not null, primary key (id)

Tekrar run-integration hedefine gz attmzda, bilgibankas tablolarnn hbm2ddl hedefi araclyla her test ncesi yeniden oluturulduunu grmekteyiz. Entegrasyon testleri ihtiya duyduklar verileri DBUnit ile test ncesi bilgibankasna aktarrlar. Test sona erdikten sonra hsqldb-stop hedefi ile HSQLDB bilgibankasn tekrar deaktive ediyoruz. Bu kadar harika bir otomasyonu siz hangi yntemlerle salayabilirdiniz? evik yntemlerle tanmadan nce byle bir otomasyonun mmkn olabileceinin bile aklmdan gemesi mmkn deildi. Bu yeni yntemlerle alma imkan bulduum iin kendimi mutlu sayyorum

Akseptans Testleri ve Srekli Entegrasyon


Entegrasyon testleri gibi akseptans testlerinde altyap bamllklar vardr. Akseptans testleri alan bir bilgibankas yan sra, Tomcat gibi web aplikasyonun deploy edildii bir Servlet containere ihtiya duyarlar. Onuncu blmde oluturduumuz akseptans testleri iin bir sonraki listede yer alan altyap komponentlerinin alr durumda olmas gerekir: Tomcat Servlet Container HSQLDB bilgibankas Selenium Remote Control serveri Oluturmamz gereken Ant hedefi test ncesi Tomcat, HSQLDB ve Selenium serveri altrmak ve test bitiminde bu komponentleri stop edebilecek zelliklere sahip olmak durumunda. Bunu nasl yapabileceimizi inceleyelim: Kod 14.10 build.xml run-acceptance hedefi
<target name="run-acceptance" depends="compile, dbunit"> <parallel> <Antcall target="start-selenium-server"> </Antcall> <sequential> <echo taskname="waitfor" message="Wait for proxy server launch" /> <waitfor

zcan Acar - www.KurumsalJava.com

maxwait="2" maxwaitunit="minute" checkevery="100"> <http url="http://localhost:4444/selenium-server/driver/?cmd=testComplete" /> </waitfor> </sequential> </parallel> <Antcall target="tomcat-start"/> <junit fork="false" failureproperty="tests.failed" showoutput="true" printsummary="yes" haltonfailure="yes"> <classpath refid="compile.classpath" /> <classpath path="${build.dir.classes}" /> <test name="${acceptance.testcase.class}" haltonfailure="yes" outfile="build/acceptance-result"> <formatter type="xml" /> </test> </junit> <fail if="tests.failed"> ******************************************************* ******************************************************* JUnit testlerinde hata olustu. Ltfen kontrol et ******************************************************* ******************************************************* </fail> <junitreport todir="${acceptance.report.dir}"> <fileset dir="${build.dir}"> <include name="acceptance-result.xml" /> </fileset> <report format="noframes" todir="${acceptance.report.dir}" /> </junitreport> <Antcall target="hsqldb-stop"/> <Antcall target="tomcat-stop"/> <Antcall target="stop-selenium-server"/> </target>

Akseptans testlerini koturmak iin run-acceptance isminde yeni bir hedef tanmlyoruz. Bu hedef bnyesinde kullandmz dier hedefler yledir: dbunit

zcan Acar - www.KurumsalJava.com

tomcat-start tomcat-stop start-selenium-server stop-selenium-server Bu hedeflerin grevlerinin ne olduunu yakndan inceleyelim: Kod 14.11 build.xml dbunit hedefi
<taskdef name="dbunit" classname="org.dbunit.Ant.DbUnitTask" classpath="${base.lib}/dbunit-2.2.jar"/>

<target name="dbunit" depends="hbm2ddl"> <dbunit datatypefactory="org.dbunit.ext.hsqldb.HsqldbDataTypeFactory" driver="org.hsqldb.jdbcDriver" url="jdbc:hsqldb:hsql://localhost:9006/shop" userid="sa" password=""> <classpath> <pathelement location="${base.lib}/hsqldb.jar" /> </classpath> <operation type="INSERT" src="properties/dbunit-dataset.xml" /> </dbunit> </target>

Akseptans testlerinin, entegrasyon testlerinde olduu gibi bilgibankasnda bir veri bazna ihtiyac vardr. Bu verilerin test ncesi DBUnit ile bilgibankasna aktarlmas gerekmektedir. Entegrasyon testleri bu ilemi otomatik olarak setUp() metodunda gerekletirmisti. Lakin akseptans testlerinin byle bir zellii yoktur. Bu yzden akseptans testlerini koturmadan nce, dbunit hedefi ile dbunit-dataset.xml iinde tanmlanm olan verileri bilgibankasna aktaryoruz. dbunit hedefi daha nce tantmz hbm2ddl hedefine bamldr. hbm2dll hedefi bnyesinde HSQLDB serveri aktif edilir ve bilgibankas emas oluturulur.

Kod 14.12 build.xml tomcat-start, tomcat-stop hedefleri


<target name="tomcat-start" depends="tomcat-stop"> <java jar="${tomcat.home}/bin/bootstrap.jar" fork="true" spawn="true"> <jvmarg value="-Dcatalina.home=${tomcat.home}" />

zcan Acar - www.KurumsalJava.com

</java> </target> <target name="tomcat-stop"> <java jar="${tomcat.home}/bin/bootstrap.jar" fork="true" spawn="true"> <jvmarg value="-Dcatalina.home=${tomcat.home}" /> <arg line="stop" /> </java> </target>

Tomcat serveri start, stop edebilmek iin kod 14.11 de yer alan hedefleri tanmlyoruz. Kod 14.13 build.xml start-selenium-server, stop-selenium-server hedefleri
<target name="start-selenium-server"> <java jar="lib/selenium-server.jar" fork="true" spawn="true"> <arg line="-timeout 30" /> </java> </target>

<target name="stop-selenium-server"> <get taskname="selenium-shutdown" src="http://localhost:4444/selenium-server/driver/? cmd=shutDown" dest="result.txt" ignoreerrors="true" /> <echo taskname="selenium-shutdown" message="DGF Errors during shutdown are expected" /> </target>

Akseptans testlerini Selenium APIsi ile gelitirdiimiz iin, Selenium Remote Control serverinin alr durumda olmas gerekmektedir. Selenium RC serverin start ve stop ilemleri iin kod 14.13 de tanmladmz hedefleri kullanyoruz.

zcan Acar - www.KurumsalJava.com

Kod 14.14 Ant run-acceptance console kts Buildfile: C:\workspace\Shop\build.xml clean: [mkdir] Created dir: C:\workspace\Shop\build [mkdir] Created dir: C:\workspace\Shop\build\classes [mkdir] Created dir: C:\workspace\Shop\build\junit-report [mkdir] Created dir: C:\workspace\Shop\build\integration-report [mkdir] Created dir: C:\workspace\Shop\build\acceptance-report copy_properties: [copy] Copying 5 files to C:\workspace\Shop\build\classes compile: [javac] Compiling 10 source files to C:\workspace\Shop\build\classes [javac] Note: C:\workspace\Shop\src\shop\presentation\login\controller\LoginController.java uses unchecked or unsafe operations. [javac] Note: Recompile with -Xlint:unchecked for details. [javac] Compiling 11 source files to C:\workspace\Shop\build\classes hsqldb-start: [java] The args attribute is deprecated. Please use nested arg elements. hbm2ddl: [hibernatetool] drop table customer if exists; [hibernatetool] 18:19:00,343 DEBUG SchemaExport: [hibernatetool] drop table customer if exists; [hibernatetool] [hibernatetool] create table customer ( [hibernatetool] id bigint generated by default as identity (start with 1), [hibernatetool] email varchar(255) not null, [hibernatetool] password varchar(255) not null, [hibernatetool] primary key (id) [hibernatetool] ); [hibernatetool] 18:19:00,343 DEBUG SchemaExport: [hibernatetool] create table customer ( [hibernatetool] id bigint generated by default as identity (start with 1), [hibernatetool] email varchar(255) not null, [hibernatetool] password varchar(255) not null, [hibernatetool] primary key (id) [hibernatetool] ); [hibernatetool] 18:19:00,359 INFO SchemaExport: schema export complete [hibernatetool] 18:19:00,359 DEBUG DriverManagerConnectionProvider: returning connection to pool, pool size: 1 [hibernatetool] 18:19:00,359 INFO DriverManagerConnectionProvider: cleaning up connection pool: jdbc:hsqldb:hsql://localhost:9006/shop dbunit: [dbunit] Executing operation: INSERT [dbunit] on file: C:\workspace\Shop\properties\dbunit-dataset.xml [dbunit] with format: null run-acceptance: [waitfor] Wait for proxy server launch

zcan Acar - www.KurumsalJava.com

start-selenium-server: tomcat-stop: tomcat-start: [junit] Running test.shop.acceptance.AllTests [junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 10,406 sec [junitreport] Processing C:\workspace\Shop\build\acceptance-report\TESTS-TestSuites.xml to C:\workspace\Shop\build\acceptance-report\junit-noframes.html [junitreport] Loading stylesheet jar:file:/C:/_development/eclipse_3_3_1/eclipse/plugins/org.apache.Ant_1.7.0.v200706080 842/lib/Ant-junit.jar!/org/apache/tools/Ant/taskdefs/optional/junit/xsl/junit-noframes.xsl 18:19:14,609 INFO DriverManagerConnectionProvider: cleaning up connection pool: jdbc:hsqldb:hsql://localhost:9006/shop [junitreport] Transform time: 547ms hsqldb-stop: tomcat-stop: stop-selenium-server: [selenium-shutdown] Getting: http://localhost:4444/selenium-server/driver/?cmd=shutDown [selenium-shutdown] To: C:\workspace\Shop\result.txt [selenium-shutdown] DGF Errors during shutdown are expected BUILD SUCCESSFUL Total time: 24 seconds run-acceptance hedefini koturduumuz zaman kod 14.14 de yer alan ekran kts oluacaktr. Bu akseptans testlerinin tamamen otomatize edilmi bir ekilde alt anlamna gelmektedir ki, tam test otomasyonu projelerde takip edilmesi gereken ana amalardan birisi olmaldr. Oluturduumuz tm JUnit, entegrasyon ve akseptans testlerini bir test suite bnyesinde toplamak istersek, kod 14.14 de ki gibi bir test snf oluturabiliriz.

Kod 14.15 AllTests.java test suite of test suites


package test.shop; import junit.framework.Test; import junit.framework.TestSuite; public class AllTests { private AllTests () { } public static Test suite()

zcan Acar - www.KurumsalJava.com

{ TestSuite suite = new TestSuite("ALL TEST SUITE"); suite.addTest(test.shop.junit.AllTests.suite()); suite.addTest(test.shop.integration.AllTests.suite()); suite.addTest(test.shop.acceptance.AllTests.suite()); return suite;

} }

Kod 14.16 build.xml AllTests hedefi


<target name="run-alltets" depends="run-junit, run-integration, run-acceptance"/>

Yeni bir hedef (kod 14.16) oluturarak, srekli entegrasyon srecinde mevcut olan tm testlerin koturulmasn salyabiliriz. Yeni hedefi (run-alltests) Cruise Controla tantmak iin build-Shop.xml dosyasnda deiiklik yapmamz gerekiyor:

Kod 14.17 build-Shop.xml (Cruise Control) <project name="build-Shop" default="build" basedir="checkout/Shop"> <target name="build"> <exec executable="svn"> <arg line="up"/> </exec> <ant antfile="build.xml" target="run-alltests"/> </target> </project>

zcan Acar - www.KurumsalJava.com

You might also like