Testy jednstkwe Staraj się pisać testy jednstkwe, które są małe i dtyczą małeg wycinka funkcjnalnści. Później wiele łatwiej jest zrzumieć taki test. Nadawaj metdm z testem nazwy, które pmagają zrzumieć c dany test pwinien sprawdzić. Klejnść testów jednstkwych w klasie nie pwinna mieć znaczenia. Innymi słwy nie mżemy plegać na tym, że jak pierwszy musi się uruchmić test1 a p nim test2. Testy uruchmine w dwrtnej klejnści także pwinny mieć dkładnie taki sam efekt. Pisz testy jednstkwe tak, żeby nie zależały na Twjej lkalnej knfiguracji. Na przykład test jednstkwy czytający plik z Twjeg dysku z katalgu C:\mój\katalg\dmwy (czy /hme/uzytkwnik) nie jest dbrym rzwiązaniem. Pisz testy jednstkwe niezależne d zewnętrznych systemów. Innymi słwy testuj tylk jednstkę, nic pnadt. Jeśli klasa, którą testujesz ptrzebuje dstępu np. d bazy danych użyj mcka czy stuba d jej zastąpienia w trakcie testów 3. Testuj warunki brzegwe i sytuacje wyjątkwe. Załóżmy, że masz metdę, która przyjmuje tablicę, która musi mieć maksymalnie trzy elementy. Napisz kilka testów: przekazując null zamiast tablicy, przekazujac pustą tablicę, przekazujac tablicę z trzema elementami, przekazując tablicę z czterema elementami. Dzięki takim testm będziesz pewien, jak zachwuje się Twja metda w sytuacjach wyjątkwych. Testwany kd nie pwinien być w tym samym miejscu, w którym są testy. Sprwadza się t d teg, że kd umieszczamy w katalgu np. src, testy natmiast w katalgu test. Oba katalgi pd spdem mają dpwiednią strukturę dzwierciedlającą pakiety. Jest t ważne pnieważ później przy większych prjektach testy nie mieszają się z kdem prgramu. Testy pwinny być szybkie. Przy pierwszych prgramach nie jest t prblemem, jednak przy większych prjektach uruchamianie testów mże być czaschłnne. Uruchamiaj testy jednstkwe mżliwie częst. ten jest pwiązany z punktem pprzednim nie będziesz uruchamiał częst testów, które trwają dług. Jeśli część testów jednstkwych wymaga dkładnie takieg sameg przygtwania należy wydzielić je d sbnej klasy i użyć metd z adntacją @Befre lub @BefreClass.
Narzędzia budwy aplikacji Java Narzędzi budwy Narzędzia budwy (kmpilacji) jest t narzędzie, które autmatyzuje prces prgramwanie prjektu budwlaneg. Budwanie prjektu zazwyczaj zawiera jedn lub więcej z działań: generwanie kdu źródłweg (Jeśli autmatycznie wygenerwany kd jest używany w prjekcie). Generwanie dkumentacji z kdu źródłweg. Kmpilwanie kdu źródłweg. Pakwania skmpilwaneg kdu d plików JAR lub plików ZIP. Instalwanie pakietów kdu na serwerze, w repzytrium lub gdzieś indziej.
Stwrzenie prjektu maven-weg mvn archetype:generate -DgrupId=cm.mycmpany.app -DartifactId=my-app - DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMde=false w Eclipse wystarczy alb new maven prject alb cnfigure cnvert t maven prject alb run as maven (prfile) eclipse:install Struktura prjektu my-app -- pm.xml `-- src -- main `-- java `-- cm `-- mycmpany `-- app `-- App.java `-- test `-- java `-- cm `-- mycmpany
`-- app `-- AppTest.java POM.XML <prject xmlns="http://maven.apache.rg/pom/4.0.0" xmlns:xsi="http://www.w3.rg/2001/xmlschema-instance" xsi:schemalcatin="http://maven.apache.rg/pom/4.0.0 http://maven.apache.rg/xsd/maven-4.0.0.xsd"> <mdelversin>4.0.0</mdelversin> <grupid>cm.mycmpany.app</grupid> <artifactid>my-app</artifactid> <versin>1.0-snapshot</versin> <packaging>jar</packaging> <name>maven Quick Start Archetype</name> <url>http://maven.apache.rg</url> <prperties> <!-- jar versins, fr dependency management --> <versin.seam>2.2.2.final</versin.seam> <versin.drls>5.0.1</versin.drls> <versin.jbss.embedded>beta3.sp9</versin.jbss.embedded> </prperties> <dependencies> <dependency> <grupid>junit</grupid> <artifactid>junit</artifactid> <versin>4.8.2</versin> <scpe>test</scpe> </dependency> </dependencies> </prject> grupid Identyfikuje prjekt wśród innych prjektów. artifactid Nazwa artefaktu (mdułu), versin Numer wersji. SNAPSHOT, jeśli wersja jest jeszcze rzwijana. Para grupid i artifactid pwinna być unikalna Maven wykrzystuje infrmację z pliku pm.xml (Prject Object Mdel) d budwania prjektu. Plik zawiera tag prject, w którym bwiązkw muszą znaleźć się tagi mdelversin wartści 4.0.0 (aktualnie wspierana wersja), grupid, artifactid, versin raz tagi pcjnalne packaging Określa c ma zstać zbudwane, w tym przypadku plik jar. Jeśli twrzymy aplikację webwą będzie t war.
name Nazwa prjektu. url Adres strny prjektu. prperties Miejsce na wartści, których mżemy używać w innych miejscach pliku pm.xml za pmcą ${nazwa_ustawienia}. <name>${prject.grupid} : ${prject.artifactid} : ${prject.versin}</name> dependencies Zależnści, czyli bibliteki których używamy w prjekcie, Zależnści i repzytria t jeden z pdstawwych mechanizmów. Maven wyknuje sprawdzenia zależnści wymagaych przez prjekt. Zależnści t zewnętrzne pliki JAR (bibliteki Java). Jeśli zależnści nie znajdują się w lkalnym repzytrium Maven pbiera je z centralneg repzytrium i umieszcza je w lkalnym repzytrium. Lkalne repzytrium jest t p prstu katalgu na dysku twardym kmputera. Mżna również kreślić adres zdalneg repzytrium na ptrzeby pbierania zależnści. Cykl życia Jest t najważniejsza idea, na której piera się Maven. Definiuje prces budwania i dystrybucji prjektów. Istnieją trzy wbudwane cykle życia: default Odpwiada za zbudwanie (i wdrżenie) prjektu. clean Czyści prjekt, usuwa stare, nieptrzebne pliki.
site Generuje strnę z dkumentacją prjektu. Dmyślny cykl życia w uprszczeniu zawiera fazy: 1. validate Sprawdzenie czy kd jest pprawny i czy prjekt zawiera wszystkie niezbędne infrmacje np. dpwiednie zależnści. Jeśli używamy jakiejś bibliteki, musimy ją zadeklarwać w pliku pm.xml, w innym przypadku ta faza zakńczy się błędem i prces budwania zstanie przerwany. 2. cmpile Pdczas tej fazy kmpilwany jest kd źródłwy prjektu. 3. test Skmpilwany kd jest pddawany testm jednstkwym wykrzystując dłączne bibliteki d testów. 4. package Twrzny jest wynikwy plik, jar/war (lub z wykrzystaniem dpwiednuch pluginw np. ear). 5. integratin-test Spakwany kd pddawany jest testm integracyjnym. Jeśli testy teg wymagają t paczka wdrażana jest na specjalne śrdwisk, umżliwiające uruchmienie testów. 6. verify Sprawdzana jest pprawnść utwrzneg artefaktu. 7. install Artefakt jest instalwany w lkalnym repzytrium. Dzięki temu mżna g wykrzystać g jak zależnść w innym prjekcie. 8. deply Wdrżenie (rzmieszczenie) artefaktu, przykładw na serwer aplikacji, czy d zdalneg repzytrium. Prfile Maven-a (Build Prfiles) Prfile umżliwiają twrzenie prjektu w różnych knfiguracjach. Zamiast twrzenia dwóch sbnych plików POM, mżna p prstu kreślić prfil z knfiguracji i inaczej kmpilwać, budwa i rzmieszczać ten sam prjekt w różnych prfilach (np. rzmieszczanie na serwer prdukcyjny i na serwer testwy UAT) Każdy prfil kmpilacji jest pisany w pm-ie w tagu <prfile>. <prject xmlns="http://maven.apache.rg/pom/4.0.0" xmlns:xsi="http://www.w3.rg/2001/xmlschema-instance" xsi:schemalcatin="http://maven.apache.rg/pom/4.0.0 http://maven.apache.rg/xsd/maven-4.0.0.xsd"> <mdelversin>4.0.0</mdelversin> <grupid>cm.mycmpany.app</grupid> <artifactid>my-app</artifactid> <versin>1.0.0</versin> <prfiles> <prfile>
<id>test</id> <activatin>...</activatin> <build>...</build> <mdules>...</mdules> <repsitries>...</repsitries> <pluginrepsitries>...</pluginrepsitries> <dependencies>...</dependencies> <reprting>...</reprting> <dependencymanagement>...</dependencymanagement> <distributinmanagement>...</distributinmanagement> </prfile> </prfiles> </prject> Prfil pisuje, jakie zmiany pwinny być wprwadzne w pliku POM pdczas wyknywania w ramach teg prfilu. T mże być np. zmiana pliku knfiguracji aplikacji alb adresu serwera. Znaczniki w <prfile> spwdują zastąpienie wartści znaczników tej samej nazwie zdefiniwanych dmyślnie w POM. W znaczniku <prfile> częst występuje znacznik <activatin>. Ten znacznik pisuje warunek wyzwalający dla budwy teg prfilu (np. inna budwa dla innych wersji Javy). Prfil mże być bezpśredni wskazany w pliku settings.xml. lub pprzez parametr - P w wierszu plecenia MVN. W Eclipse w Eclipse w run as maven
Plugin-y (wtyczki) Maven mżna również traktwać jak śrdwisk pluginów w którym każde zadania jest faktycznie wyknane przez wtyczki. Wtyczki Maven są zazwyczaj używane d Twrzenia pliku jar Twrzenia pliku war Twrzenia pliku ear Kmpilacji kdu Testów jednstkwych Twrzenia dkumentacji Twrzenia raprtów Wtyczka zawiera zazwyczaj szereg celów, które mgą być wyknywane przy użyciu następującej składni: mvn [plugin-name]:[gal-name] Na przykład prjekt Java mże zstać skmpilwany z wtyczką kmpilatra, uruchamiając następujące plecenie.mvn cmpiler:cmpile Maven prvided the fllwing tw types f Plugins Wtyczki kmpilacji (budwy) Wywływane pdczas budwania prjektów, płączne ze znacznikiem <build/> w pm.xml. Wtyczki raprtów Wywływane pdczas twrzenia dkumentacji prjektów (faza site), płączne ze znacznikiem <reprting/> w pm.xml. Najppularniejsze wtyczki clean 1 2 Czyści katalg dcelwy p kmpilacji. Usuwa katalg dcelwy. cmpiler
3 4 5 6 7 Kmpiluje kd źródłwy javy surefire uruchamia testy JUNIT, generuje raprty jar Twrzy plik jar dla bieżąceg prjektu war Twrzy plik war dla bieżąceg prjektu javadc Generuje Javadc dla bieżaceg prjektu (na pdstawie kmentarzy w kdzie źródłwym) antrun Uruchamia kd ANT w dwlnej fazie budwy W przykladzie maven-antrun-plugin wyświetla ddatkwy kmunikat <prject xmlns = "http://maven.apache.rg/pom/4.0.0" xmlns:xsi = "http://www.w3.rg/2001/xmlschema-instance" xsi:schemalcatin = "http://maven.apache.rg/pom/4.0.0 http://maven.apache.rg/xsd/maven-4.0.0.xsd"> <mdelversin>4.0.0</mdelversin> <grupid>cm.cmpanyname.prjectgrup</grupid> <artifactid>prject</artifactid> <versin>1.0</versin> <build> <plugins> <plugin> <grupid>rg.apache.maven.plugins</grupid> <artifactid>maven-antrun-plugin</artifactid> <versin>1.1</versin> <executins> <executin> <id>id.clean</id> <phase>clean</phase> <gals> <gal>run</gal> </gals> <cnfiguratin> <tasks> <ech>jestem w fazie czyszczenia</ech> </tasks> </cnfiguratin> </executin> </executins> </plugin> </plugins> </build> </prject> C:\MVN\prject>mvn clean
Efekt: [INFO] Scanning fr prjects... [INFO] ------------------------------------------------------------------ [INFO] Building Unnamed - cm.cmpanyname.prjectgrup:prject:jar:1.0 [INFO] task-segment: [pst-clean] [INFO] ------------------------------------------------------------------ [INFO] [clean:clean {executin: default-clean}] [INFO] [antrun:run {executin: id.clean}] [INFO] Executing tasks [ech] jestem w fazie czyszczenia [INFO] Executed tasks [INFO] ------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------ [INFO] Ttal time: < 1 secnd [INFO] Finished at: Sat Jul 07 13:38:59 IST 2012 [INFO] Final Memry: 4M/44M [INFO] ------------------------------------------------------------------ Filtry zamiast ustawień Deklaracja <grupid>rg.cdehaus.mj</grupid> <artifactid>prperties-maven-plugin</artifactid> <executins> <executin> <cnfiguratin> <files> <file>../src/main/filters/filter-${env}.prperties</file> </files> </cnfiguratin> </executin> </executins> Definicja w pliku prperties
jdk.debug =false client.versin=1.0.98 jdk.ptimize=false jdk.surce =1.8 jdk.target =1.8 app.debug =false app.unpack.mdules=true remte-external-user= Odwłanie: <mdules> <webmdule> <grupid>${prject.grupid}</grupid> <artifactid>seam-netclinic-war</artifactid> <cntextrt>/${app.web.cntext}</cntextrt> <unpack>${app.unpack.mdules}</unpack> </webmdule> Hierarchia Pm-ów <prject xmlns="http://maven.apache.rg/pom/4.0.0" xmlns:xsi="http://www.w3.rg/2001/xmlschema-instance" xsi:schemalcatin="http://maven.apache.rg/pom/4.0.0 http://maven.apache.rg/xsd/maven-4.0.0.xsd"> <mdelversin>4.0.0</mdelversin> <parent> <grupid>rg.cdehaus.mj</grupid> <artifactid>my-parent</artifactid>
<versin>2.0</versin> <relativepath>../my-parent</relativepath> </parent> <artifactid>my-prject</artifactid>... </prject> POM niższy w hierarchii mże zmieniać ustawienia z POM-u nadrzędneg. Wystarczy tylk jeszcze raz zdefiniwać ustawienie. Efektywny POM Mechanizm dziedziczenia POM pwduje mże być trudn się dwiedzieć, jak całkwity (efektywny) plik POM wygląda, gdy wyknuje d Maven. Efektywny plik POM (wynik wszystkich dziedziczeń) nazywa się skutecznym POM lub efektywnym POM. Maven mże pkazać skuteczny POM, za pmcą plecenia mvn help:effective-pm W Eclipse przedstatnia zakładka w widku edytra t efektywny POM Archetypy (szablny) nie mylić z artefaktami (mdułami) 1 2 maven-archetype-archetype Archetyp prsty (sample) maven-archetype-j2ee-simple Archetyp uprszcznej aplikacji J2EE
3 maven-archetype-mj 4 maven-archetype-plugin 5 maven-archetype-plugin-site 6 7 maven-archetype-prtlet Archetyp uprszcznej aplikacji JSR-268 Prtlet. maven-archetype-quickstart 8 maven-archetype-simple 9 10 11 maven-archetype-site Archetyp d budwy dkumentacji maven-archetype-site-simple Archetyp d budwy dkumentacji uprszczny maven-archetype-webapp Archetyp uprszcznej aplikacji Web Eclipse nie widzi artefaktów
<?xml versin="1.0" encding="utf-8" standalne="n"?> <settings xmlns="http://maven.apache.rg/settings/1.1.0" xmlns:xsi="http://www.w3.rg/2001/xmlschema-instance" xsi:schemalcatin="http://maven.apache.rg/settings/1.1.0 http://maven.apache.rg/xsd/settings-1.1.0.xsd"> <prfiles> <prfile> <id>java-net-public</id> <repsitries> <repsitry> <id>java-net-public</id> <name>java Net Public</name> <url>https://maven.java.net/cntent/grups/public/</url> <layut>default</layut> <releases> <enabled>true</enabled>
<updateplicy>never</updateplicy> </releases> <snapshts> <enabled>false</enabled> <updateplicy>never</updateplicy> </snapshts> </repsitry> </repsitries> <pluginrepsitries> <pluginrepsitry> <id>java-net-public</id> <name>java Net Public</name> <url>https://maven.java.net/cntent/grups/public/</url> <layut>default</layut> <releases> <enabled>true</enabled> <updateplicy>never</updateplicy> </releases> <snapshts> <enabled>false</enabled> <updateplicy>never</updateplicy> </snapshts> </pluginrepsitry> </pluginrepsitries> </prfile> <prfile> <id>securecentral</id> <!--Override the repsitry (and pluginrepsitry) "central" frm the Maven Super POM --> <repsitries> <repsitry> <id>central</id> <url>http://rep1.maven.rg/maven2</url> <releases> <enabled>true</enabled> </releases> </repsitry>
</repsitries> <pluginrepsitries> <pluginrepsitry> <id>central</id> <url>http://rep1.maven.rg/maven2</url> <releases> <enabled>true</enabled> </releases> </pluginrepsitry> </pluginrepsitries> </prfile>. </prfiles> <activeprfiles> <activeprfile>java-net-public</activeprfile> <activeprfile>securecentral</activeprfile> </activeprfiles> </settings> Wyszukiwanie ręczne
Zasby zewnętrzne (niezalecane) Zależnść zewnętrzna w Maven jest t bibliteka (w pliku JAR), która nie znajduje się w repzytrium Mavena (lkalnym, centralnym lub zdalnym repzytrium). Mże znajdwać się gdzieś na lkalnym dysku twardym, na przykład w katalgu lib webapp, lub gdzieś indziej. Słw "zewnętrzny" znacza zatem zewnętrznych d systemu repzytrium Maven - nie tylk zewnętrzne d prjektu. Większść zależnści są zewnętrzne d prjektu, ale niewielu jest zewnętrznych d systemu repzytrium (nie znajduje się w repzytrium). Mżna sknfigurwać zależnści zewnętrznych w spsób zbliżny d pniższeg: <dependency> <grupid>mydependency</grupid> <artifactid>mydependency</artifactid> <scpe>system</scpe> <versin>1.0</versin> <systempath>${basedir}\war\web-inf\lib\mydependency.jar</systempath> </dependency>