0Pricing
C++ Academy · Lezione

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 continua
  • ASSERT_*: 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_NE
  • EXPECT_LT, EXPECT_LE
  • EXPECT_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, Lt
  • Contains, ElementsAre, UnorderedElementsAre
  • HasSubstr, 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

  1. Configurare GTest
  2. Asserzioni e matcher
  3. Fixture e configurazione
  4. Mocking con GMock
← Torna a C++ Academy