Fixtures i konfiguracja
Współdziel konfigurację testów
Fixtures i konfiguracja to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.
Współdzielenie konfiguracji między testami
Gdy kilka testów potrzebuje tych samych obiektów, fixture pozwala zdefiniować tę konfigurację jeden raz. Fixture to klasa dziedzicząca po ::testing::Test.
Definiowanie fixture
Składowe fixture są dostępne w każdym używającym jej teście. Funkcja SetUp() jest wykonywana przed każdym testem, a TearDown() po nim.
#include <gtest/gtest.h>
#include <vector>
class VectorTest : public ::testing::Test {
protected:
std::vector<int> v;
void SetUp() override { v = {1, 2, 3}; }
};Używanie TEST_F
Testy korzystające z fixture zapisuje się za pomocą TEST_F, przekazując nazwę klasy fixture jako pierwszy argument.
#include <gtest/gtest.h>
#include <vector>
class VectorTest : public ::testing::Test {
protected:
std::vector<int> v{1, 2, 3};
};
TEST_F(VectorTest, HasThree) {
EXPECT_EQ(v.size(), 3u);
}
TEST_F(VectorTest, FirstIsOne) {
EXPECT_EQ(v.front(), 1);
}Nowa instancja dla każdego testu
GTest tworzy nowy obiekt fixture dla każdego testu. Testy nigdy nie współdzielą zmiennego stanu, dzięki czemu pozostają niezależne, a ich kolejność nie ma znaczenia.
SetUp a konstruktor
Składowe można inicjalizować w konstruktorze lub w funkcji SetUp(). Z funkcji SetUp() należy korzystać, gdy inicjalizacja może zgłosić wyjątek lub gdy potrzebne jest bezpieczne wywoływanie metod wirtualnych.
#include <gtest/gtest.h>
class Resource : public ::testing::Test {
protected:
int* data = nullptr;
void SetUp() override { data = new int(10); }
void TearDown() override { delete data; }
};
TEST_F(Resource, HasTen) {
EXPECT_EQ(*data, 10);
}TearDown do sprzątania
TearDown() zwalnia zasoby uzyskane w SetUp(). W przypadku składowych korzystających z RAII destruktor często wykonuje to automatycznie, więc funkcja TearDown() może w ogóle nie być potrzebna.
Konfiguracja na poziomie zestawu
W przypadku kosztownych współdzielonych zasobów należy użyć statycznych funkcji SetUpTestSuite() i TearDownTestSuite(). Są one wykonywane raz dla całego zestawu, a nie przed każdym testem.
#include <gtest/gtest.h>
class DbTest : public ::testing::Test {
protected:
static void SetUpTestSuite() { /* open shared connection */ }
static void TearDownTestSuite() { /* close it */ }
};Na test a na zestaw
Należy dokonać uważnego wyboru.
SetUp/TearDown: dla każdego testu, izolowane i bezpieczneSetUpTestSuite/TearDownTestSuite: dla całego zestawu, współdzielone i szybsze, ale testy mogą wzajemnie na siebie wpływać
Metody pomocnicze
Fixture mogą zawierać metody pomocnicze używane przez wiele testów, dzięki czemu każdy test może skupiać się na swoich asercjach.
#include <gtest/gtest.h>
#include <string>
class ParserTest : public ::testing::Test {
protected:
int parse(const std::string& s) { return std::stoi(s); }
};
TEST_F(ParserTest, ParsesNumber) {
EXPECT_EQ(parse("42"), 42);
}Środowisko globalne
W przypadku konfiguracji obejmującej cały proces, uruchamianej raz przed dowolnym testem, należy zarejestrować element ::testing::Environment za pomocą AddGlobalTestEnvironment. Jest to przydatne między innymi do rejestrowania informacji lub inicjalizacji frameworka.
Zachowywanie niezależności testów
Ponieważ każdy TEST_F otrzymuje nową fixture, nigdy nie należy polegać na efektach ubocznych innego testu. Niezależność ułatwia diagnozowanie niepowodzeń i pozwala bezpiecznie uruchamiać testy równolegle.
Szybkie sprawdzenie
Proszę przypomnieć sobie cykl życia fixture.
Podsumowanie
Nauczył(a) się Pan/Pani korzystać z fixture.
- Należy dziedziczyć po
::testing::Testi używaćTEST_F SetUp/TearDownsą wykonywane dla każdego testu, a za każdym razem tworzony jest nowy obiektSetUpTestSuitesłuży do współdzielonych zasobów używanych raz na zestaw- Metody pomocnicze i środowiska globalne ułatwiają pracę z większymi zestawami testów
Często zadawane pytania
Czy lekcja „Fixtures i konfiguracja” jest bezpłatna?
Tak — pełny tekst „Fixtures i konfiguracja” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Fixtures i konfiguracja”?
Współdziel konfigurację testów Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C++ Academy?
Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Fixtures i konfiguracja”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?
Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Konfiguracja GTest
- Asercje i matchery
- Fixtures i konfiguracja
- Mockowanie za pomocą GMock