C++ Academy · Lektion

Assertions og matchers

Skriv udtryksfulde kontroller

Lektion 2 af 413 trin

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ætter
  • ASSERT_*: 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_NE
  • EXPECT_LT, EXPECT_LE
  • EXPECT_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, Lt
  • Contains, ElementsAre, UnorderedElementsAre
  • HasSubstr, 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
Gratis at komme i gang

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

  1. Opsætning af GTest
  2. Assertions og matchers
  3. Fixtures og opsætning
  4. Mocking med GMock
← Tilbage til C++ Academy