Domanda

La maggior parte delle lingue consolidate dispongono di solidi strumenti di copertura dei test, ma la profondità della funzionalità differisce in modo significativo l'una dall'altra.

Inoltre, tutte le varie macchine virtuali e compilatori hanno una struttura così eterogenea che la scrittura di uno strumento di copertura del codice deve essere un lavoro molto diverso in C rispetto ad esempio in Lisp.

  • Python ha sys.settrace per dirti direttamente quali linee stanno eseguendo
  • Clover (per Java) utilizza il proprio compilatore e aggiunge i metadati di debug (l'ultima volta I usato comunque)
  • Emma (per Java) ha un ClassLoader che riscrive al volo il bytecode
  • COVER (per Lisp) ha un passaggio di annotazione per strumentare il codice

Sono interessato all'implementazione della copertura del codice per diverse lingue:

  1. Quali sono gli approcci principali per arrivare alla C0 , dove tu può tracciare quali righe di codice sono state eseguite? Cito l'introspezione di VM nativa e la strumentazione di codice statico e dinamico sopra - ci sono altri metodi?

  2. Arrivare a dati di copertura più illuminati, come C1 o C2 , sembra come un compito agnostico linguistico rispetto a C0. Per me è una grande manipolazione della Karnaugh ; ci sono le migliori pratiche su come farlo effettivamente? Tecniche logiche più moderne come fuzziness svolgono un ruolo?

  3. Un aspetto molto trascurato della copertura del test sta mostrando i risultati al programmatore, che diventa sempre più difficile con i dati C1 e C2. Francamente, anche se svolgono il lavoro per C0, sono deluso dalla maggior parte delle interfacce di copertura dei test; quali interfacce innovative e intuitive hai visto per i dati di copertura?

È stato utile?

Soluzione

Essenzialmente tutti gli strumenti di copertura del codice strumentano il codice per verificare quali parti del codice sono state eseguite.

Come definito nel collegamento fornito, C0 e C1 sono abbastanza simili dal punto di vista della persona che scrive la strumentazione. L'unica differenza è dove si inserisce il codice. Vado oltre a ipotizzare che C1 sia persino più facile di C0, perché la strumentazione avviene sul livello di sintassi, diciamo, astratto, in cui le estremità delle linee non contano molto.

Un altro motivo per cui sto dicendo che C1 è più facile è perché si tratta di entità sintattiche invece di entità lessicali: come si dovrebbe strumentare:

if
c > 1 && c
< 10
then
blabla
end

Beh, solo un pensiero.

Per quanto riguarda C2, in pratica non l'ho mai visto fatto. Il motivo è che puoi ottenere un'esplosione esponenziale:

if c1 then * else * end
if c2 then * else * end
...
if cn then * else * end

Per n righe di codice, occorrerebbero 2 ^ n test. Inoltre, cosa fai per i loop? In genere, le astrarre come semplici istruzioni if ??(cioè per ogni ciclo testato che il suo corpo è stato eseguito 0 volte per un test e almeno una volta in un altro test).

Credo che il campionamento del PC sia un modo particolarmente terribile per fare copertura del codice perché potresti perdere alcune affermazioni perché sono state eseguite troppo velocemente: D Lo stesso vale per la logica fuzzy, che viene usata per ragionare sulle approssimazioni; in genere si desidera che la copertura del codice sia deterministica.

Le mappe Karnaugh sono utilizzate per ridurre al minimo le funzioni booleane e non vedo alcun collegamento utile con gli strumenti di copertura del codice.

Inoltre, a volte la tua domanda non è molto chiara: vuoi tecniche per ottenere una migliore copertura del codice o è solo l'implementazione degli strumenti di copertura del codice che ti interessa?

Altri suggerimenti

Un metodo che funziona praticamente con ogni lingua è l'inserimento della strumentazione utilizzando un sistema di trasformazione del programma.

Un documento tecnico trovato qui: http://www.semdesigns.com/Company/Publications/TestCoverage.pdf spiega come ciò può essere fatto in generale.

La mia azienda, offre Semantic Designs, una vasta gamma di strumenti di copertura dei test che forniscono la cosiddetta copertura C1 sopra (ad esempio, "Copertura succursale") quindi sì è fatto comunemente), per diverse lingue (C, C ++, C #, Java, COBOL, PHP, tutto in più dialetti). Vedi www.semdesigns.com/Products/TestCoverage/index.html

In .NET, il modo preferito è utilizzare .NET API di profilazione , che fondamentalmente offre una serie di punti comuni nel CLR stesso.

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