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.
- 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ó.
- 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; }
- 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.
- 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(); }
- Exercicis Pràctics
Exercici 1: Depuració
- Escriu un programa que calculi la mitjana de tres nombres.
- Introdueix un error lògic en el càlcul.
- Utilitza un depurador per identificar i corregir l'error.
Exercici 2: Proves Unitàries
- Escriu una funció que calculi el màxim comú divisor (MCD) de dos nombres.
- 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(); }
- 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.
Curs de Programació en C++
Mòdul 1: Introducció al C++
- Introducció al C++
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsica
- Variables i Tipus de Dades
- Entrada i Sortida
Mòdul 2: Estructures de Control
Mòdul 3: Funcions
- Introducció a les Funcions
- Paràmetres de Funció i Tipus de Retorn
- Sobrecàrrega de Funcions
- Recursivitat
Mòdul 4: Arrays i Strings
Mòdul 5: Punteres i Referències
- Introducció als Punteres
- Aritmètica de Punteres
- Punteres i Arrays
- Referències
- Assignació Dinàmica de Memòria
Mòdul 6: Programació Orientada a Objectes
- Introducció a la POO
- Classes i Objectes
- Constructors i Destructors
- Herència
- Polimorfisme
- Encapsulació i Abstracció
Mòdul 7: Temes Avançats
- Plantilles
- Gestió d'Excepcions
- Entrada/Sortida de Fitxers
- Biblioteca de Plantilles Estàndard (STL)
- Expressions Lambda
- Multifil