Qual è il vantaggio della copertura dell'istruzione (codice byte) sulla copertura di linee e diramazioni?

3

Il nostro progetto utilizza Jacoco per le metriche di copertura del codice. In precedenza, abbiamo verificato la copertura di linee e diramazioni rispetto ai valori percentuali. Tuttavia, la documentazione descrive anche un livello "Istruzioni", che conteggia le istruzioni del codice byte Java. Dalla loro documentazione:

The smallest unit JaCoCo counts are single Java byte code instructions. Instruction coverage provides information about the amount of code that has been executed or missed. This metric is completely independent from source formatting and always available, even in absence of debug information in the class files.

Se in precedenza avessimo utilizzato la copertura di linee e diramazioni, qual è il vantaggio di passare alla copertura delle istruzioni? Sta solo contando le stesse cose in un modo diverso? O fornisce metriche più accurate? Al contrario, esiste una situazione in cui vorremmo utilizzare le metriche di copertura di linee e diramazioni invece del codice byte?

    
posta Thunderforge 17.07.2017 - 16:55
fonte

3 risposte

3

Non vi è alcun vantaggio del codice byte o della copertura della linea sulla copertura della filiale.

Se un elemento (linea o istruzione) di un ramo è coperto, anche tutti gli elementi di quel ramo sono coperti.

Se una singola riga di codice contiene più di un ramo (ad esempio, in C: (a==0) ? do_b() : do_c() ), la copertura della diramazione ne tiene conto.

Inoltre, la copertura delle filiali è completamente indipendente dalla formattazione del codice sorgente.

    
risposta data 18.07.2017 - 11:17
fonte
2

Gli interpreti del codice byte Java sono considerati un dettaglio dell'implementazione . Non dovresti testare o valutare le metriche a livello di codice byte, dato che dovresti essenzialmente testare i bug nell'interprete del codice byte (di cui non dovresti davvero preoccuparti). Ho letto il paragrafo che hai collegato come "se tutto quello che hai è il codice binario byte, puoi comunque ottenere metriche in questo modo".

    
risposta data 17.07.2017 - 17:14
fonte
2

Il vantaggio che i documenti citano è che la copertura della linea conta

x = 1; y = 2; z = 4;

come una riga, ma

x = 1;
y = 2;
z = 4;

come tre. Tra gli aspetti positivi, le misure basate su bytecode non variano tra i due, perché le due versioni vengono compilate nella stessa sequenza bytecode. Le metriche basate sulla linea riporterebbero numeri diversi.

La copertura del codice byte come metrica di segnalazione sembra ingannevole. Avere una metrica indipendente dalla formattazione del codice è certamente una virtù in teoria. Potrebbe essere una difesa plausibile contro i numeri di copertura dei giochi degli sviluppatori, ad esempio mettendo molte affermazioni logiche su una riga. Ma dipende dai dettagli di implementazione del linguaggio, non dal codice sorgente. Non fornirebbe numeri stabili attraverso diverse implementazioni di Java, alcune delle quali non hanno nemmeno i bytecode, e potrebbero anche variare nel tempo man mano che la JVM e i compilatori evolvono. La maggior parte se non tutti i motori di test già scontano i delta di formattazione più ovvi, come i commenti e le righe vuote. Anche le revisioni del codice e gli standard di stile di codifica scoraggiano naturalmente l'acquisto gratuito di line-pack e altre metriche di copertura.

La copertura del bytecode non è una metrica o unità di reporting standard o ampiamente accettata. A differenza della copertura delle filiali, il conteggio dei bytecode non è una distinzione semantica "sottile, ma significativa" nella copertura misurata. È solo un modo alternativo e meno sensibile alla formattazione per misurare / riportare le stesse misure già adottate per la copertura della linea. Ha alcuni lievi vantaggi, ma non sembrano particolarmente grandi se bilanciati contro di loro essendo una misura non standard, legata a un'implementazione linguistica specifica (se popolare), e non direttamente correlata alla sorgente visibile del programma.

    
risposta data 18.07.2017 - 01:05
fonte

Leggi altre domande sui tag