En aquest tema, aprendrem sobre les tècniques de depuració i proves en C++. La depuració i les proves són parts essencials del cicle de desenvolupament de programari, ja que ens ajuden a identificar i corregir errors, així com a assegurar-nos que el nostre codi funcioni correctament.

  1. Introducció a la Depuració

Què és la Depuració?

La depuració és el procés de trobar i corregir errors (bugs) en el codi. Els errors poden ser de diversos tipus, com ara errors de sintaxi, errors lògics o errors d'execució.

Eines de Depuració

Algunes de les eines de depuració més utilitzades en C++ són:

  • GDB (GNU Debugger): Una eina de depuració per a programes escrits en C, C++ i altres llenguatges.
  • LLDB: Un depurador que forma part del projecte LLVM.
  • Depuradors integrats en IDEs: Com ara el depurador de Visual Studio, CLion, Code::Blocks, etc.

Modes de Depuració

  • Depuració interactiva: Utilitzant un depurador per executar el codi pas a pas.
  • Depuració per registre (logging): Afegint missatges de registre al codi per rastrejar l'execució.

  1. Tècniques de Depuració

Depuració Pas a Pas

Permet executar el codi línia per línia per observar el comportament del programa i identificar on es produeix l'error.

#include <iostream>
using namespace std;

int main() {
    int a = 5;
    int b = 0;
    int c = a / b; // Error: divisió per zero
    cout << "Resultat: " << c << endl;
    return 0;
}

Punts de Trencament (Breakpoints)

Els punts de trencament permeten aturar l'execució del programa en una línia específica per inspeccionar l'estat del programa.

Inspecció de Variables

Permet veure els valors de les variables en temps d'execució per identificar valors inesperats.

Registre (Logging)

Afegir missatges de registre al codi per rastrejar l'execució i identificar on es produeixen els errors.

#include <iostream>
using namespace std;

int main() {
    int a = 5;
    int b = 0;
    cout << "Valor de a: " << a << endl;
    cout << "Valor de b: " << b << endl;
    int c = a / b; // Error: divisió per zero
    cout << "Resultat: " << c << endl;
    return 0;
}

  1. Introducció a les Proves

Què són les Proves?

Les proves són el procés de verificar que el codi funciona correctament i compleix amb els requisits especificats.

Tipus de Proves

  • Proves Unitàries: Verifiquen el funcionament de components individuals del codi.
  • Proves d'Integració: Verifiquen la interacció entre diferents components del codi.
  • Proves de Sistema: Verifiquen el sistema complet en un entorn que simula l'entorn de producció.
  • Proves de Regressió: Asseguren que els canvis en el codi no introdueixin nous errors.

  1. Eines de Proves

Frameworks de Proves Unitàries

  • Google Test (gtest): Un framework de proves unitàries per a C++.
  • Catch2: Un altre framework popular per a proves unitàries en C++.

Exemple de Prova Unitària amb Google Test

#include <gtest/gtest.h>

// Funció a provar
int suma(int a, int b) {
    return a + b;
}

// Prova unitària
TEST(SumaTest, ProvaPositiva) {
    EXPECT_EQ(suma(1, 2), 3);
    EXPECT_EQ(suma(5, 5), 10);
}

TEST(SumaTest, ProvaNegativa) {
    EXPECT_EQ(suma(-1, -1), -2);
    EXPECT_EQ(suma(-5, 5), 0);
}

int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

  1. Exercicis Pràctics

Exercici 1: Depuració

  1. Escriu un programa que calculi la mitjana de tres nombres.
  2. Introdueix un error lògic en el càlcul.
  3. Utilitza un depurador per identificar i corregir l'error.

Exercici 2: Proves Unitàries

  1. Escriu una funció que calculi el màxim comú divisor (MCD) de dos nombres.
  2. Escriu proves unitàries per a la funció utilitzant Google Test.

Solució de l'Exercici 2

#include <gtest/gtest.h>

// Funció per calcular el MCD
int mcd(int a, int b) {
    while (b != 0) {
        int t = b;
        b = a % b;
        a = t;
    }
    return a;
}

// Proves unitàries
TEST(MCDTest, ProvaPositiva) {
    EXPECT_EQ(mcd(10, 5), 5);
    EXPECT_EQ(mcd(21, 14), 7);
}

TEST(MCDTest, ProvaNegativa) {
    EXPECT_EQ(mcd(0, 5), 5);
    EXPECT_EQ(mcd(5, 0), 5);
}

int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

  1. Resum

En aquesta secció, hem après sobre la importància de la depuració i les proves en el desenvolupament de programari. Hem explorat diverses tècniques de depuració, com ara la depuració pas a pas, els punts de trencament i el registre. També hem vist com utilitzar frameworks de proves unitàries com Google Test per assegurar-nos que el nostre codi funcioni correctament. La depuració i les proves són habilitats essencials per a qualsevol programador, ja que ens ajuden a escriure codi més robust i fiable.

© Copyright 2024. Tots els drets reservats