Quali tecniche hai effettivamente utilizzato con successo per migliorare la copertura del codice?

StackOverflow https://stackoverflow.com/questions/170751

  •  05-07-2019
  •  | 
  •  

Domanda

Raggiungo regolarmente la copertura del 100% delle librerie usando TDD, ma non sempre, e sembra che ci siano sempre parti di applicazioni rimaste non testate e scoperte.
Quindi ci sono casi in cui inizi con un codice legacy che ha pochissimi test e pochissima copertura.

Indica qual è la tua situazione e cosa ha funzionato almeno migliorando la copertura.
Presumo che tu stia misurando la copertura durante i test unitari, ma dico se stai usando altre tecniche.

È stato utile?

Soluzione

Elimina codice.

Non è snarky, ma in realtà serio. Ogni volta che vedevo la minima quantità di duplicazione del codice o anche il codice che non riuscivo a eseguire, l'ho cancellato. Questa maggiore copertura e maggiore manutenibilità.

Dovrei notare che questo è più applicabile per aumentare la copertura di vecchie basi di codice rispetto a nuove basi di codice.

Altri suggerimenti

Suppongo che tu abbia letto " Codice coperto vs. Codice testato " , giusto?

Come indicato in questa domanda,

  

Anche con il 100% di copertura del blocco + 100% di copertura dell'arco + 100% di codice rettilineo privo di errori per almeno un percorso, ci saranno comunque dati di input che eseguono percorsi / loop in modi che presentano più bug.

Ora utilizzo eclemma , basato su EMMA e questo strumento di copertura del codice spiega perché il 100% del codice non è sempre possibile: a causa di linee parzialmente coperte dovuto a:

  • Filiali implicite sulla stessa linea.
  • Codice costruttore condiviso.
  • Filiali implicite dovute a blocchi finalmente.
  • Filiali implicite dovute a Class.forName nascosto ().

Quindi tutti e 4 questi casi potrebbero essere buoni candidati per il refactoring che porta a una migliore copertura del codice.

Ora, sono d'accordo con la risposta di Frank Krueger. Alcuni codici non coperti potrebbero anche essere un'indicazione di alcuni refactoring da eseguire, incluso un codice da eliminare effettivamente;)

Le due cose che hanno avuto il maggiore impatto sui progetti su cui ho lavorato sono:

  1. Periodicamente "ricordando" il team di sviluppo per implementare effettivamente i test unitari e rivedere come scrivere test efficaci.
  2. Generare un rapporto sulla copertura complessiva dei test e diffonderlo tra i responsabili dello sviluppo.

Usiamo Perl, quindi Devel :: Cover è stato molto utile per noi. Mostra la copertura per istruzione, la copertura delle filiali e la copertura condizionale durante i test unitari, nonché elementi come la copertura POD. Utilizziamo l'output HTML con green facili da riconoscere per "100%", attraverso giallo e rosso per livelli di copertura inferiori.

MODIFICA: per espandere un po 'le cose:

  • Se la copertura condizionale non è completa, esaminare le condizioni per l'interdipendenza. Se è lì, refactor. In caso contrario, dovresti essere in grado di estendere i test per raggiungere tutte le condizioni.
  • Se la copertura condizionale e di filiale sembra completa ma la copertura dell'istruzione non lo è, hai scritto i condizionali in modo errato (ad esempio, sempre tornando presto da un sottotitolo quando non volevi) o hai un codice aggiuntivo che può essere rimosso in modo sicuro.

Test FIT ha migliorato la copertura del nostro codice. È stato fantastico perché ha un approccio completamente diverso.

Background: abbiamo un mix di legacy e nuovo codice. Cerchiamo di testare l'unità / integrazione le nuove cose il più possibile, ma poiché stiamo migrando verso Hibernate / Postgres e lontano da un OODB, non ha molto senso testare il codice legacy.

Per chi non lo sapesse, FIT è un modo per testare il software dal punto di vista dell'utente. In sostanza, è possibile specificare il comportamento desiderato nelle tabelle HTML: le tabelle specificano le azioni sul software e i risultati desiderati. Il nostro team scrive "codice colla" (noto anche come test FIT) che mappa le azioni alle chiamate contro il codice. Si noti che questi test funzionano in una vista "dallo spazio" rispetto ai test unitari.

Utilizzando questo approccio, abbiamo aumentato la copertura del codice di diversi punti percentuali. Un ulteriore vantaggio è che questi test eseguiranno il bridge tra le versioni: testeranno il codice legacy ma, successivamente, il nuovo codice. cioè servono come test di regressione, in un certo senso.

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