byłem w podobnej sytuacji i mam to skonfigurować w taki sposób, aby skutecznie zezwoli na osiągnięcie tego samego celu, jakim jest odpowiedzią Mike'a Kinghan w miarę kompilator ale chodzi o to inaczej niż z punktu widzenia użytkownika.
Co zrobiłem, to stworzyłem niestandardową konfigurację, którą nazwałem "Testowanie". Możesz utworzyć nową konfigurację, otwierając ustawienia projektu, wybierając "Configuration Manager ..." i wybierając "New ..." w polu wyboru konfiguracji.
Po wyświetleniu monitu wybrałem skopiowanie ustawień z domyślnej konfiguracji "Debugowanie", dzięki czemu mogę używać debuggera z moimi testami tak, jakbym był w konfiguracji "Debugowanie".
W nowej konfiguracji testowania ustawiam opcje kompilatora i łącznika, aby normalnie używać testu Google.
Ważną zmianą właściwości jest zdefiniowanie zmiennej preprocesora, którą nazwałem "TESTOWANIE".
przepisałem mój „main.cpp”, aby wyglądać tak:
...
// includes
// functions
// whatever
...
#ifdef TESTING
#include <gtest/gtest.h>
#endif
int main(int argc, char **argv) {
#ifdef TESTING
::testing::InitGoogleTest(&argc, argv);
int val = RUN_ALL_TESTS();
getchar(); // not necessary, but keeps the console open
return val;
#endif
// rest of main() as normal...
}
Co próbuję wskazać jest to, że tylko zmienione kilka linii tuż gdzie main
jest zdefiniowany, I don” t muszą wprowadzać zmiany brutto w całym pliku.
Teraz, gdy wszystko jest gotowe, po prostu utworzyłem nowy folder źródłowy dla moich testów i utworzyłem tam pliki ".cpp". Aby uniknąć wzdęcia normalny plik wykonywalny, ja owinąć te pliki z czekiem na zmiennej testowania, więc mam coś takiego:
tests/Test.cpp:
#ifdef TESTING
#include <gtest/gtest.h>
#include "my_class_header.h"
TEST(TestMyClass, test_something) {
// perform some test on class
}
#endif
Myślę, że te pliki jeszcze dostać „hit” przez kompilator w konfiguracjach Debug and Release, więc posiadanie ich może spowolnić kompilację, ale obiekty Debug and Release nie zostaną nadpisane kodem testowym.
Dwa dania na wynos to:
- Stosując tę metodę, kod badania są nadal organizowane oddzielnie od kodu aplikacji, ale nadal mieszka w tym samym projekcie Visual Studio, które mogą lub nie mogą być korzystne. Osobiście nie chcę zarządzać/martwić się o drugi projekt.
- Tak jak powiedział Mike Kinghan, samodzielne zarządzanie plikami
.obj
i łączenie się nimi może stać się obowiązkiem, ale za pomocą tej metody domyślne ustawienia Visual Studio zarządzają tym za Ciebie.
Jedną wadą jest to, że efektywnie redundantne kopie wszystkich plików obiektowych zostaną utworzone w katalogu wyjściowym "Testowanie".Przy większej konfiguracji, na pewno musi istnieć sposób na "udostępnianie" plików obiektów Debug, ale nie miałem powodu, aby posunąć się tak daleko.
Jest to bardzo prosta metoda, która może być znacznie łatwiejsza niż przekształcenie aplikacji w oddzielne biblioteki i główną. Ja nie miłość przy użyciu preprocessor wankery, ale w tym przypadku jest dość proste, nie za dużo kodu, i spełnia dokładnie to, czego potrzebuje. Zawsze można uruchomić testy w inny sposób, bez korzystania z preprocesora.
wyniki testu to inny przykład, który zależy od tego, co chcesz przetestować, włączając pliki w projekcie testowym, lub po prostu oddziel dział w niezależnej bibliotece dll – ahmedsafan86
Jeśli chcesz mieć plik exe dla aplikacji i inny dla testy jednostkowe, musisz pobrać kod, który chcesz przetestować i zbudować go w bibliotece. Gdy to zrobisz, możesz połączyć bibliotekę z obu exe. –
Czy możesz wyjaśnić dalej: a) Stworzyłeś kilka klas/API specyficznych dla aplikacji dla aplikacji konsolowej, które chcesz testować jednostkowo za pomocą googletest. b) Chcesz przetestować zachowanie '.exe' przy użyciu googletest. Który? –