Introducció
Les proves automatitzades són una part fonamental de la Integració Contínua (CI). Aquestes proves permeten verificar automàticament que el codi nou o modificat no introdueix errors en el sistema existent. En aquesta secció, aprendrem sobre els diferents tipus de proves automatitzades, com configurar-les i com integrar-les en el procés de CI.
Objectius
- Entendre els diferents tipus de proves automatitzades.
- Aprendre a configurar proves automatitzades.
- Integrar proves automatitzades en el procés de CI.
Tipus de Proves Automatitzades
- Proves Unitàries
Les proves unitàries verifiquen el funcionament de components individuals del codi, com ara funcions o mètodes. Aquestes proves són ràpides d'executar i proporcionen una retroalimentació immediata sobre la qualitat del codi.
Exemple de Prova Unitària en Python:
import unittest def suma(a, b): return a + b class TestSuma(unittest.TestCase): def test_suma(self): self.assertEqual(suma(1, 2), 3) self.assertEqual(suma(-1, 1), 0) self.assertEqual(suma(0, 0), 0) if __name__ == '__main__': unittest.main()
- Proves d'Integració
Les proves d'integració verifiquen que diferents components del sistema funcionen correctament quan es combinen. Aquestes proves són més complexes que les proves unitàries i poden requerir la configuració de bases de dades o altres serveis externs.
Exemple de Prova d'Integració en Node.js:
const request = require('supertest'); const app = require('../app'); // Suposant que 'app' és la teva aplicació Express describe('GET /users', function() { it('respon amb una llista d'usuaris', function(done) { request(app) .get('/users') .expect('Content-Type', /json/) .expect(200, done); }); });
- Proves de Sistema
Les proves de sistema verifiquen el sistema complet en un entorn que simula la producció. Aquestes proves asseguren que totes les parts del sistema funcionen conjuntament com s'espera.
- Proves de Regressió
Les proves de regressió asseguren que els canvis recents en el codi no han introduït errors en funcionalitats que anteriorment funcionaven correctament. Aquestes proves es poden automatitzar per executar-se després de cada canvi en el codi.
Configuració de Proves Automatitzades
- Configuració d'un Entorn de Proves
Per configurar un entorn de proves, necessitem:
- Un framework de proves (per exemple, JUnit per a Java, pytest per a Python).
- Un entorn d'execució (per exemple, un servidor de proves o un contenidor Docker).
- Dades de prova (per exemple, bases de dades de prova).
- Escriure Proves Automatitzades
Quan escrivim proves automatitzades, és important seguir les millors pràctiques:
- Escriure proves petites i enfocades.
- Utilitzar noms descriptius per a les proves.
- Assegurar-se que les proves siguin repetibles i independents.
- Executar Proves Automatitzades
Les proves automatitzades es poden executar manualment o com a part d'un pipeline de CI. Les eines de CI com Jenkins, GitLab CI/CD, i CircleCI poden executar proves automatitzades després de cada commit o push al repositori.
Exemple de Configuració de Jenkins per a Proves Automatitzades:
pipeline { agent any stages { stage('Build') { steps { sh 'make build' } } stage('Test') { steps { sh 'make test' } } } }
Integració de Proves Automatitzades en CI
- Integració amb Control de Versions
Les proves automatitzades es poden integrar amb sistemes de control de versions com Git. Cada vegada que es fa un commit o un push, les proves s'executen automàticament per assegurar-se que el codi és estable.
- Informes de Proves
Després d'executar les proves, és important generar informes que mostrin els resultats. Aquests informes poden incloure:
- Nombre de proves executades.
- Nombre de proves passades i fallades.
- Temps d'execució de les proves.
Exemple d'Informe de Proves amb pytest:
Exercici Pràctic
Exercici: Escriure i Executar Proves Unitàries
- Escriu una funció que calculi el factorial d'un nombre.
- Escriu proves unitàries per a aquesta funció.
- Executa les proves unitàries utilitzant el teu framework de proves preferit.
Solució:
# factorial.py def factorial(n): if n == 0: return 1 else: return n * factorial(n-1) # test_factorial.py import unittest from factorial import factorial class TestFactorial(unittest.TestCase): def test_factorial(self): self.assertEqual(factorial(0), 1) self.assertEqual(factorial(1), 1) self.assertEqual(factorial(5), 120) if __name__ == '__main__': unittest.main()
Conclusió
Les proves automatitzades són essencials per mantenir la qualitat del codi i assegurar-se que els canvis no introdueixen errors. En aquesta secció, hem après sobre els diferents tipus de proves automatitzades, com configurar-les i com integrar-les en el procés de CI. Amb aquesta base, estem preparats per avançar cap a la següent etapa del nostre curs de CI/CD.
Curs de CI/CD: Integració i Desplegament Continu
Mòdul 1: Introducció a CI/CD
Mòdul 2: Integració Contínua (CI)
- Introducció a la Integració Contínua
- Configuració d'un Entorn de CI
- Automatització de la Construcció
- Proves Automatitzades
- Integració amb Control de Versions
Mòdul 3: Desplegament Continu (CD)
- Introducció al Desplegament Continu
- Automatització del Desplegament
- Estratègies de Desplegament
- Monitoratge i Retroalimentació
Mòdul 4: Pràctiques Avançades de CI/CD
Mòdul 5: Implementació de CI/CD en Projectes Reals
Mòdul 6: Eines i Tecnologies
Mòdul 7: Exercicis Pràctics
- Exercici 1: Configuració d'un Pipeline Bàsic
- Exercici 2: Integració de Proves Automatitzades
- Exercici 3: Desplegament en un Entorn de Producció
- Exercici 4: Monitoratge i Retroalimentació