Assertions og matchers
Skriv udtryksfulde kontroller
Assertions og matchers er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.
Kontroller udtrykker forventninger
GTest-kontroller undersøger betingelser inde i en test. De findes i to alvorlighedsgrader.
EXPECT_*: fejlen registreres, og testen fortsætterASSERT_*: fejlen stopper den aktuelle test med det samme
EXPECT kontra ASSERT
Brug ASSERT_*, når det ville føre til et nedbrud at fortsætte, f.eks. efter et null-tjek, og brug ellers EXPECT_*, så du kan se alle fejl på én gang.
#include <gtest/gtest.h>
TEST(Demo, MixedChecks) {
int* p = new int(5);
ASSERT_NE(p, nullptr);
EXPECT_EQ(*p, 5);
delete p;
}Sammenligningskontroller
De vigtigste sammenligningsmakroer:
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);
}Booleske kontroller
EXPECT_TRUE og EXPECT_FALSE kontrollerer boolske betingelser direkte.
#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));
}Sammenligninger af flydende tal
Brug aldrig EXPECT_EQ på flydende tal. Brug EXPECT_FLOAT_EQ, EXPECT_DOUBLE_EQ eller EXPECT_NEAR med en tolerance.
#include <gtest/gtest.h>
TEST(Floats, Approx) {
EXPECT_DOUBLE_EQ(0.1 + 0.2, 0.3);
EXPECT_NEAR(3.14159, 3.14, 0.01);
}Strengkontroller
Brug EXPECT_STREQ / EXPECT_STRNE til C-strenge. For std::string fungerer EXPECT_EQ, fordi den sammenligner efter værdi.
#include <gtest/gtest.h>
#include <string>
TEST(Strings, Compare) {
EXPECT_STREQ("hi", "hi");
EXPECT_EQ(std::string("ok"), "ok");
}Undtagelseskontroller
Bekræft, at koden udløser den forventede undtagelse.
#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));
}Tilpassede fejlmeddelelser
Skriv ekstra kontekst ind i en kontrol med << for at gøre fejl lettere at diagnosticere.
#include <gtest/gtest.h>
TEST(Message, WithContext) {
int x = 7;
EXPECT_EQ(x, 7) << "x had unexpected value " << x;
}GMock-matchere med EXPECT_THAT
EXPECT_THAT kombinerer en værdi med en matcher for at lave udtryksfulde kontroller, f.eks. 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));
}Nyttige matchere
Almindelige matchere omfatter:
Eq,Ne,Gt,LtContains,ElementsAre,UnorderedElementsAreHasSubstr,StartsWith,EndsWith
Vælg den rette kontrol
Foretræk den mest specifikke kontrol: Den giver tydeligere fejlmeddelelser end en generisk EXPECT_TRUE. EXPECT_EQ(a, b) udskriver begge værdier; EXPECT_TRUE(a == b) gør ikke.
Hurtigt tjek
Husk forskellen mellem EXPECT og ASSERT.
Opsummering
Du har lært GTest-kontroller.
EXPECT_*fortsætter;ASSERT_*afbryder testen- Makroer til sammenligninger, boolske værdier, flydende tal, strenge og undtagelser
- Skriv ekstra kontekst med
<< EXPECT_THAT+ matchere til udtryksfulde kontroller
Lær C++ med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 51
- Lektioner
- 203
Ofte stillede spørgsmål
Er lektionen “Assertions og matchers” gratis?
Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “Assertions og matchers”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Assertions og matchers”?
Skriv udtryksfulde kontroller Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på C++ Academy?
Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Assertions og matchers”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne C++ Academy-lektion?
Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Opsætning af GTest
- Assertions og matchers
- Fixtures og opsætning
- Mocking med GMock