Assertions och matchers
Skriv uttrycksfulla kontroller
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ätterASSERT_*: 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_NEEXPECT_LT,EXPECT_LEEXPECT_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,LtContains,ElementsAre,UnorderedElementsAreHasSubstr,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
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
- Konfigurera GTest
- Assertions och matchers
- Fixtures och konfiguration
- Mockning med GMock