Pruebas de su código

PythonPythonBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderemos a escribir pruebas unitarias para nuestro código de Python utilizando el módulo unittest integrado. Empezaremos con una función simple y luego construiremos hacia la prueba de código más complejo, incluyendo código que interactúa con bases de datos.

Requisitos previos

Antes de comenzar este laboratorio, deberías tener un conocimiento básico del lenguaje de programación Python. También deberías tener cierta familiaridad con la escritura de funciones en Python.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/ModulesandPackagesGroup(["Modules and Packages"]) python(("Python")) -.-> python/ErrorandExceptionHandlingGroup(["Error and Exception Handling"]) python(("Python")) -.-> python/FileHandlingGroup(["File Handling"]) python/FunctionsGroup -.-> python/function_definition("Function Definition") python/FunctionsGroup -.-> python/arguments_return("Arguments and Return Values") python/ModulesandPackagesGroup -.-> python/importing_modules("Importing Modules") python/ErrorandExceptionHandlingGroup -.-> python/catching_exceptions("Catching Exceptions") python/ErrorandExceptionHandlingGroup -.-> python/raising_exceptions("Raising Exceptions") python/ErrorandExceptionHandlingGroup -.-> python/custom_exceptions("Custom Exceptions") python/FileHandlingGroup -.-> python/file_operations("File Operations") subgraph Lab Skills python/function_definition -.-> lab-247{{"Pruebas de su código"}} python/arguments_return -.-> lab-247{{"Pruebas de su código"}} python/importing_modules -.-> lab-247{{"Pruebas de su código"}} python/catching_exceptions -.-> lab-247{{"Pruebas de su código"}} python/raising_exceptions -.-> lab-247{{"Pruebas de su código"}} python/custom_exceptions -.-> lab-247{{"Pruebas de su código"}} python/file_operations -.-> lab-247{{"Pruebas de su código"}} end

Sumar números

Configuración

Para comenzar, necesitamos crear un nuevo archivo de Python para nuestras pruebas. Llamémoslo test_my_code.py. También crearemos un módulo que contenga el código que queremos probar. Llamemos a este módulo my_code.py.

Prueba simple

Comencemos con una función simple que devuelva la suma de dos números. En my_code.py, cree una función llamada add_numbers que tome dos argumentos y devuelva su suma.

def add_numbers(a, b):
    return a + b

Ahora escribamos una prueba para esta función en test_my_code.py. Primero, necesitamos importar el módulo unittest y la función add_numbers.

import unittest
from my_code import add_numbers

Luego, crearemos una clase llamada TestAddNumbers que herede de unittest.TestCase.

class TestAddNumbers(unittest.TestCase):
    pass

Dentro de esta clase, crearemos un método llamado test_add_numbers que probará la función add_numbers. Usaremos el método assertEqual para comprobar que la función devuelva la suma correcta.

class TestAddNumbers(unittest.TestCase):
    def test_add_numbers(self):
        result = add_numbers(2, 3)
        self.assertEqual(result, 5)

Ahora podemos ejecutar nuestras pruebas usando el siguiente comando:

python -m unittest test_my_code.py

Si la prueba pasa, debería ver una salida como la siguiente:

...
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

El . indica que una prueba pasó.

Pruebas de excepciones

A continuación, probemos una función que lanza una excepción. En my_code.py, cree una función llamada divide que tome dos argumentos y devuelva su cociente. Si el segundo argumento es cero, la función debe lanzar un ZeroDivisionError.

def divide(a, b):
    if b == 0:
        raise ZeroDivisionError('No se puede dividir por cero')
    return a / b

Ahora escribamos una prueba para esta función en test_my_code.py. Usaremos el método assertRaises para comprobar que la función lance un ZeroDivisionError cuando el segundo argumento es cero.

class TestDivide(unittest.TestCase):
    def test_divide_by_zero(self):
        with self.assertRaises(ZeroDivisionError):
            divide(1, 0)

Ahora podemos ejecutar nuestras pruebas nuevamente:

python -m unittest test_my_code.py

Si la prueba pasa, debería ver una salida como la siguiente:

...
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

Los .. indican que dos pruebas pasaron.

Pruebas con bases de datos

Finalmente, probemos un código que interactúa con una base de datos. Para este ejemplo, usaremos SQLite y el módulo sqlite3.

En my_code.py, cree una función llamada create_table que cree una nueva tabla en una base de datos SQLite.

import sqlite3

def create_table():
    conn = sqlite3.connect('my_database.db')
    c = conn.cursor()
    c.execute('CREATE TABLE IF NOT EXISTS my_table (id INTEGER PRIMARY KEY, name TEXT)')
    conn.commit()
    conn.close()

En este código, creamos una nueva tabla de base de datos SQLite llamada "my_table" con dos columnas: "id" y "name". Luego definimos una clase de prueba llamada TestCreateTable con un método setUp que crea una base de datos SQLite para las pruebas.

Ahora escribamos una prueba para la función create_table. Primero, necesitamos crear una nueva base de datos para las pruebas. Lo haremos en un método de configuración que se ejecuta antes de cada prueba.

class TestCreateTable(unittest.TestCase):
    def setUp(self):
        self.conn = sqlite3.connect('my_database.db')

    def test_create_table(self):
        create_table()
        c = self.conn.cursor()
        c.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='my_table'")
        result = c.fetchone()
        self.assertIsNotNone(result)

En el método setUp, creamos una nueva base de datos SQLite.

En el método test_create_table, llamamos a la función create_table y luego comprobamos que la tabla se creó usando una consulta SQL.

Ahora podemos ejecutar nuestras pruebas nuevamente:

python -m unittest test_my_code.py

Si la prueba pasa, debería ver una salida como la siguiente:

...
----------------------------------------------------------------------
Ran 3 tests in 0.001s

OK

Los ... indican que tres pruebas pasaron.

Resumen

En este laboratorio, aprendimos a escribir pruebas unitarias para nuestro código de Python utilizando el módulo unittest. Comenzamos con una función simple y luego construimos hacia la prueba de código más complejo, incluyendo código que interactúa con bases de datos. Con este conocimiento, puedes escribir pruebas para tu código de Python para asegurarte de que funcione como se espera y detecte errores tempranamente en el proceso de desarrollo.