PHP code coverage

38 views
Skip to first unread message

alessandro cinelli

unread,
Apr 30, 2013, 11:51:37 PM4/30/13
to so...@ml.grusp.org, pug-roma
Ciao,

Problema:
trovare codice non più utilizzato in una codebase legacy,
collezionando informazioni a runtime.
La maggior parte delle Api e il nuovo codice sono testati con Phpunit
attraverso il quale generiamo il report di code coverage, ma non è
sufficiente ed è improponibile testare dal punto di vista dei costi
tutta la codebase che abbiamo.

Soluzione individuata:
utilizzare Xdebug con code coverage abilitato sulle macchine degli
sviluppatori, sul server di sviluppo e di staging collezionando
statistiche sul codice invocato ad ogni request.
In questo modo posso essere più confidente su quale codice posso
eliminare e/o rifattorizzare.

Strumenti disponibili:
- xdebug con code coverage abilitato
- libreria per report del code coverage:
https://github.com/sebastianbergmann/php-code-coverage

Quindi? Risolto?
No

Perché?
- Xdebug restituisce le informazioni con un array bidimensionale ad
ogni request.
Serve quindi un tool che renda leggibile e collezionabili queste informazioni

- La libreria PHP_CodeCoverage di Bergmann soddisfa la leggibilità e
la generazione del report dei dati generati da Xdebug, ma funziona
SOLO con it test di PHPunit e non permette di collezionare diversi
report per la generazione di statistiche aggregate.

Quindi?
Quindi mi chiedevo se conoscevate qualche strumento che risolvesse il
problema esposto, altrimenti comincio a lavorare ad una nuovo tool


Grazie

cirpo




--
@cirpo

Alessandro Nadalin

unread,
May 1, 2013, 1:22:46 AM5/1/13
to pug-...@googlegroups.com, so...@ml.grusp.org
Domanda di rimbalzo: quanto tempo vuoi aspettare per essere "confidente" che quel codice non viene usato?


2013/5/1 alessandro cinelli <alessandr...@gmail.com>

--
Hai ricevuto questo messaggio perché sei iscritto al gruppo "PUG Roma" di Google Gruppi.
Visita questo gruppo all'indirizzo http://groups.google.com/group/pug-roma?hl=it-IT.





--
Nadalin Alessandro
www.odino.org
www.twitter.com/_odino_

alessandro cinelli

unread,
May 1, 2013, 3:41:42 AM5/1/13
to so...@ml.grusp.org, pug-roma
@_odino_ @giorgio:
Il mio punto di partenza non è un determinata porzione di codice.

Lo strumento che sto cercando è volto ad automatizzare il processo di
ricerca del codice candidato all'eliminazione raccogliendo dati dalle
macchine degli sviluppatori, dalle macchine di dev, staging e demo.





cirpo

2013/5/1 Giorgio Sironi <in...@giorgiosironi.com>:
> Soluzione di basso livello: metto delle linee di log intorno al codice
> candidato per la cancellazione, lo mando in produzione e i log che non
> vengono scritti corrispondono a cose cancellabili. :) i candidati possono
> essere classi o metodi o addirittura interi script.
>
> Il giorno 01/mag/2013 05.51, "alessandro cinelli"
> <alessandr...@gmail.com> ha scritto:
>> _______________________________________________
>> Soci mailing list
>> So...@ml.grusp.org
>> http://ml.grusp.org/listinfo.cgi/soci-grusp.org
>
>
> _______________________________________________
> Soci mailing list
> So...@ml.grusp.org
> http://ml.grusp.org/listinfo.cgi/soci-grusp.org
>



--
@cirpo

Alessandro Nadalin

unread,
May 1, 2013, 3:43:16 AM5/1/13
to pug-...@googlegroups.com, so...@ml.grusp.org
io ho posto una domanda per se' :-P


2013/5/1 alessandro cinelli <alessandr...@gmail.com>
--
@cirpo

--
Hai ricevuto questo messaggio perché sei iscritto al gruppo "PUG Roma" di Google Gruppi.
Visita questo gruppo all'indirizzo http://groups.google.com/group/pug-roma?hl=it-IT.


alessandro cinelli

