Tdd + Uml. It's easy with Architexa.

Who loved the TDD technique generally think that his test sufficiently documents the code.
"I do it (tests). Do you see these tests. It's easy". They said.
 Then it is not necessary to draw some UML Diagrams.

 Are you sure?

 Instead, I believe that UML diagram add value to Tdd process. I think that UML could be produced during tdd phases.
 We need a powerful tool in order to obtain that.
I think that Architexa has some interesting feature that make it the proper tool in order to join TDD and UML.
 It's more easy to start with blank diagram and step by step, test by test, to reach a final job with code and diagrams.

 I would propose you this example: (First. It enough uses drag and drop method or click something to do all. Architexa is plugin of Ecplise.)  Then, We have a Subscriber of funds which would to do an order.

 Begin with test:


 We'll have class "Subscriber" following the TDD rules:


 then, We can create the first version of Layered Diagram: click on menù: Architexa/Open new Diagram editor/new layered Diagram after We can drag and drop the Subscriber class into the Diagram Window. And we can see:

                  
 After We would have an order: 

 Then we have Order and Product classes: 

 Drag and Drop these classes and We have: 
   
 By Diagram, We select all classes and Right click And choose "Open in Diagram/Class Diagram" on popup menu. After we have a diagram like:
   
 Then, now we must complete the test of Subscriber: After we obtain this: Then, We can add some detail: 
   
 We select Order and right click and choose the item: Open in diagram / Sequence Diagram on popup menu. We can see a new Sequence Diagram. We have this sequence diagram by clicking to "2 member" and to some arrows: 
   
 We are quickly created: 2 tests, 3 classes and 3 UML diagrams. It is unbelievable.

18 steps to avoid Eclipse Security password paranoic

  1. 1. Download eclipse-jee-indigo-SR2-linux-gtk-x86_64.tar.gz ([Fast]with this version you can go to step n°11 org.eclipse.equinox.security.ui_1.1.0.201206102238.jar )
  2. 2. Install
  3. 3. Open
  4. 4. Add ":pserver:anonymous@dev.eclipse.org:/cvsroot/rt" to your CVS repositories
  5. 5. Check Out : org.eclipse.equinox/security
  6. 6. Import project org.eclipse.equinox/security/bundles/org.eclipse.equinox.security.ui
  7. 7. Add Baseline based up to your eclipse root directory (window/preference/baseline)

  8. 8. Switch to your version of eclipse/plugins/org.eclipse.equinox.security.uixxxxxxxxx
  9. 9. Apply patch (team/apply patch) or hand-modify:
  10. 10. Export plugin to your preferred directory
  11. 11. Copy exported version to plugins directory (eclipse/plugins)
  12. 12. Change : eclipse/configuration/org.eclipse.equinox.simpleconfigurator/bundle.info to configure your version
              org.eclipse.equinox.registry,3.5.101.R37x_v20110810-1611,plugins/org.eclipse.equinox.registry_3.5.101.R37x_v20110810-1611.jar,4,false
    org.eclipse.equinox.security,1.1.1.R37x_v20110822-1018,plugins/org.eclipse.equinox.security_1.1.1.R37x_v20110822-1018.jar,4,false
    org.eclipse.equinox.security.ui,1.1.0.201206102238,plugins/org.eclipse.equinox.security.ui_1.1.0.201206102238.jar,4,false
    org.eclipse.equinox.simpleconfigurator,1.0.200.v20110815-1438,plugins/org.eclipse.equinox.simpleconfigurator_1.0.200.v20110815-1438.jar,1,true
             
  13. 13. Close & Restart
  14. 14. Check plugin (help/about eclipse/installation detail/plug-ins)
  15. 15. Click on your cvs repository to pull the login form
  16. 16. Insert password
  17. 17. Close / Restart
  18. 18. Try if eclipse asks the password after Cvs repository has been recheck

Five useful ways to sorting in java

A rapid overview of java sorting :

normal sort of list :

private static List VEGETABLES = Arrays.asList("apple", "cocumbers", "blackberry");
Collections.sort(VEGETABLES);

