Domanda

Sto usando EclEmma per l'analisi di copertura.

Il mio codice Java include una sincronizzato blocco (MyClass.class) {}.

EclEmma dice che è solo parzialmente coperto, evento anche se ho un test di unità in cui un thread ottiene l'accesso e un altro thread è bloccato.

E 'possibile ottenere una copertura completa di usare sincronizzato EclEmma?

Posso annotare il codice in qualche modo per dire EclEmma per dare questa linea una copertura completa?

Cordiali saluti Roger

È stato utile?

Soluzione

Non sono sicuro che sia possibile ottenere una copertura completa, dal momento che numero 2939804 rapporti :

  

EMMA sempre segni synchronized(..) come parzialmente coperta

     

Esempi:

synchronized (lock) // partially covered (yellow line in EclEmma)
{
// ...
}
synchronized (this) // partially covered (yellow line in EclEmma)
{
// ...
}

Forse uno strumento diverso ( come Cobertura ) produrrebbe un risultato diverso? (Non ho ancora testato di recente).


Aggiornamento dicembre 2012 (più di 2 anni più tardi):

Nathan D Ryan rapporti :

  

synchronized si illumina verde se il blocco sincronizzato contiene codice che attende su un monitor oggetto, e un interrupt di prova del filo attesa.

     

Dopo un po 'di sperimentazione, sono stato in grado di ottenere una copertura completa della linea synchronized se il blocco synchronized completato normalmente e completato bruscamente a causa di un'eccezione.

Altri suggerimenti

EclEmma utilizza Jacoco sotto per l'analisi di copertura.

Come spiegato in (attualmente inesistente) Opzione Jacoco JAVAC.SYNC filtraggio , il comportamento è il risultato del codice byte generato per blocchi sincronizzati:

  

Un Java blocco sincronizzato viene compilato in due istruzioni bytecode:. MONITORENTER all'inizio e MONITOREXIT alla fine del blocco

     

Per garantire che il monitor viene rilasciato in ogni caso sia installato un gestore di eccezioni, che punti ad un'altra istruzione MONITOREXIT. Questo blocco del gestore di eccezione causa tipicamente copertura linea parziale che non ha senso dal punto di vista codice sorgente.

Una legato Jacoco questione 245 spiega come eccezioni possono essere attivati ??per raggiungere la piena copertura, ove auspicata, come spiegato anche da @ nathan-ryan:

  1. Un test che esegue il blocco sincronizzato normalmente
  2. Un secondo test che lancia (e quindi attende) un'eccezione all'interno del blocco sincronizzato.

Credo che il problema è MyClass.class che a quanto pare è implementata utilizzando

http://emma.sourceforge.net/faq.html#q .fractional.examples

  

rami impliciti a causa di un Class.forName nascosta (). Questo caso è   piuttosto sfortunato perché è abbastanza comune e tuttavia il programmatore   non ha quasi alcun controllo su di esso.

     

A causa Class.forName () può lanciare eccezioni controllate, il compilatore   emette un blocco catch che genera nuovamente loro come incontrollato. Questo blocco catch   quasi mai eseguito in pratica, ma si riesce a marcatura linea   parzialmente coperto.

ho perso che sulla prima lettura attraverso.

cercherò di ri-scrivere il mio codice per ottenere una copertura completa.

/ Roger

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top