Asserzioni e matcher
Scrivere controlli espressivi
Asserzioni e matcher è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.
Le asserzioni esprimono aspettative
Le asserzioni di GTest verificano condizioni all'interno di un test. Hanno due livelli di severità.
EXPECT_*: il fallimento viene registrato e il test continuaASSERT_*: il fallimento interrompe immediatamente il test corrente
EXPECT e ASSERT a confronto
Utilizzi ASSERT_* quando continuare potrebbe causare un crash, ad esempio dopo un controllo di nullità, e EXPECT_* negli altri casi, così vedrà tutti i fallimenti contemporaneamente.
#include <gtest/gtest.h>
TEST(Demo, MixedChecks) {
int* p = new int(5);
ASSERT_NE(p, nullptr);
EXPECT_EQ(*p, 5);
delete p;
}Asserzioni di confronto
Le principali macro di confronto:
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);
}Asserzioni booleane
EXPECT_TRUE e EXPECT_FALSE verificano direttamente le condizioni booleane.
#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));
}Confronti in virgola mobile
Non utilizzi mai EXPECT_EQ sui valori in virgola mobile. Utilizzi EXPECT_FLOAT_EQ, EXPECT_DOUBLE_EQ o EXPECT_NEAR con una tolleranza.
#include <gtest/gtest.h>
TEST(Floats, Approx) {
EXPECT_DOUBLE_EQ(0.1 + 0.2, 0.3);
EXPECT_NEAR(3.14159, 3.14, 0.01);
}Asserzioni sulle stringhe
Per le stringhe C utilizzi EXPECT_STREQ / EXPECT_STRNE. Per std::string, EXPECT_EQ funziona perché confronta per valore.
#include <gtest/gtest.h>
#include <string>
TEST(Strings, Compare) {
EXPECT_STREQ("hi", "hi");
EXPECT_EQ(std::string("ok"), "ok");
}Asserzioni sulle eccezioni
Verifichi che il codice generi l'eccezione prevista.
#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));
}Messaggi di errore personalizzati
Inserisca informazioni aggiuntive in un'asserzione con << per rendere più semplice la diagnosi dei fallimenti.
#include <gtest/gtest.h>
TEST(Message, WithContext) {
int x = 7;
EXPECT_EQ(x, 7) << "x had unexpected value " << x;
}Matcher di GMock con EXPECT_THAT
EXPECT_THAT combina un valore con un matcher per eseguire verifiche espressive, ad esempio 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));
}Matcher utili
Tra i matcher più comuni:
Eq,Ne,Gt,LtContains,ElementsAre,UnorderedElementsAreHasSubstr,StartsWith,EndsWith
Scegliere l'asserzione giusta
Preferisca l'asserzione più specifica: produce messaggi di errore più chiari rispetto a un generico EXPECT_TRUE. EXPECT_EQ(a, b) stampa entrambi i valori, mentre EXPECT_TRUE(a == b) no.
Verifica rapida
Richiami la differenza tra EXPECT e ASSERT.
Riepilogo
Ha imparato a usare le asserzioni di GTest.
EXPECT_*continua;ASSERT_*interrompe il test- Macro per confronti, valori booleani, numeri in virgola mobile, stringhe ed eccezioni
- Inserisca informazioni aggiuntive con
<< EXPECT_THAT+ matcher per verifiche espressive
Domande Frequenti
La lezione «Asserzioni e matcher» è gratuita?
Sì — il testo completo di «Asserzioni e matcher» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.
Cosa imparerò in «Asserzioni e matcher»?
Scrivere controlli espressivi Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C++ Academy?
Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Asserzioni e matcher»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C++ Academy?
Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Configurare GTest
- Asserzioni e matcher
- Fixture e configurazione
- Mocking con GMock