unread,
May 1, 2013, 3:46:43 AM5/1/13
to pug-roma, so...@ml.grusp.org
2013/5/1 Alessandro Nadalin <alessandr...@gmail.com>:
> io ho posto una domanda per se' :-P

non ho una risposta, è dipendente da troppe variabili.


cirpo
@cirpo

alessandro cinelli

unread,
May 1, 2013, 5:08:52 AM5/1/13
to so...@ml.grusp.org, pug-roma
2013/5/1 Jacopo Romei <jro...@gmail.com>:
> Ho lo stesso problema. Il thread mi interessa un sacco.
>
> La soluzione di Giorgio non è male.

Si, ma presuppone che tu sappia dove andare a cercare, ed è un
operazione manuale.

> Un tool ad hoc potrebbe prendere piede dalla utility di PHPUnit ed astrarla.
> Che dici?

esatto, è il piano che ho in mente.

Per ora sto usando http://xdebug.org/docs/code_coverage wrappato in
una classe, salvo i dati su mongodb e tiro fuori qualche statistica. È
il risultato di un'oretta di lavoro.
Pensavo poi di prendere
https://github.com/sebastianbergmann/php-code-coverage per il report
finale ed adattarlo.

Appena ho qualcosa di "usabile" lo pubblico su Github.

Ora torno a godermi il primo maggio.

ciuaz

cirpo





>
>
> On Wednesday, May 1, 2013, Matteo Caberlotto wrote:
>>
>> io userei dtrace solo per dire che ho usato dtrace :D
>>
>>
>> 2013/5/1 alessandro cinelli <alessandr...@gmail.com>
> --
> Jacopo Romei
> http://www.sviluppoagile.it/
> http://twitter.com/jacoporomei
> http://www.anonimarmonisti.com/

Giorgio Cefaro

unread,
May 1, 2013, 5:56:27 AM5/1/13
to pug-...@googlegroups.com, so...@ml.grusp.org
Ma usare XHProf in produzione?
Così si raccolgono dati *veri*, in modo completamente trasparente e non si intaccano (troppo?) le prestazioni.


--
Hai ricevuto questo messaggio perché sei iscritto al gruppo "PUG Roma" di Google Gruppi.
Visita questo gruppo all'indirizzo http://groups.google.com/group/pug-roma?hl=it-IT.





--
Giorgio Cefaro
-------------------------
Developer
giorgiocefaro.com
twitter: @giorrrrgio
linkedin: it.linkedin.com/in/giorgiocefaro

alessandro cinelli

unread,
May 1, 2013, 6:05:58 AM5/1/13
to pug-...@googlegroups.com, so...@ml.grusp.org
I


On Wednesday, May 1, 2013, Giorgio Cefaro wrote:
Ma usare XHProf in produzione?
Così si raccolgono dati *veri*, in modo completamente trasparente e non si intaccano (troppo?) le prestazioni.

Non ti permette Di fare statistiche su più request mostrandoti il coverage.

Cirpo

 


> http://ml.grusp.org/listinfo.cgi/soci-grusp.org
>



--
@cirpo

--
Hai ricevuto questo messaggio perché sei iscritto al gruppo "PUG Roma" di Google Gruppi.
Visita questo gruppo all'indirizzo http://groups.google.com/group/pug-roma?hl=it-IT.





--
Giorgio Cefaro
-------------------------
Developer
giorgiocefaro.com
twitter: @giorrrrgio
linkedin: it.linkedin.com/in/giorgiocefaro

--
Hai ricevuto questo messaggio perché sei iscritto al gruppo "PUG Roma" di Google Gruppi.
Visita questo gruppo all'indirizzo http://groups.google.com/group/pug-roma?hl=it-IT.
 
 


--
@cirpo

Roy

unread,
May 1, 2013, 7:16:05 AM5/1/13
to pug-...@googlegroups.com, so...@ml.grusp.org
Per favore non quotate 4,5 metri di roba.

Se posso consigliare fai commit separati sulle SINGOLE righe rimosse (che non siano commento o vuote ovvio), tanto è automatizzata la cosa no ?

Alla fine fai i test, se per caso ci sono errori vai di git-bisect fino a trovare quella singola riga che ha prodotto l'errore.
https://www.kernel.org/pub/software/scm/git/docs/git-bisect.html molto comoda come funzionalità.

