Esiste un modo migliore per organizzare i miei test dei moduli che evitino un'esplosione di nuovi file sorgente?

2

Ho un modo accurato (così ho pensato) di avere ciascuno dei miei moduli in grado di produrre un eseguibile di test unitario se compilato con il flag -DTESTMODULE . Questo flag protegge una funzione main() che può accedere a tutti i dati e le funzioni statici nel modulo, senza includere un file C.

dal README :

  -- Modules --
The various modules were written and tested separately before being 
coupled together to achieve the necessary basic functionality.
Each module retains its unit-test, its main() function, guarded
by #ifdef TESTMODULE. 'make test' will compile and execute all the 
unit tests, producing copious output, but importantly exitting with 
an appropriate success or failure code, so the 'make test' command will 
fail if any of the tests fail.

    Module TOC
    __________

test   obj     src    header structures CONSTANTS
----   ---     ---     ---   --------------------
m      m.o     m.c     m.h   mfile mtab TABSZ
s      s.o     s.c     s.h   stack STACKSEGSZ
v      v.o     v.c     v.h   saverec_
       f.o     f.c     f.h    file
ob    ob.o    ob.c    ob.h   object
ar    ar.o    ar.c    ar.h    array
st    st.o    st.c    st.h    string
di    di.o    di.c    di.h   dichead dictionary
nm    nm.o    nm.c    nm.h    name
gc    gc.o    gc.c    gc.h    garbage collector
itp          itp.c   itp.h   context
  osunix.o osunix.c osunix.h  unix-dependent functions

È compilato da un po 'di makefile ,

m:m.c ob.h ob.o err.o $(CORE) itp.o $(OP)
        cc $(CFLAGS) -DTESTMODULE $(LDLIBS) -o $@ $< err.o     ob.o s.o ar.o st.o v.o di.o gc.o nm.o itp.o $(OP) f.o

dove il modulo è compilato con il proprio file C più ogni altro file oggetto tranne se stesso .

Ma sta creando difficoltà al gentile programmatore che si è offerto di scrivere i file Autotools per me. Quindi il modo più ovvio per renderlo "meno strano" sarebbe quello di eliminare tutte le funzioni main in file sorgente separati. Ma, ma ... Devo?

    
posta luser droog 19.09.2013 - 22:55
fonte

2 risposte

1

Ecco una soluzione semplice:

Scrivi i file wrapper che definiscono TESTMODULE e quindi includi il file .c appropriato. Ad esempio:

// m_test.c

#define TESTMODULE
#include "m.c"

Se dovessi regolare i file .c in modo che il codice effettivo che andrebbe nel file .o non fosse compilato quando avevi definito TESTMODULE, potresti compilare tutti i file .o normalmente e poi compilare il * _test File .c e collegamento con tutti i file .o (piuttosto che escludere quello che veniva compilato con il codice di test).

Ciò consente di mantenere i test e la definizione negli stessi file, semplificando l'ambiente di costruzione.

    
risposta data 20.09.2013 - 05:20
fonte
0

Un suggerimento dal mio amico programmatore gentile:

one solution for the link problem would be to use a different define for each file (TEST_MODULE_AR, TEST_MODULE_ITP, etc...)

E ciò sembra più semplice.

    
risposta data 20.09.2013 - 09:29
fonte

Leggi altre domande sui tag