Professional Documents
Culture Documents
CI Server Jenkins/Hudson Integration
CI Server Jenkins/Hudson Integration
CI Server Jenkins/Hudson Integration
KurumsalJava.com
zcan Acar Bilgisayar Mhendisi http://www.ozcanacar.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.
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.
1 2
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
Subversion build.xml
Developer
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
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.
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.
Baknz: http://cruisecontrol.sourceforge.net
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:
<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.
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.
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.)
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
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.
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.
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.
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.
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.
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.
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.
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.
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
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
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.
</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.
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
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.
{ 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;
} }
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>