Jacopo Romei

unread,
May 1, 2013, 7:17:46 AM5/1/13
to pug-...@googlegroups.com
Bisect è una manna. 

Il problema di Cirpo - come lui stesso ha scritto - è che non ha copertura significativa su tutto il legacy. 
--
Hai ricevuto questo messaggio perché sei iscritto al gruppo "PUG Roma" di Google Gruppi.
Visita questo gruppo all'indirizzo http://groups.google.com/group/pug-roma?hl=it-IT.
 
 


--

Roy Bellingan

unread,
May 1, 2013, 7:38:00 AM5/1/13
to pug-...@googlegroups.com
Bisect è una manna. 
Il problema di Cirpo - come lui stesso ha scritto - è che non ha copertura significativa su tutto il legacy.
Sorry mi era sfuggito quel pezzo.

Fabrizio Callai

unread,
May 1, 2013, 7:06:20 PM5/1/13
to pug-...@googlegroups.com, so...@ml.grusp.org

alessandro cinelli

unread,
May 1, 2013, 10:02:40 PM5/1/13
to pug-roma, so...@ml.grusp.org
Ciao,

2013/5/2 Fabrizio Callai <f.ca...@gmail.com>:
>
> http://phpmd.org/

Phpmd spesso da dei falsi positivi, sopratutto quando viene utilizzata
la reflection, è un ottimo strumento ma ha i suoi limiti (dovuti al
linguaggio stesso). Per questo motivo, come ho già evidenziato, cerco
uno strumento che mi faccia l'analisi del codice a runtime, non
statica come phpmd.

Ripropongo i requisiti, cercando di essere più chiaro possibile:

- generazione della code coverage ad ogni request

- persistenza dei dati ottenuti, ottenendo:
-- uno storico
-- statistiche riguardanti il codice condiviso tra diverse request
-- rilevamento di codice non (o poco) utilizzato

- report visibile e "usabile" di tutte queste informazioni (un
semplice frontend html può andare bene)

daje

cirpo



>
> Ciao
>
> --
> Hai ricevuto questo messaggio perché sei iscritto al gruppo "PUG Roma" di
> Google Gruppi.
> Visita questo gruppo all'indirizzo
> http://groups.google.com/group/pug-roma?hl=it-IT.
>
>



--
@cirpo

Roy Bellingan

unread,
May 2, 2013, 3:37:39 AM5/2/13
to pug-...@googlegroups.com
Ripropongo i requisiti, cercando di essere più chiaro possibile:

- generazione della code coverage ad ogni request

- persistenza dei dati ottenuti, ottenendo:
-- uno storico
-- statistiche riguardanti il codice condiviso tra diverse request
-- rilevamento di codice non (o poco) utilizzato

- report visibile e "usabile" di tutte queste informazioni (un
semplice frontend html può andare bene)

daje
E se fosse questo il progetto comune del pug Roma ?
Pensiamoci bene, in giro non si trova nulla del genere..
Oda che ne pensi ?

Fabrizio Callai

unread,
May 2, 2013, 4:36:17 AM5/2/13
to pug-...@googlegroups.com, so...@ml.grusp.org
Forse i logs di APD potrebbero tornare utili. Non so se XDebug faccia altrettanto.


Ciao

Fabrizio Callai

unread,
May 2, 2013, 5:03:27 AM5/2/13
to pug-...@googlegroups.com, so...@ml.grusp.org

alessandro cinelli

unread,
May 2, 2013, 5:37:48 AM5/2/13
to so...@ml.grusp.org, pug-roma
2013/5/2 Marco Vito Moscaritolo <mav...@gmail.com>:
> Io avevo provato:
>
> * https://github.com/preinheimer/xhgui
>

lo stiamo usando tuttora sui server dev e staging e sulle macchine
degli sviluppatori


> nel mio caso era bastato.. il problema più grosso che avevo
> riscontrato era che NON indicava quale codice non viene usato, ma solo
> quello che viene usato (di conseguenza diffare non è banalissimo).

appunto :)

merci

cirpo



