Germán Salina
Para windows:
cmd /c "set PYTHONPATH=. && python tests/test_suites.py"
Germán García
GRACIAS
Andres David Caicedo Marquez
La mas practica.
Ejecutar pruebas desde la terminal funciona bien mientras desarrollas, pero cuando entras a un entorno de producción o de continuous integration necesitas más control. Con las test suites de Python y unittest puedes agrupar pruebas, ejecutarlas de forma selectiva y dejar de depender del descubrimiento automático que corre todo de una vez.
¿Qué es una suite de pruebas en unittest y para qué sirve?
Una suite es simplemente un grupo de pruebas. En proyectos pequeños sueles tener una sola y al ejecutarla corren todos los tests. Pero su verdadero valor aparece cuando modularizas: imagina correr únicamente las pruebas de la calculadora o solo las del banco, sin tocar el resto.
El comando que veníamos usando, python -m unittest discover, crea una suite automáticamente recorriendo una carpeta y buscando archivos que cumplan un patrón. Cómodo, sí, pero poco selectivo [01:05].
¿Qué hace unittest discover? Recorre una carpeta, encuentra los archivos que empiezan con
test_y arma una suite con todas las pruebas que encuentre, ejecutándolas de corrido.
¿Cómo creo una suite manualmente paso a paso?
Para entender qué hace discover por debajo, conviene crear una suite a mano. El flujo es así:
tests_suites.py, e importa unittest [02:10].bank_account_suite() que retorne la suite.suite = unittest.TestSuite().suite.addTest(BankAccountTests('test_deposit')) pasándole el nombre del método a ejecutar.addTest por cada prueba que quieras incluir, como test_withdraw.Una suite sola no ejecuta nada. Necesita un runner, que es quien recorre las pruebas una por una y genera el output que ves en la terminal.
¿Qué es un test runner y cómo lo configuro?
Un runner toma la suite y ejecuta cada prueba. unittest trae varios; el más común es TextTestRunner, que imprime resultados en texto plano.
Para usarlo dentro de tu archivo, instancia y ejecuta:
python if name == 'main': runner = unittest.TextTestRunner() runner.run(bank_account_suite())
Al correrlo por primera vez aparecen errores típicos que vale la pena resolver con calma [04:30]:
test necesita un archivo __init__.py para ser tratada como paquete.__init__.py en src y exportar la variable PYTHONPATH=. antes del comando.test, importa la clase directamente sin el prefijo del paquete.Después del ajuste, el runner ejecuta exactamente las dos pruebas que registraste con addTest, ni una más [05:50].
¿Para qué sirve PYTHONPATH al correr tests? Le indica a Python desde qué directorio buscar tus módulos. Usar
PYTHONPATH=.significa: busca desde la carpeta donde estoy parado ahora.
¿Cómo ejecuto una prueba específica desde la terminal?
No siempre necesitas crear una suite. unittest acepta rutas directas a una prueba puntual. La sintaxis es:
bash python -m unittest tests.test_calculator.CalculatorTest.test_sum
Si quitas el último segmento, corres todas las pruebas de la clase. Si quitas dos, corres todo el archivo. Es un truco rápido cuando estás depurando un caso aislado y no quieres esperar a que se ejecute la suite completa.
¿Cómo ejecuto pruebas con un clic desde Visual Studio Code?
Visual Studio Code trae su propio runner integrado. Al activarlo te pide dos cosas:
test_*.py.Un detalle importante: el archivo donde definiste tu suite manual también empieza con test_, lo que confunde al descubridor de VS Code. Renómbralo a algo como suites_runner.py para que el patrón no lo capture [08:15].
Una vez configurado, aparece la lista completa de pruebas en el panel lateral. Puedes:
skip mediante un ícono distinto.Esto convierte el ciclo de feedback en algo mucho más ágil que estar escribiendo comandos largos cada vez que cambias una línea.
¿Cuándo conviene usar suites manuales y cuándo autodiscover?
La respuesta corta: depende del momento. Mientras desarrollas, autodiscover y el runner de VS Code te dan velocidad. En continuous integration o cuando quieres agrupar pruebas por categoría, área del negocio o prioridad, las suites manuales te dan control fino.
Puedes crear una suite para smoke tests, otra para pruebas lentas de integración y otra para regresiones. Así decides qué corre en cada pipeline sin ejecutar todo el universo de pruebas.
Ahora te toca a ti: crea varias suites, agrúpalas por categoría o por orden cronológico, ejecútalas y comparte en los comentarios cómo organizaste tus pruebas.
Germán Salina
Para windows:
cmd /c "set PYTHONPATH=. && python tests/test_suites.py"
Germán García
GRACIAS
Andres David Caicedo Marquez
La mas practica.
Mario Alexander Vargas Celis
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 def bank_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())
Nicolas Urrego
Precisamente dure un buen rato buscando esto!!!
Fix for PowerShell
Try this instead:
powershellCopiarEditar$env:PYTHONPATH = "."
python tests/tes-suites.py
jesus manuel vergara arias
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.
Al final funcionó.
{ "python.testing.unittestArgs": [ "-v", "-s", "./tests", "-p", "test_*.py" ], "python.testing.unittestEnabled": true, "python.testing.pytestEnabled": false } ```{ "python.testing.unittestArgs": \[ "-v", "-s", "./tests", "-p", "test\_\*.py" ], "python.testing.unittestEnabled": true, "python.testing.pytestEnabled": false}
John Eduard Meneses González
¡Reto adición de test suite!!
import unittest from tests.test_bank_account import BankAccountTests from tests.test_calculator import CalculatorTests from tests.test_all_asserts import AllAssertsTests def bank_account_suite(): suite = unittest.TestSuite() suite.addTest(BankAccountTests("test_deposit")) suite.addTest(BankAccountTests("test_withdraw")) suite.addTest(BankAccountTests("test_withdraw_insufficient_funds")) return suite if __name__ == "__main__": all_asserts_suite = unittest.TestLoader().loadTestsFromTestCase(AllAssertsTests) calculator_suite = unittest.TestLoader().loadTestsFromTestCase(CalculatorTests) bank_account_suite = bank_account_suite() all_tests_suite = unittest.TestSuite([all_asserts_suite, calculator_suite, bank_account_suite]) runner = unittest.TextTestRunner(verbosity=2) runner.run(all_tests_suite)
Hernán García Urrutia
En mi caso agrupé en suites de categorías los test que llevamos hechos:
Victor Martin Ortiz Palacio
Otra forma de correr los test es con un makefile, una herramienta muy util.
Ronaldo Jiménez
Ronaldo Jiménez
Se debe registrar el marcador en tu archivo pytest.ini:
# pytest.ini [pytest] markers = mi_suite: Conjunto de pruebas para mi suite
Ronaldo Jiménez
pytest tests_asserts.py -m mi_suite -v
José Fabián Beltrán Meza
Para visualizar en consola que tests estas ejecutando pasamos como parametros verbosity=2. Para el tiempo de ejecución utilizamos durations=True.
José Fabián Beltrán Meza
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/.....
Juan Sabogal
Para los que trabajan con windows
$env:PYTHONPATH = "."; python .\test\test_suits.py
Miguel Angel Muñoz Pozos
Esto tambien se puede hacer en
PyCharm Professional
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_suite def test_addition(): result = 1 + 1 assert result == 2 # Verifica que el resultado sea 2 @pytest.mark.mi_suite def test_list(): my_list = [1, 2, 3] assert 2 in my_list # Verifica que 2 esté en la lista assert 4 not in my_list # Verifica que 4 no esté en la lista