Asercje i matchery
Pisz czytelne sprawdzenia
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 kontynuowanyASSERT_*: 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_NEEXPECT_LT,EXPECT_LEEXPECT_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,LtContains,ElementsAre,UnorderedElementsAreHasSubstr,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, aASSERT_*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_THATi matchery służą do wyrażania czytelnych warunków
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
- Konfiguracja GTest
- Asercje i matchery
- Fixtures i konfiguracja
- Mockowanie za pomocą GMock