>
> Buon hacking ;)
>
>
> 2013/5/2 alessandro cinelli <alessandr...@gmail.com>:
>> _______________________________________________
>> Soci mailing list
>> So...@ml.grusp.org
>> http://ml.grusp.org/listinfo.cgi/soci-grusp.org
>
>
>
> --
> Ciao
> Marco
> --
> web: http://mavimo.org
> msn: mav...@tiscali.it
> gtalk: mav...@gmail.com
> mob: +39 393 9249923
> skype: marco.moscaritolo
> twitter: http://twitter.com/mavimo

alessandro cinelli

unread,
May 5, 2013, 12:23:30 AM5/5/13
to so...@ml.grusp.org, pug-roma
2013/5/5 Francesco Trucchia <truc...@gmail.com>:
> Ciao Cirpo,
> quando dici che testre la codebase legacy costerebbe troppo, cosa
> intendi?

Intendo che creare test con phpunit su tutta la codebase per il solo
scopo di ottenere
una code coverage sulla codebase legacy mi sembra uno sforzo inutile e costoso.


>Quanti giorni uomo ci vorrebbero per registrare test con
> Selenium IDE da dare in pasto a PHPUnit e Selenium? La cosa mi
> incuriosisce, perché credo che questa strada sia sempre la migliore,
> anche se a volte la più difficile.

Mooooolti meno, ed è la prima cosa che è stata fatta: abbiamo
ingabbiato le funzionalità principali in 200 test di selenium, in due
settimane di lavoro con 2 sviluppatori (20 giorni uomo).

cirpo


>
>
> 2013/5/2 Marco Vito Moscaritolo <mav...@gmail.com>:
>> @cirpo: dimenticavo, io ero partito da:
>>
>> print_r(get_defined_functions()['user']);
>> print_r(get_declared_classes());
>> print_r(get_declared_interfaces());
>>
>> Buttavo in mongo e poi ciclavo su tutti gli oggetti della collection
>> per vedere se nella collection degli oggetti istanziati esisteva
>> qualcosa.
>>
>> NB: io avevo anche pezzi di codice che "costruivano a runtime classi"
>> quindi ad un certo punto dovevo pure andare a buon senso nei match..
>> quindi questa parte credo non sia totalmente automatizzabile o "da
>> scimmia" ;)
>>
>> 2013/5/2 Eugenio Minardi <eugenio...@gmail.com>:
>>> Ciao,
>>>
>>> c'è questo tool che qualche hint lo da sull'analisi statica
>>> https://github.com/EHER/phpunit-all-in-one/tree/master/src/phpdcd
>>>
>>> Non so come si comporti con magic methods e simili.
>>>
>>>
>>> 2013/5/2 alessandro cinelli <alessandr...@gmail.com>
> Francesco Trucchia
> http://francescotrucchia.it

Gufo Rosso

unread,
May 5, 2013, 10:37:12 AM5/5/13
to pug-...@googlegroups.com
Lavorando con php mi sono imbattuto in 1 bug, e una mancata implementazione

https://bugs.php.net/bug.php?id=50293 (incorrect path save export file)
https://bugs.php.net/bug.php?id=40046 (manca: CRL generation support in
the OpenSSL extension)

Sono state create le patch ma non implementate nelle release successive
e sono passtati tanti aggiornamenti.

qualche soluzione ?


ciao

alessandro cinelli

unread,
May 5, 2013, 2:09:48 PM5/5/13
to so...@ml.grusp.org, pug-roma
2013/5/6 Federico Ulfo <rainel...@gmail.com>:
> Updates? Come procede Cirpo, hai provato qualche tool o strategia per
> automatizzare la pulizia del codice?

continuo con esperimenti, non appena e se ho qualcosa di interessante
vi avverto.

cirpo


>
>
> 2013/5/5 alessandro cinelli <alessandr...@gmail.com>
@cirpo

Roy Bellingan

unread,
May 6, 2013, 9:51:03 AM5/6/13
to pug-...@googlegroups.com
Uhm...
Oltre ad un UP al bug mi viene poco in mente.


--
Roy Bellingan
tsm...@gmail.com
CG & ArchiVIZ http://archidea.us
Programmazione & SysAdmin http://tsmt.eu
Reply all
Reply to author
Forward
0 new messages