Abbiamo una base di codice legacy interamente in C ++. Il nostro sistema di build è CMake. La mia prima pugnalata al test unitario è stata la seguente:
- Definisci un obiettivo (
LibraryA
). Questa libreria contiene il codice da testare. - Definisci un target di test unitario per file di test CPP in
LibraryA
in fase di test e link controLibraryA.lib
.
Fondamentalmente la struttura di origine è così:
LibraryA/
Source/
Utils/
MyClass.cpp
MyClass.hpp
AnotherClass.cpp
AnotherClass.hpp
Network/
Socket.cpp
Socket.hpp
Tests/
Utils/
TestMyClass.cpp
TestAnotherClass.cpp
Quello che abbiamo qui è una struttura a specchio della directory Source
all'interno di Tests
. Questa struttura mi permette di usare l'inclusione degli ordini al livello della riga di comando del compilatore per dare la priorità a dove trovare le intestazioni delle classi per scopi di derisione. Ogni file Test*.cpp
in Tests
risulta in 1 eseguibile. Quindi 1 test eseguibile per classe in fase di test.
Il problema è che sto collegando LibraryA.lib
nel mio eseguibile di test. Ciò si traduce in violazione ODR perché se voglio prendere in giro la classe Socket, il LibraryA.lib
avrà già compilato simboli in esso. Ora non riesco a deriderlo senza duplicare i simboli e il linker si lamenterà.
L'impostazione generale della struttura di test delle unità è stata una grande sofferenza dal punto di vista del sistema di costruzione quando si tratta di prendere in giro.
C'è una buona soluzione a questo problema? Il mio approccio alla struttura di test è completamente sbagliato?