Les proves unitàries són una part essencial del desenvolupament de programari, ja que permeten verificar que les diferents parts de la teva aplicació funcionen correctament de manera independent. En aquest tema, aprendrem com crear i executar proves unitàries per a una aplicació Flask.

Objectius

  • Entendre la importància de les proves unitàries.
  • Configurar un entorn de proves per a una aplicació Flask.
  • Escriure i executar proves unitàries utilitzant unittest i pytest.

  1. Importància de les Proves Unitàries

Les proves unitàries ajuden a:

  • Detectar errors en fases primerenques del desenvolupament.
  • Assegurar que els canvis en el codi no introdueixin nous errors.
  • Facilitar el manteniment del codi.
  • Millorar la qualitat del codi.

  1. Configuració de l'Entorn de Proves

Instal·lació de Dependències

Per començar a escriure proves unitàries, necessitem instal·lar algunes biblioteques. Les més comunes són unittest (inclosa en la biblioteca estàndard de Python) i pytest.

pip install pytest

Estructura del Projecte

És recomanable tenir una estructura clara per a les proves dins del teu projecte. Una estructura típica podria ser:

my_flask_app/
├── app/
│   ├── __init__.py
│   ├── routes.py
│   └── models.py
├── tests/
│   ├── __init__.py
│   ├── test_routes.py
│   └── test_models.py
├── config.py
└── run.py

  1. Escriure Proves Unitàries amb unittest

Exemple de Prova Unitària

A continuació, es mostra un exemple de com escriure una prova unitària per a una ruta simple en Flask.

app/routes.py

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/hello', methods=['GET'])
def hello():
    return jsonify(message="Hello, World!")

tests/test_routes.py

import unittest
from app.routes import app

class BasicTests(unittest.TestCase):

    def setUp(self):
        self.app = app.test_client()
        self.app.testing = True

    def test_hello(self):
        response = self.app.get('/hello')
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.json, {"message": "Hello, World!"})

if __name__ == "__main__":
    unittest.main()

Explicació del Codi

  • setUp: Aquest mètode s'executa abans de cada prova. Aquí, configurem el client de proves de Flask.
  • test_hello: Aquesta és una prova unitària que verifica que la ruta /hello retorna un codi d'estat 200 i el missatge esperat.

  1. Executar Proves amb unittest

Per executar les proves, simplement executa el fitxer de proves:

python -m unittest discover tests

  1. Escriure Proves Unitàries amb pytest

Exemple de Prova Unitària amb pytest

pytest és una altra eina popular per a les proves unitàries en Python. A continuació, es mostra com escriure la mateixa prova utilitzant pytest.

tests/test_routes.py

import pytest
from app.routes import app

@pytest.fixture
def client():
    app.testing = True
    return app.test_client()

def test_hello(client):
    response = client.get('/hello')
    assert response.status_code == 200
    assert response.json == {"message": "Hello, World!"}

Explicació del Codi

  • @pytest.fixture: Aquesta funció proporciona un client de proves per a les proves.
  • test_hello: Aquesta és la prova unitària que verifica la ruta /hello.

  1. Executar Proves amb pytest

Per executar les proves amb pytest, simplement executa:

pytest

  1. Exercicis Pràctics

Exercici 1: Provar una Ruta POST

Crea una ruta POST que accepti dades JSON i retorni una resposta. Escriu una prova unitària per verificar aquesta funcionalitat.

app/routes.py

@app.route('/echo', methods=['POST'])
def echo():
    data = request.get_json()
    return jsonify(data)

tests/test_routes.py

def test_echo(client):
    response = client.post('/echo', json={"key": "value"})
    assert response.status_code == 200
    assert response.json == {"key": "value"}

Exercici 2: Provar una Ruta amb Paràmetres

Crea una ruta que accepti un paràmetre en l'URL i retorni una resposta basada en aquest paràmetre. Escriu una prova unitària per verificar aquesta funcionalitat.

app/routes.py

@app.route('/greet/<name>', methods=['GET'])
def greet(name):
    return jsonify(message=f"Hello, {name}!")

tests/test_routes.py

def test_greet(client):
    response = client.get('/greet/John')
    assert response.status_code == 200
    assert response.json == {"message": "Hello, John!"}

Conclusió

En aquesta secció, hem après la importància de les proves unitàries i com configurar un entorn de proves per a una aplicació Flask. Hem escrit i executat proves unitàries utilitzant unittest i pytest. A més, hem practicat amb exercicis per reforçar els conceptes apresos. Les proves unitàries són una eina poderosa per assegurar la qualitat i la robustesa del teu codi, i és important integrar-les en el teu flux de treball de desenvolupament.

Curs de Desenvolupament Web amb Flask

Mòdul 1: Introducció a Flask

Mòdul 2: Conceptes Bàsics de Flask

Mòdul 3: Formularis i Entrada d'Usuari

Mòdul 4: Integració de Bases de Dades

Mòdul 5: Autenticació d'Usuaris

Mòdul 6: Conceptes Avançats de Flask

Mòdul 7: APIs RESTful amb Flask

Mòdul 8: Desplegament i Producció

Mòdul 9: Proves i Millors Pràctiques

Mòdul 10: Extensions i Ecosistema de Flask

© Copyright 2024. Tots els drets reservats