Come mantenere le impostazioni per i moduli di test dell'unità C ++ in sincronia con i moduli del codice di produzione?

3
  • Nota: provengo da uno sfondo Windows / Visual-C ++.
  • Nota: ho già letto l'articolo di Michael Feathers Funzionante in modo efficace con Legacy Codice .
  • Nota: Ampia domanda, chiedendo risposte ristrette , cioè anche se non voglio limitare questa domanda a uno specifico compilatore / piattaforma / sistema, le risposte utili conterranno probabilmente solo una combinazione.

Il modello di sviluppo C ++

Anche idealmente, hai i tuoi file sorgente ben organizzati:

  • Klass1.h / cpp
  • Klass2.h / cpp
  • CustomAlgorithms.h (solo intestazione)
  • main.cpp (potrebbe non essere necessario per un modulo lib dyn / static)

Quindi, l'applicazione è composta da moduli n (anche se sono solo librerie statiche collegate tutte insieme a un modulo eseguibile alla fine.

Per ottenere dai moduli sorgente ai moduli binari, è necessario disporre di file di progetto / creare file o altro. Questi file "dicono" al compilatore (e al linker) come generare i moduli binari dal codice sorgente.

Aggiunta dei test delle unità

Indipendentemente dal Framework di test che utilizzi e indipendentemente da dove inserisci il tuo codice di test, devi produrre moduli binari diversi / aggiuntivi per il tuo codice di test che per il tuo codice di produzione . (Almeno per qualsiasi eseguibile o libreria dinamica, le librerie statiche dovrebbero essere un po 'più semplici.)

Se hai bisogno di produrre diversi moduli binari per il tuo codice di test, allora devi mantenere un insieme separato / aggiuntivo di impostazioni (del compilatore) per questo codice di prova .

Con Visual Studio puoi provare a ridurre al minimo la quantità di lavoro utilizzando i file vsprops, ma ti rimane un file di progetto separato per i tuoi test e i tuoi moduli di produzione. Questo può diventare problematico da mantenere.

Con un sistema make, non sono sicuro di come sia fatto, ma desidero esplicitamente che questa domanda comprenda entrambi, poiché le tecniche da uno possono tradurre nell'altro.

Quindi, TL; DR , come ti impedisci di dover modificare manualmente due diversi "file di progetto" (uno per il test, uno per la produzione), ogni volta che aggiungi o modifichi qualcosa in le impostazioni di produzione. (*)

(*) Potresti pensare di non cambiare le cose spesso, ma di pensare a un progetto su scala reale con dozzine (centinaia) di moduli e dozzine di sviluppatori. Ogni piccola quantità di lavoro manuale che salvi per lo scaffold del test si moltiplica.

    
posta Martin Ba 18.10.2011 - 14:59
fonte

3 risposte

2

Utilizza CMake o un altro sistema di generazione (meta-) sano che si occupa automaticamente delle impostazioni di costruzione, oppure ti permette di condividerli attraverso i progetti.

    
risposta data 19.10.2011 - 13:19
fonte
1

Questo è il modo in cui abbiamo finito per impostare i nostri progetti:

Abbiamo aggiunto nuove configurazioni di "Test di debug" / "Test release" per ogni progetto esistente che abbiamo, puoi aggiungere solo a quelli che hanno test unitari in esso.

Per i progetti .exe / .dll disabilitiamo il main.cpp originale dalla compilazione e lo sostituiamo con quello che istanzia il framework di test (es. gtest) e esegue tutti i test, i test sono in file .cpp separati che sono anche escluso dalla compilazione in configurazioni regolari (Release / Debug) e abilitato solo nelle configurazioni di Test.

Per i progetti .lib abbiamo anche nuove configurazioni "Test debug" / "Test release" e lì convertiamo la libreria statica in un file .exe e forniamo un main.cpp che istanzia il framework di testing ed esegue i test e mette alla prova se stessi I file relativi ai test sono esclusi dalla compilazione nelle configurazioni di rilascio / debug.

    
risposta data 13.12.2017 - 09:45
fonte
1

Come ragazzo UNIX (principalmente) la prima cosa che farei è scrivere una sceneggiatura per gestire queste cose per me. Mai fare nulla di leggermente complesso manualmente se puoi facilmente copiarlo.

Lo script può accettare un file da aggiungere o rimuovere dal progetto e aggiornare tutti i progetti pertinenti. Lo script potrebbe anche accettare il nome di un progetto e dedurne il progetto di test, se vuoi utilizzare le convenzioni.

La linea di fondo è questa: se sai come farlo manualmente, ed è noioso - scriptarlo.

    
risposta data 19.10.2011 - 14:56
fonte

Leggi altre domande sui tag