Contenido del curso
Conceptos Básicos de Unittest
- 4

Pruebas Unitarias con Python: Métodos Setup y Teardown
05:22 min - 5

setUp en Python para eliminar pruebas duplicadas
Viendo ahora - 6

Pruebas de Registro de Transacciones en Cuentas Bancarias
12:53 min - 7

Métodos de Assert en UnitTest para Pruebas Efectivas
13:38 min - 8

Decoradores de Unit Test para Saltar Pruebas y Detectar Fallos
09:15 min
Organización y Gestión de Pruebas
Técnicas Avanzadas en Pruebas Unitarias
Exploración de Herramientas y Métodos Complementarios
Mejora y Automatización de Pruebas
setUp en Python para eliminar pruebas duplicadas
Resumen
El método setUp en unittest te permite eliminar código repetido entre pruebas unitarias al ejecutar instrucciones comunes antes de cada test. Si estás aprendiendo testing en Python con clases como TestCase, dominar setUp es clave para escribir suites limpias, mantenibles y profesionales.
Para verlo en acción, dejamos atrás la calculadora del proyecto anterior y trabajamos con una clase BankAccount que permite depositar, retirar y consultar el saldo disponible.
¿Qué hace el método setUp en unittest?
Es un método heredado de TestCase que se ejecuta automáticamente antes de cada prueba dentro de la clase. Por defecto no hace nada, pero existe para que tú lo sobrescribas con la lógica de inicialización que necesites compartir.
¿Qué es setUp en unittest? Es un método especial de la clase TestCase que Python ejecuta antes de cada test del archivo. Sirve para preparar objetos, datos o estados que varias pruebas necesitan, evitando duplicar código.
En la práctica, todo lo que coloques dentro de setUp y guardes en self estará disponible en cada método de prueba como un atributo del objeto.
¿Cómo se prueba una clase BankAccount paso a paso?
Antes de hablar de setUp, conviene escribir las pruebas tal como saldrían de forma natural y luego refactorizar. Esa es la mejor manera de entender por qué setUp existe [00:32].
¿Cómo se estructura el archivo de pruebas?
El primer paso es crear un archivo test_bank_account.py, importar unittest e importar la clase BankAccount. La convención es nombrar la clase de prueba con el mismo nombre del objeto bajo prueba seguido de la palabra Test, y heredar de TestCase para reutilizar la infraestructura que Python ya trae.
¿Cómo escribir pruebas para depósito, retiro y balance?
Con la clase lista, defines tres métodos de prueba. Cada uno instancia una cuenta con un balance inicial de 1000 y valida un comportamiento distinto:
- test_deposit: deposita 500 y verifica que el nuevo balance sea 1500.
- test_withdraw: retira 200 y valida que el balance final sea 800.
- test_get_balance: comprueba que get_balance devuelva 1000 al consultar la cuenta recién creada.
Para correrlas con más detalle, ejecutas el comando con la bandera -v, que activa el modo verbose y muestra el nombre de cada prueba, su ubicación y si pasó OK [02:14].
python import unittest from bank_account import BankAccount
class BankAccountTest(unittest.TestCase): def test_deposit(self): account = BankAccount(balance=1000) new_balance = account.deposit(500) self.assertEqual(new_balance, 1500)
¿Cuándo conviene refactorizar con setUp?
Al revisar las tres pruebas, salta a la vista que cada una repite la misma línea: la creación de la cuenta con balance inicial. Ese patrón es la señal clara de que setUp debe entrar en escena [03:54].
¿Cuándo debo usar setUp? Úsalo cuando dos o más pruebas de la misma clase necesitan el mismo objeto inicial, datos de prueba o configuración. Si solo una prueba lo requiere, déjalo dentro de esa prueba.
¿Cómo eliminar código duplicado entre pruebas?
La solución es mover esa instanciación a setUp y guardarla en self.account. Como setUp corre antes de cada test, cada prueba recibe una cuenta nueva, aislada y consistente. Importante: no necesitas llamar a super().setUp() porque la implementación base no hace nada.
python class BankAccountTest(unittest.TestCase): def setUp(self): self.account = BankAccount(balance=1000)
def test_deposit(self): new_balance = self.account.deposit(500) self.assertEqual(new_balance, 1500) def test_withdraw(self): new_balance = self.account.withdraw(200) self.assertEqual(new_balance, 800) def test_get_balance(self): self.assertEqual(self.account.get_balance(), 1000)
Al ejecutar de nuevo en modo verbose, las tres pruebas siguen pasando, pero el archivo es más corto, más legible y más fácil de mantener.
¿Por qué usar self dentro de setUp?
Porque self es la variable del objeto de prueba. Todo lo que asignes ahí queda disponible como atributo en cualquier método de la clase. Sin self, la cuenta solo viviría dentro del setUp y no podrías usarla en test_deposit, test_withdraw ni test_get_balance.
¿Qué reto puedes resolver para practicar setUp?
Para afianzar lo aprendido, agrega un método transfer a BankAccount que mueva dinero entre dos cuentas. Asegúrate de que levante una excepción cuando el saldo sea insuficiente.
Luego escribe dos pruebas unitarias:
- Una que valide una transferencia exitosa entre dos cuentas con saldo suficiente.
- Otra que verifique que se levanta la excepción cuando el saldo no alcanza.
Usa setUp para crear las dos cuentas que ambas pruebas necesitan. ¿Cómo resolverías el caso de la excepción? Comparte tu solución en los comentarios.