Cuando estamos desarrollando en Python, ejecutar todas las pruebas desde la terminal es común en entornos de desarrollo. Sin embargo, en producción o integración continua, este enfoque puede no ser ideal, especialmente cuando solo queremos ejecutar pruebas específicas o tener un mejor control sobre cómo organizamos y ejecutamos estas pruebas. Python y su módulo Unit Test nos ofrecen herramientas como las suites de pruebas para modularizar y seleccionar qué pruebas ejecutar.
¿Cómo ejecutar pruebas específicas en Python?
Para ejecutar pruebas específicas, podemos usar el comando discover del subcomando Unit Test. Este comando busca automáticamente todas las pruebas dentro de una carpeta y las agrupa en una suite. Sin embargo, este enfoque no es siempre ideal para entornos locales, donde podríamos querer ejecutar solo ciertas pruebas.
¿Qué son las suites de pruebas?
Una suite de pruebas es un grupo de pruebas que podemos ejecutar juntas. En proyectos pequeños, generalmente tenemos una sola suite, pero a medida que crece el proyecto, modularizar las pruebas por categorías o características es recomendable. Por ejemplo, podríamos tener una suite para pruebas de calculadora y otra para pruebas de banco.
¿Cómo crear y ejecutar una suite de pruebas manualmente?
Crear una suite manualmente:
Creamos un archivo nuevo, por ejemplo, test_suites.py.
Importamos UnitTest y definimos una suite con suite = unittest.TestSuite().
Agregamos pruebas a la suite usando suite.addTest().
Agregar pruebas específicas:
Podemos importar pruebas existentes y añadirlas a la suite. Por ejemplo, si ya tenemos una prueba llamada test_deposit, podemos agregarla a la suite con suite.addTest(bankAccountTests('test_deposit')).
Ejecutar las suites con un runner:
Para ejecutar una suite, necesitamos un runner. Python ofrece varios tipos de runners. Un ejemplo sería el TextTestRunner, que se usa comúnmente en la terminal.
¿Cómo configurar Visual Studio Code para ejecutar pruebas?
Visual Studio Code facilita la ejecución de pruebas con su interfaz gráfica. Podemos configurar un runner y seleccionar qué pruebas ejecutar directamente desde el editor.
Configurar las pruebas en Visual Studio Code:
En la configuración, seleccionamos Unit Test como el framework de pruebas y especificamos la carpeta donde se encuentran las pruebas.
Visual Studio Code lista automáticamente las pruebas, permitiéndonos ejecutarlas con un solo clic.
Ejecutar pruebas individuales:
Al hacer clic en una prueba específica, podemos ver su resultado inmediatamente, ya sea que la prueba haya pasado, fallado o se haya omitido.
¿Cómo solucionar errores comunes al ejecutar pruebas?
Durante la ejecución de las pruebas, es común encontrarse con errores como "módulo no encontrado". Estos errores se pueden solucionar asegurándonos de que las carpetas contienen archivos __init__.py y configurando correctamente el PYTHONPATH para que Python encuentre todos los módulos necesarios.
¿Cómo ejecutar pruebas desde la terminal?
Podemos ejecutar una prueba específica directamente desde la terminal usando la siguiente estructura de comando:
Estuve revisando para el error con src y encontré esta alternativa que me funcionó.
Antes del import del src, se agregan las lineas resaltadas en cada módulo de test, por ejemplo:
Para que funcione el PYTHONPATH en powershell se usa $env:PYTHONPATH = "."; python tests/test_suites.py y se debe usar return suite
import unittest
from test_bank_account import BankAccountTests
defbank_account_suite(): suite = unittest.TestSuite() suite.addTest(BankAccountTests("test_deposit")) suite.addTest(BankAccountTests("test_withdraw"))return suite
if __name__ =="__main__": runner = unittest.TextTestRunner() runner.run(bank_account_suite())
Por si acaso, VSC no me deja correr los test de forma automatica ya que tomaba a pytest por defecto, además no me dejaba cambiar "python.testing.unittestEnabled": de falso a verdadero. Para resolverlo cree una carpeta dentro del proyecto y la nombre .vscode en ese mismo directorio cree una archivo setting.json y pones la configuración del ejecutador, en este caso es "python.testing.unittestEnabled": true.
En mi caso agrupé en suites de categorías los test que llevamos hechos:
Otra forma de correr los test es con un makefile, una herramienta muy util.
En pytest se puede etiquetar pruebas individuales con un marcador usando el decorador @pytest.mark.nombre_marcador; y luego ejecutar todas las pruebas que tienen ese marcador.
import pytest
@pytest.mark.mi_suitedeftest_addition(): result =1+1assert result ==2# Verifica que el resultado sea 2@pytest.mark.mi_suitedeftest_list(): my_list =[1,2,3]assert2in my_list # Verifica que 2 esté en la listaassert4notin my_list # Verifica que 4 no esté en la lista
Se debe registrar el marcador en tu archivo pytest.ini:
# pytest.ini[pytest]markers = mi_suite: Conjunto de pruebas para mi suite
pytest tests_asserts.py -m mi_suite -v
Para visualizar en consola que tests estas ejecutando pasamos como parametros verbosity=2. Para el tiempo de ejecución utilizamos durations=True.
En window es necesario settear el PATH. Esto lo logran utilizando en set PATHPYTHON=.
Esto le esta indicando a windows que el inicio es donde estas parado en ese momento.
Una vez realizado ya puedes utilizar solo el python tests/.....
Para los que trabajan con windows
$env:PYTHONPATH = "."; python .\test\test_suits.py