Newsgroup: it.comp.java
Titolo: "Test Code " ... che cosa è?

Da "Thinking in java"  - Appendice C  consigli x la programmazione:
Write the test code first (before you write the class) in order to verify
that your class design is complete. If you can't write test code, you don't
know what your class looks like. In addition, the act of writing the test
code will often flush out additional features or constraints that you need
in the class-these features or constraints don't always appear during
analysis and design. Tests also provide example code showing how your class
can be used.
Che cosa si intende per "Test Code"? Come si deve procedere per scriverlo?
Ciao
  SkyNet

 Che cosa si intende per "Test Code"? Come si deve procedere per scriverlo?
Cosa si suppone che il tuo programma faccia ? Come fai a dimostrare che lo
fa' in modo corretto ? Questo e' il "test". Per estensione, il "test code"
e' il codice che fornisce al tuo programma un input controllato e legge
l'output e lo confronta con cio' che si aspetta di ricevere...
Davide

Bruce si sta riferendo a quello che in XP si chiama "test-first programming" (se non cita
la sorgente di questa frase, "If you can't write test code, you don't know what your class
looks like", beh, vi posso assicurare che non e' roba sua :-D).
Trovi una bella introduzione a questa pratica in questo articolo:
http://www.objectmentor.com/publications/xpepisode.htm
Il tool che ti consiglio di usare per lavorare in test-first e' JUnit, che trovi su:
http://www.junit.org
Sono poi disponibile per qualsiasi chiarimento.
Ciao,
    Bruno.


|
| Bruno Bossola
| A Java Software Engineer :-)
| 
http://bbruno.fasturl.it
|
| 
http://members.xoom.it/bbruno
| 
http://digilander.iol.it/bbossola
|

Si. Il JDK 1.4 se non erro introduce anche un meccanismo di asserzioni. Una
libreria di funzionalitą focalizzate su questo aspetto e ampiamente diffuse
sono le JUnit sviluppate proprio da alcuni dei massimi teorici di queste
idee.

 Sono poi disponibile per qualsiasi chiarimento.
Grazie ^_^
Non mancherò di approfittarne ;)
Ciao
 SkyNet

 Che cosa si intende per "Test Code"? Come si deve procedere per scriverlo?


|


