C++ Academy · Lektion

Assertions och matchers

Skriv uttrycksfulla kontroller

Lektion 2 av 413 steg

Assertions och matchers är en gratis lektion i C++ Academy på CoddyKit. Detta är lektion 2 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för C++ Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C++ Academy innehåller totalt 4 lektioner.

Assertioner uttrycker förväntningar

GTest-assertioner kontrollerar villkor i ett test. De finns i två allvarlighetsnivåer.

  • EXPECT_*: felet registreras och testet fortsätter
  • ASSERT_*: felet avbryter det aktuella testet omedelbart

EXPECT kontra ASSERT

Använd ASSERT_* när en fortsättning skulle orsaka en krasch, till exempel efter en nullkontroll. Använd annars EXPECT_* så att ni ser alla fel på en gång.

#include <gtest/gtest.h>

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

Assertioner för jämförelser

De viktigaste jämförelsemakrona:

  • 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);
}

Booleska assertioner

EXPECT_TRUE och EXPECT_FALSE kontrollerar booleska villkor direkt.

#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));
}

Jämförelser av flyttal

Använd aldrig EXPECT_EQ för flyttal. Använd EXPECT_FLOAT_EQ, EXPECT_DOUBLE_EQ eller EXPECT_NEAR med en tolerans.

#include <gtest/gtest.h>

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

Strängassertioner

Använd EXPECT_STREQ / EXPECT_STRNE för C-strängar. För std::string fungerar EXPECT_EQ, eftersom jämförelsen görs efter värde.

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

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

Assertioner för undantag

Verifiera att koden kastar det förväntade undantaget.

#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));
}

Egna felmeddelanden

Skicka extra kontext till en assertion med << så blir fel enklare att diagnostisera.

#include <gtest/gtest.h>

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

GMock-matchers med EXPECT_THAT

EXPECT_THAT kombinerar ett värde med en matcher för uttrycksfulla kontroller, till exempel 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));
}

Användbara matchers

Vanliga matchers omfattar:

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

Välj rätt assertion

Föredra den mest specifika assertionen: den ger tydligare felmeddelanden än en generell EXPECT_TRUE. EXPECT_EQ(a, b) skriver ut båda värdena, medan EXPECT_TRUE(a == b) inte gör det.

Snabbkontroll

Kom ihåg skillnaden mellan EXPECT och ASSERT.

Sammanfattning

Ni har lärt er GTest-assertioner.

  • EXPECT_* fortsätter; ASSERT_* avbryter testet
  • Makron för jämförelser, booleska värden, flyttal, strängar och undantag
  • Skicka extra kontext med <<
  • EXPECT_THAT + matchers för uttrycksfulla kontroller
Gratis att börja

Lär dig C++ med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
51
Lektioner
203

Vanliga frågor

Är lektionen ”Assertions och matchers” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen C++ Academy, inklusive ”Assertions och matchers”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i C++ Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Assertions och matchers”?

Skriv uttrycksfulla kontroller Ni övar på C++ Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig C++ Academy?

Du behöver inga förkunskaper. Utbildningen i C++ Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”Assertions och matchers”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här C++ Academy-lektionen?

Ja. Varje C++ Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Konfigurera GTest
  2. Assertions och matchers
  3. Fixtures och konfiguration
  4. Mockning med GMock
← Tillbaka till C++ Academy