output: apple, blackberry, cocumbers


Reverse sorting:

private static List VEGETABLES = Arrays.asList("apple", "cocumbers", "blackberry");
Collections.sort(VEGETABLES, Collections.reverseOrder());

output: cocumbers, blackberry, apple


with custom comparator:

private class StringComparator implements Comparator {
public int compare(Object o1, Object o2) {
String so1 = (String) o1;
String so2 = (String) o2;
return so1.compareTo(so2);
}
}

private static List VEGETABLES = Arrays.asList("apple", "cocumbers", "blackberry");
Collections.sort(VEGETABLES, new StringComparator());

output: apple, blackberry, cocumbers


Elements sorting:



private class Element implements Comparable {
private String name;
private Double atomicMass;

@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("Element");
sb.append("{name='").append(name).append('\'');
sb.append(", atomicMass=").append(atomicMass);
sb.append('}');
return sb.toString();
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Double getAtomicMass() {
return atomicMass;
}

public void setAtomicMass(Double atomicMass) {
this.atomicMass = atomicMass;
}

public Element(String name, String mass, double atomicMass) {
this.name = name;
this.atomicMass = atomicMass;
}


public int compareTo(Element o) {
return this.getAtomicMass().compareTo(o.getAtomicMass());
}
}


ArrayList elements = new ArrayList();
elements.add(new Element("Hydrogen", "H", 1.00794)); // Hydrogen 1.00794 amu Atomic Mass
elements.add(new Element("Iron", "Fe", 55.845));
elements.add(new Element("Lithium", "Li", 6.941));
elements.add(new Element("Lead", "Pb", 207.2));
elements.add(new Element("Magnesium", "Mg", 24.305));
Collections.sort(elements); // Sort by Element

output:
Element{name='Hydrogen', atomicMass=1.00794}
Element{name='Lithium', atomicMass=6.941}
Element{name='Magnesium', atomicMass=24.305}
Element{name='Iron', atomicMass=55.845}
Element{name='Lead', atomicMass=207.2}


Chronological sorting:


SimpleDateFormat formatter = new SimpleDateFormat("MMMM dd, yyyy", Locale.US);
try {
ArrayList holidays = new ArrayList();
holidays.add(formatter.parse("May 31, 2010")); // Memorial Day
holidays.add(formatter.parse("July 4, 2010")); // Independence Day
holidays.add(formatter.parse("February 15, 2010")); // Presidents Day
holidays.add(formatter.parse("September 6, 2010")); // Labor Day
holidays.add(formatter.parse("December 24, 2010")); // Thanksgiving Day
holidays.add(formatter.parse("July 5, 2010")); // federal employees extra day off for July 4th
holidays.add(formatter.parse("January 18, 2010")); // Martin Luther King Day
holidays.add(formatter.parse("November 25, 2010")); // federal employees extra day off for Christmas
holidays.add(formatter.parse("October 11, 2010")); // Columbus Day
holidays.add(formatter.parse("December 25, 2010")); // Christmas Day
holidays.add(formatter.parse("January 1, 2010")); // New Year's Day
Collections.sort(holidays); // Native sort for Date is chronological

} catch (ParseException e) {
e.printStackTrace();
}

output: sorted:[Fri Jan 01 00:00:00 CET 2010, Mon Jan 18 00:00:00 CET 2010, Mon Feb 15 00:00:00 CET 2010, Mon May 31 00:00:00 CEST 2010, Sun Jul 04 00:00:00 CEST 2010, Mon Jul 05 00:00:00 CEST 2010, Mon Sep 06 00:00:00 CEST 2010, Mon Oct 11 00:00:00 CEST 2010, Thu Nov 25 00:00:00 CET 2010, Fri Dec 24 00:00:00 CET 2010, Sat Dec 25 00:00:00 CET 2010]




You can view the complete simple class below:

Gnome Applet. The my story with drive mount applet.

In my crazy world I think that I must not adapt to operating system and its relative Gui but Os and Gui must adapt to me.
When for example gnome applet doesn't works fine than I would then I download sources, study and change one or two or more time since applet becames right for me.

Then few day ago...