scusa se correggo la tua correzione ;-)  il meccanismo di asserzioni č alla
base delle junit, e non č affatto un tool per realizzare test automatici
(test di carico e test funzionali).
Serve proprio per controllare che il codice faccia esattamente quello che ti
aspetti (entri nei loop un certo numero di volte, certe condizioni siano
verificate in un certo punto dell'esecuzione del prg, etc.) .
http://junit.sourceforge.net/doc/cookbook/cookbook.htm
http://junit.sourceforge.net/doc/cookstour/cookstour.htm
Erich Gamma, Kent Beck dovrebbero esserti familiari.
Credo che le junit siano pertinenti al subject "TIJ / XP"
Ad ogni modo, il meccanismo di asserzioni introdotto nel JDK 1.4 non
coincide con JUnit (sono due cose diverse, ma simili), non vorrei che
qualcuno travisasse.
Ciao ciao
Jigi.


|


probabilmente è le due cose insieme.
http://www.junit.org/junit/javadoc/3.7/junit/framework/Assert.html


Senz'altro penso sia possibile, vista la natura della classe, usarla come semplice classe
di asserzione, ma l'utilizzo primario di JUnit e' quello di tool per la realizzazione di
test automatici, come documentano, fra l'altro, i link che hai citato tu. L'utilita' di
quella classe, al di fuori di un testcase lanciato da JUnit, e' davvero molto bassa: se tu
hai mai usato JUnit e scritto un caso di test, sicuramente ti rendi conto della differenza
che c'e' fra lo scrivere un caso di test con JUnit e semplicemente inserire qualche assert
nel codice, cosa che comunque puoi fare con tre righe nette.
Se tu stai usando JUnit in quel modo, ovvero limitandoti ad usare quella singola classe,
ti assicuro che stai sbagliando. 
Disponibile per approfondimenti.
Ciao,
    Bruino.


Scoprii le junit che avevo già un mio set di utilità per le asserzioni
(l'idea nacque proprio dal tij ) così mi son limitato a dargli uno sguardo e
ad utilizzarla in questa maniera; confesso che non ho approfondito molto.
Per i test funzionali/carico ho utilizzato applicazioni della mercury o di
compuware. Ma devo aver capito male allora... Junit farebbe anche questo
genere di test? o cosa?
Vivevo di questa sicurezza sulle junit, avevo letto tempo addietro anche un
articoletto su IBM che parlava di Junit e di asserzioni. Evidentemente devo
ravvedermi. (?)

JUnit e' un tool che si utilizza per scrivere casi di test che possono rappresentare sia
test di tipo funzionale che di unita' (unit-test, da qui il nome JUnit). Sono inoltre
disponibili delle estensioni per effettuare delle misurazioni di performance e per
effettuare particolari tipi di test, ma la funzione primaria dei tool XUnit e' quella di
fornire uno strumento per scrivere dei test. (Ah, XUnit perche' si tratta di una
"famiglia" di tool, vedi anche HttpUnit, JUnitEE, ecc.ecc.)
Junit in particolare si usa molto quando si lavora in "test-first programming", ovvero si
scrive prima il test che il codice che implementa la funzione richiesta. (in XP questa e'
una delle pratiche di base). Se conoscete l'inglese, un articolo molto bello che mostra
l'uso di JUnit usando questa pratica e' quello che spesso cito nei miei post, vi consiglio
vivamente di leggerlo:
http://www.objectmentor.com/publications/xpepisode.htm
Usare JUnit in questo modo e' veramente potente: si realizza in pratica quello che si
chiama "incremental test-first programming", dove in pratica sono i test che guidano lo
sviluppatore a scrivere il codice incrementalmente, aggiungendo ogni volta funzionalità.
(Apro una parentesi sul fatto di scrivere i test prima del codice: anche a me all'inizio
sembrava impossibile funzionasse, e invece funziona, alla grande! I ragazzi che lavorano
con me attualmente lavorano cosi, e sono tutti appena entrati nel mondo dello sviluppo di
software.)
JUnit ovviamente si puo' usare anche per scrivere casi di test nel modo classico, ovvero
dopo avere scritto il codice della classe o del sistema/sottosistema che ci interessa
testare.
Come si scrive un test con JUnut?
Nel modo piu' semplice si parte creando una classe che estende la classe standard di
JUnit, chiamata TestCase, e li' dentro si inseriscono i metodi che effettuano il test, che
per convenzione devono iniziare per "test". Il tool si proccupa di chiamarli in sequenza,
generando poi un report contenente i risultati del test.
Ad esempio, ecco un pezzo di una classe di test che e' stata realizzata in un progetto, si
tratta di un parser che data una stringa in ingresso ne fornisce la versione trasformata,
se necessario. (scusate l'italiano mischiato all'inglese, ma per ora i ragazzi
preferiscono lavorare cosi) 
package boo.wiki.util.test;
import java.sql.*;
import junit.framework.*;
import boo.wiki.util.*; 
public class ParserPagineTest extends junit.framework.TestCase  
{
    public ParserPagineTest(String name) 
    {
        super(name);
    }
    public void testPageWithNoAt() throws SQLException
    {
        final String page = "Pippo pluto paperino";
 
        ParserPagine ilParser = new ParserPagine(ilDataBase);
        String parsedPage = ilParser.parse(page);
 
        assertEquals(page, parsedPage);
    }
    public void testPageWithOneAt() throws SQLException
    {
        final String page = "Pippo @pluto paperino";
        final String expectedPage = 
            "Pippo "+ 
            "<A href='./boo.wiki.servlet.WikiServlet?page=pluto'>pluto</a> "+
            "paperino";
 
        ParserPagine ilParser = new ParserPagine(ilDataBase);
        String parsedPage = ilParser.parse(page);
 
        assertEquals(expectedPage, parsedPage);
    }
    public void testPageWithMoreAt() throws SQLException
    {
        final String page = "Pippo @@@@@@@@@@@@@@ paperino";
        final String expectedPage = "Pippo @@@@@@@@@@@@@@ paperino";
 
        ParserPagine ilParser = new ParserPagine(ilDataBase);
        String parsedPage = ilParser.parse(page);
 
        assertEquals(expectedPage, parsedPage);
    }
    ....
    ....
    public static void main(String args[])
    {
        junit.textui.TestRunner.run (ParserPagineTest.class);
    }
}
Come vedete la classe puo' anche contenere un main() (che noi di solito infiliamo ma che
non e' obbligatorio) nel quale includiamo il lancio del tool a linea di comando. In
realta' JUnit include anche 2 tool grafici (uno basato su AWT e uno basato su Swing) per
il lancio dei test.
E' possibile poi combinare i test in suite, che lanciano insieme tutti i test, e lanciarli
insieme mediante il tool. Inoltre, dal tool, e' possibile anche lanciare un singolo test
semplicemente selezionandolo dall'elenco.
Che dire, comunque... JUnit e' un tool semplice, che pero' offre un sacco di
funzionalita': difficile comprimerle in un post sul NG, spero almeno di avervi
incuriosito. Andate sul sito di JUnit (
www.junit.org
) e documentatevi, se sapete
l'inglese. Altrimenti.... non so, non ho ancora trovato niente in italiano, sorry :-D
Se volete possiamo comunque aprire un thread sull'argomento.
Ciao,
    Bruno.


|


JUnit e' un tool...
Dimenticavo anche questo articolo:
http://junit.sourceforge.net/doc/testinfected/testing.htm
E' in pratica il manifesto di JUnit :-)
Ciao,
    Bruno.


 
A parziale discolpa di Jigi (solo parziale, eh? Pentiti, Jigi...) Junit
e' probabilmente divenuto un tool a tutti gli effetti solo evolvendosi
nel tempo (come e' giusto che sia). Il package junit.framework  e alcune
frasi sparse nei vari papers (che sono sempre gli stessi, ormai
vecchiotti) che non mi ricordo a memoria (ma so che ci sono) lasciano
pensare che la dicotomia tool/libreria ci sia stata, almeno per un po'.
ciao
uL

> A parziale discolpa di Jigi (solo parziale, eh? Pentiti, Jigi...) Junit
Mea culpa :)

 Junit non e' una libreria. Punto. E' un tool.
Ma come, io importo junit.framework.* ed estendo da TestCase senza usare
il TestRunner.. ;-) 
A parte gli scherzi, mi sembra che il modello concettuale implementato da
junit sia proprio quello alla Hoare, precondizioni, postcondizioni e
invarianti implementati tramite setup/asserzioni (lo stesso, come diceva
Ugo, presente in C con assert.h, Eiffel etc). 
In questo senso (per quel poco che ho visto della relativa parte in
JDK1.4) avra' senso un domani riscrivere la parte "asserzioni" di junit
usando le librerie standard invece di codice ad hoc. Non che cambi nulla
in superficie o per i test, comunque. 
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun

Allora direi che ho toppato.
Thx Bruno, sei un magazzino di informazioni :)  !!
--Luigi