C++ Academy · Lekcja

Asercje i matchery

Pisz czytelne sprawdzenia

Lekcja 2 z 413 kroki

Asercje i matchery to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 2 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.

Asercje wyrażają oczekiwania

Asercje GTest sprawdzają warunki wewnątrz testu. Występują w dwóch wariantach różniących się działaniem po niepowodzeniu.

  • EXPECT_*: niepowodzenie zostaje zapisane, a test jest kontynuowany
  • ASSERT_*: niepowodzenie natychmiast kończy bieżący test

EXPECT a ASSERT

Należy używać ASSERT_*, gdy kontynuowanie testu mogłoby spowodować awarię, na przykład po sprawdzeniu wartości null. W pozostałych przypadkach należy używać EXPECT_*, aby zobaczyć wszystkie niepowodzenia jednocześnie.

#include <gtest/gtest.h>

TEST(Demo, MixedChecks) {
    int* p = new int(5);
    ASSERT_NE(p, nullptr);
    EXPECT_EQ(*p, 5);
    delete p;
}

Asercje porównania

Podstawowe makra porównujące:

  • EXPECT_EQ, EXPECT_NE
  • EXPECT_LT, EXPECT_LE
  • EXPECT_GT, EXPECT_GE
#include <gtest/gtest.h>

TEST(Compare, Numbers) {
    EXPECT_LT(2, 3);
    EXPECT_GE(5, 5);
}

Asercje wartości logicznych

EXPECT_TRUE i EXPECT_FALSE bezpośrednio sprawdzają warunki logiczne.

#include <gtest/gtest.h>

bool is_even(int n) { return n % 2 == 0; }

TEST(Bool, Even) {
    EXPECT_TRUE(is_even(4));
    EXPECT_FALSE(is_even(3));
}

Porównywanie liczb zmiennoprzecinkowych

Nigdy nie należy używać EXPECT_EQ dla liczb zmiennoprzecinkowych. Należy użyć EXPECT_FLOAT_EQ, EXPECT_DOUBLE_EQ lub EXPECT_NEAR z określoną tolerancją.

#include <gtest/gtest.h>

TEST(Floats, Approx) {
    EXPECT_DOUBLE_EQ(0.1 + 0.2, 0.3);
    EXPECT_NEAR(3.14159, 3.14, 0.01);
}

Asercje dotyczące napisów

W przypadku napisów w stylu C należy używać EXPECT_STREQ / EXPECT_STRNE. Dla typu std::string działa EXPECT_EQ, ponieważ porównuje wartości.

#include <gtest/gtest.h>
#include <string>

TEST(Strings, Compare) {
    EXPECT_STREQ("hi", "hi");
    EXPECT_EQ(std::string("ok"), "ok");
}

Asercje wyjątków

Należy sprawdzić, czy kod zgłasza oczekiwany wyjątek.

#include <gtest/gtest.h>
#include <stdexcept>

void check(int n) {
    if (n < 0) throw std::runtime_error("neg");
}

TEST(Throws, Negative) {
    EXPECT_THROW(check(-1), std::runtime_error);
    EXPECT_NO_THROW(check(1));
}

Własne komunikaty o niepowodzeniu

Aby ułatwić diagnozowanie niepowodzeń, można przekazać dodatkowy kontekst do asercji za pomocą operatora <<.

#include <gtest/gtest.h>

TEST(Message, WithContext) {
    int x = 7;
    EXPECT_EQ(x, 7) << "x had unexpected value " << x;
}

Matchery GMock z EXPECT_THAT

EXPECT_THAT łączy wartość z matcherem, umożliwiając wyrażanie czytelnych warunków, na przykład EXPECT_THAT(v, ElementsAre(1, 2, 3)).

#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include <vector>
using ::testing::ElementsAre;

TEST(Matchers, Vector) {
    std::vector<int> v{1, 2, 3};
    EXPECT_THAT(v, ElementsAre(1, 2, 3));
}

Przydatne matchery

Typowe matchery to:

  • Eq, Ne, Gt, Lt
  • Contains, ElementsAre, UnorderedElementsAre
  • HasSubstr, StartsWith, EndsWith

Wybór właściwej asercji

Należy wybierać najbardziej szczegółową asercję, ponieważ generuje ona czytelniejsze komunikaty o niepowodzeniu niż ogólna asercja EXPECT_TRUE. EXPECT_EQ(a, b) wyświetla obie wartości, natomiast EXPECT_TRUE(a == b) tego nie robi.

Szybkie sprawdzenie

Proszę przypomnieć sobie różnicę między EXPECT a ASSERT.

Podsumowanie

Nauczył(a) się Pan/Pani korzystać z asercji GTest.

  • EXPECT_* kontynuuje test, a ASSERT_* go przerywa
  • Makra do porównań, wartości logicznych, liczb zmiennoprzecinkowych, napisów i wyjątków
  • Dodatkowy kontekst można przekazywać za pomocą <<
  • EXPECT_THAT i matchery służą do wyrażania czytelnych warunków
Bezpłatny start

Ucz się C++ dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
51
Lekcje
203

Często zadawane pytania

Czy lekcja „Asercje i matchery” jest bezpłatna?

Tak — pełny tekst „Asercje i matchery” 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 „Asercje i matchery”?

Pisz czytelne sprawdzenia Ć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 2 z 4.

Ile czasu zajmuje lekcja „Asercje i matchery”?

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

  1. Konfiguracja GTest
  2. Asercje i matchery
  3. Fixtures i konfiguracja
  4. Mockowanie za pomocą GMock
← Powrót do C++ Academy