I added in ubuntu the applet called "drive mount" that it enables anyone to mount and to unmout, with a graphical interface, some device like hard disk or removable media.

But when it mounts an device by click relative
icon it is impossible to view if media is effectively mounted.

Now...
Before mounted :
After mounted :

On the contrary if you download sources by :

sudo apt-get source gnome-applets

and you change the file "gnome-applets-x.xx.x/drivemount/drive-button.c" like below :



Add in /usr/share/pixmaps/ the icon "mount.png"

you can view when media is mounted this icon:

it's tiny example only for your fun!

Change JtabbedPane orentation

I'm reading a new simple interested question in Stackoverflow: How to make Java tabbed panes display tabs from right to left?

Then i'm refering from "How to Use Tabbed Panes" to create a new project based by JTabbedPane component.

It's enough to use "setComponentOrientation" method to change orentation of JTabbedPane.

solved bug of "password paranoic" of security storage for eclipse in linux

Obsolete see: 18 steps to avoid Eclipse Security password paranoic

It's necessary to remember of the security storage's password for first use of cvs plugin of eclipse if you use linux.
This issue because the security storage plugin don't save password.
If you want save password of security storage you can modify source of plugin "equinox.security.ui" like below:



A special thanks to ErMandrake for his technical and moral support.

Junit e Maven, finalmente amici!

... Usare il plugin di Junit per Eclipse con un multi progetto complesso gestito con Maven
a volte può risultare un operazione molto difficile. Il plugin di Maven di Eclipse in verità deve
crescere ancora molto.
Si ha spesso la necessità di aver dei files di risorse filtrati secondo specifiche politiche configurate in Maven.
Purtroppo per Junit è sconosciuta la gestione dei filtri di maven, quindi spesso non si possono
eseguire i test da Eclipse semplicemente perchè tali files necessari non vengono preventivamente filtrati.
Ci si ritrova per esempio a non poter eseguire un test usando "Spring" a causa dell'impossibilità di caricare
il contesto, descritto nel file "application.xml", perchè questo risulta non filtrato ...

Come si può risolvere tal problema?
Maven fornisce la soluzione. Le operazioni consistono nell'eseguire manualmente il filtraggio delle risorse:

mvn process-test-resources -P

avendo configurato opportunamente il "Pom.xml" file alla sezione "resources".

ad es:

<testresources>
<testresource>
<directory>src/test/resources
<filtering>true
<includes>
<include>**/**
</includes>
<targetpath>../filtered-resources</targetpath>
</testresource>
</testresources>

Molto importante come vedremo in seguito è il nodo "targetPath". Esso indicherà a Maven la directory nel quale saranno
generati i files di riscorse.
Lanciando il comando otteremo qualcosa come di seguito:

[INFO] [resources:testResources {execution: default-testResources}]
[INFO] Using 'ISO-8859-1' encoding to copy filtered resources.
[INFO] Copying 18 resources to ../filtered-resources
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10 seconds
[INFO] Finished at: Sat May 29 12:41:47 CEST 2010
[INFO] Final Memory: 20M/37M
[INFO] ------------------------------------------------------------------------

Ultima operazione sarà quella di impostare la directory "targetPath", nell'esempio: <project>/target/filtered-resources,
nel classpath del test desiderato:

Da Eclipse:

1) Cliccare su "run/run configuration" (o debug in caso)
2) Cliccare la voce "Classpath"
3) Selezionare la voce "User Entries" e cliccare il pulsante "Advanced"
4) Selezionare la voce "Add folder" e procedere alla scelta della cartella identificata con "targetPath"
5) Usando il tasto "up" portare la cartella appena aggiunta alla prima posizione in "User Entries"
6) "Apply" e "run" del test finalmente felici di poterlo fare.

Eliminiamo qualche IF dal nostro codice

Oggi ho aderito dopo molto tempo che volevo farlo alla campagna "no IF". Programmare spesso richiede la capacità di creare non solo codice funzionante ma sopratutto programmi efficaci, facili da modificare e formalmente corretti. Meglio visitare il sito : http://tinyurl.com/daws5m ed aderire come segno di buona volontà!

Testng - uso del tag package

Qualche post fa si è definito un test tramite questa porzione di xml di configurazione:


<parameter name="parameter" value="Questo è il parametro"/>
<test name="Test dei parametri">
<classes>
<class name="it.testng.parameters.ParametersTest" />
</classes>
</test>


Può nascere durante i test la volontà di eseguire tutti i test riferendosi al package anzichè ad una specifica classe. Niente di più semplice! E' sufficiente utilizzare il tag <packages> come mostrato di seguito:

<test name="Test Package">
<packages>
<package name="it.testng.mypackage"></package>
</packages>
<test>

HTML perfetti

Con XHTMLTranscoder è possibile ottenere delle pagine html perfette. XHTMLTranscoder corregge ogni imperfezione generando un codice xhtml perfetto.
Ad esempio eseguendo il codice:

XHTMLTranscoder xhtml_transcoder = new XHTMLTranscoder();
// create a dummy HMTML string
String html_string = "<B CLASS=test>put<I>here some broken
HTML</B></I>";
// transcode the string to XHTML
String xhtml_string = xhtml_transcoder.transcode(html_string);


Si avrà che xhtml_string conterrà il valore: "<b class="test">put<i>here some broken HTML</i></b>".

XHTMLTranscoder si può scaricare da http://www.tecnick.com/public/code/cp_dpage.php?aiocp_dp=xhtmltranscoder

Bordi arrotondati tramite css

Tramite css-3 si può creare il proprio stile con mille bordi arrotondati!

Alcuni esempi delle proprietà:

border-top-left-radius: 4em;
border-top-right-radius: 4em;
border-bottom-right-radius: 4em;
border-bottom-left-radius: 4em;

Guarda il link: http://www.w3.org/TR/2008/WD-css3-background-20080910/#the-border-radius

TestNg - Passaggio dei parametri

Fin qui le differenze tra TestNg e Junit non appaiono così evidenti.Ma TestNG è un framework avanzato e non vi è bisogno di molto per mostrarlo.
Per esempio con testNg non c'è più la necessità di creare costanti o qualsiasi altro metodo per ottenere dei parametri (dati) da utilizzare nei singoli test.
TestNG fornisce un'annotazione @Parameter utile per passare dati ai singoli metodi di test.
Per esempio:
Creare un test http://tommyalf.blogspot.com/2008/05/testng-primo-test.html

package it.testng.parameters;

import static org.testng.Assert.*;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class ParametersTest {

@Parameters("parameter")
@Test
public void parametersTest(String parameter) {
assertEquals("Questo è il parametro", parameter);
}
}


Quindi il metodo parametersTest verrà invocato dal framework passando il parametro relativo a parameter.
Il valore di parameter si imposta sempre tramite il file testng.xml:

<parameter name="parameter" value="Questo è il parametro"/>
<test name="Test dei parametri">
<classes>
<class name="it.testng.parameters.ParametersTest" />
</classes>
</test>

TestNG.zip V1.0 - Prima Versione demo di utilizzo


Clicca per eseguire il download della prima versione demo.
Potrai ottenere una prima applicazione dei test con il framework TestNg.

TestNg - Dipendenze (SoftDependencies)

SoftDependencies è il metodo di TestNg per eseguire i test rispettando l'ordine delle dipendenze,
senza però che il successo o il fallimento di una dipendenza dipenda da un'altra.

Esso è possibile realizzarlo aggiungendo il
parametro alwaysRun=true nell'annotazione @Test

@Test(alwaysRun=true)

TestNg - Dipendenze (HardDependencies)

Spesso è necessario eseguire i test seguendo un ordine specificato.
TestNg permette di aver questa funzionalità secondo due modelli:

HardDependencies : i test vengono eseguiti secondo l'ordine costituito dalle dipendenze. Se il test fallisce verrà notificato come SKIP e non FAIL.

Ad esempio, se ho un test "tradizionale" nel quale sono presenti 20 dipendenze delle quali soltanto 10 falliscono avrò questo risultato:

10 test eseguiti con successo (dipendenze non fallite) e 11 failure.

In questo modo sono portato a pensare che i miei test sono falliti e che devo fare 11 fix. Invece TestNG con l'HardDependencies dimostra chiaramente che dei 21 test, 10 sono le dipendenze fallite mentre il test che dipende da questi 10 test è skippato. Il report infatti è:

10 test eseguiti con successo (dipendenze non fallite), 10 failure (dipendenze fallite), 1 SKIP (test dipendente).

TestNg mostra in modo più accurato ciò che succede durante l'esecuzione dei test.

TestNG - Gestione dei gruppi di test

E' anche possibile definire dei gruppi nei test. Così si possono realizzare test divisi per : 'unit test', 'integration test' ecc.

Ciò può essere realizzato tramite l'annotazione @Test e con il parametro 'groups'.




package it.testng.samplegroup.test;

import org.testng.annotations.Test;


public class SampleGroupTest {

@Test(groups = {"gruppo 1", "gruppo 2"})
public void TestMethod1() {
System.out.println("Metodo 1");
}

@Test(groups = {"gruppo 2"})
public void TestMethod2() {
System.out.println("Metodo 2");
}

@Test(groups = {"gruppo 3"})
public void TestMethod3() {
System.out.println("Metodo 3");
}

}




e configurando il file testNg.xml aggiungendo :


<test name="TestGroup">
<groups>
<run>
<include name="gruppo 2" />
</run>
</groups>
<classes>
<class name="it.testng.samplegroup.test.SampleGroupTest" />
</classes>
</test>



E' anche possibile escludere dai test un gruppo

inserendo all'interno di il tag
es:


Si può realizzare anche una gerarchia dei gruppi



@Test(groups = { "main" })
public class All {

@Test(groups = { "little" )
public void method1() { ... }

public void method2() { ... }
}


il method2 riferisce al gruppo "main" invece il method1 viene eseguito per i test di "main" che quelli di "little"

TestNg - configurazione di Maven con testng.xml

Installare testNG in Maven è molto semplice, è sufficiente:

Aggiungere la dipendenza

<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>5.7</version>
<scope>test</scope>
<classifier>jdk15</classifier>
</dependency>


Configurare il plug-in Surefire impostando il file di configurazione di TestNG nel seguente modo:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4</version>
<configuration>
<scope>test</scope>
<forkmode>always</forkmode>
<excludes></excludes>
<suiteXmlFiles>
<suiteXmlFile>testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>

TestNg - Primo Test

Dopo aver creato il Progetto maven SampleOneTestNG in eclipse procedere
con il creare una classe nei test di nome SampleOneTest così composta:

package it.testng.sampleone.test;

import org.testng.annotations.Test;

@Test
public class Test1 {
public void sampleOne() {
System.out.println("ok!");
}
}


da notare che l'annotazione Test ha lo stesso nome di quella di junit ma riferisce ad un jar diverso (org.testng.annotations.Test)

Successivamente è necessario creare il file testng.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="SuiteProva" verbose="1" >
<test name="Prova1" >
<classes>
<class name="it.testng.sampleone.test.SampleOneTest" />
</classes>
</test>

</suite>

TestNg - Non solo junit

TestNg è un framework di test sviluppato per semplificare e agevolare la realizzazione di suite di unit testing e di integration testing.
Scrivere un test normalmente si basa su tre passi:

  • Scrivere le business logic dei tuoi test inserendo le annotazioni di TestNG.
  • Aggiungere delle informazioni circa i metodi di escuzione dei tuoi test, tipo: class name, groups, etc.. nel file descrittore testng.xml.
  • Eseguire i test con TestNG.

E mi rifaccio la pelle

Nuova veste grafica.

TestNg - Annuncio di un framework di test (TestNg about)

Vorrei parlarvi di TestNg.
TestNg è un framework di test. Chiunque programmi in java conosce quanto sia necessario utilizzare junit per creare dei test d'unità.

TestNg offre un framework per rendere più efficienti e meglio organizzati sia i test d'unità, sia i test d'integrazione.

Quindi al prossimo post per conoscere qualcosa in piu....