Aprende a probar tus ejercicios de Python en Exercism.
Usamos pytest como el ejecutor de pruebas de nuestro sitio web.
Necesitarás instalar pytest en tu máquina de desarrollo si quieres descargar y ejecutar las pruebas de los ejercicios del track de Python de forma local.
También deberías instalar los siguientes complementos de pytest:
También recomendamos usar el programa de análisis de código pylint, ya que es parte de nuestra retroalimentación automática en el sitio web y puede ser una herramienta de análisis estático de código muy útil.
Para mayor facilidad de uso, el complemento pytest-pylint de pytest te permite ejecutar pylint a través de pytest en la línea de comandos.
La configuración de Pylint puede ser algo abrumadora, así que este tutorial de pylint.readthedocs.io puede ser útil para empezar, al igual que esta descripción general de Code Quality: Tools and Best Practices de Real Python.
Pytest se puede instalar y actualizar usando la utilidad integrada de Python pip.
Para más consejos, Brett Cannon tiene una buena guía rápida y sencilla sobre cómo instalar paquetes para Python, junto con una excelente explicación de por qué deberías usar python -m pip.
Para obtener más información sobre los argumentos de línea de comandos de Python, consulta línea de comandos y entorno en la documentación de Python.
Nota: Es posible que Python3 y py sean o no sean alias de Python en tu sistema.
Ajusta los comandos de instalación de abajo según corresponda.
Para instalar pytest en un entorno virtual, asegúrate de que el entorno esté activado antes de ejecutar los comandos.
De lo contrario, la instalación de pytest será global.
PS C:\Users\foobar> py -m pip install pytest pytest-cache pytest-subtests pytest-pylint
Successfully installed pytest-8.3.3 ...
$ python3 -m pip install pytest pytest-cache pytest-subtests pytest-pylint
Successfully installed pytest-8.3.3 ...
Para verificar que la instalación fue exitosa:
$ python3 -m pytest --version
pytest 8.3.3
Para ejecutar las pruebas, ve a la carpeta donde está guardado el ejercicio usando cd en tu terminal (reemplaza <exercise-folder-location> de abajo con tu ruta).
$ cd <exercise-folder-location>
<exercise-folder-location> or most things inside angle brackets denote a placeholder value.
A normal path or file name should be written without any brackets.
For example: /Users/janedoe/exercism/python/exercises/concept/chaitanas-colossal-coaster (on *nix systems), C:\Users\janedoe\exercism\python\exercises\practice\hello-world\ (on Windows), myFolder or my_file.py.
El archivo que querrás ejecutar normalmente termina en _test.py.
Este archivo contiene las pruebas de la solución del ejercicio, y son las mismas pruebas que se ejecutan en el sitio web cuando se sube una solución.
Ahora, ejecuta el siguiente comando en tu terminal, reemplazando <exercise_test.py> con la ubicación o el nombre del archivo de pruebas:
$ python3 -m pytest -o markers=task <exercise_test.py>
==================== 7 passed in 0.08s ====================
Si no usas pytest -o markers=task en el comando de arriba, es posible que recibas warnings sobre «marcadores desconocidos» al ejecutar una prueba que usa nuestra sintaxis nueva.
Para evitar escribir pytest -o markers=task en cada prueba que ejecutes, puedes usar un archivo de configuración pytest.ini, que se puede descargar desde el nivel superior del directorio del track de Python: pytest.ini.
También puedes crear tu propio archivo pytest.ini con el siguiente contenido:
[pytest]
markers =
task: A concept exercise task.
Colocar este archivo en el directorio root o working de los ejercicios de Exercism registrará las marcas y detendrá las advertencias.
Puedes encontrar más información sobre las marcas de pytest en la documentación de pytest sobre marcar funciones de prueba y en la documentación de pytest sobre trabajar con marcadores personalizados.
Puedes encontrar más información sobre cómo personalizar las configuraciones de pytest en la documentación de pytest sobre formatos de archivos de configuración
Cuando las pruebas fallan, pytest imprime en la terminal el texto de cada prueba fallida, junto con los valores de return esperados y reales de cada una.
A continuación, un ejemplo genérico de una prueba fallida:
$(my_venv) python3 -m pytest -o markers=task <exercise_test.py>
=================== FAILURES ====================
______________ name_of_failed_test ______________
# Test code inside of <exercise_test.py> that failed.
...
E TypeOfError: ReturnedValue != ExpectedValue
exercise_test.py:<line_of_failed_test>: TypeOfError
============ short test summary info ============
FAILED exercise_test.py::ExerciseTest::name_of_failed_test
========== 1 failed, 2 passed in 0.13s ==========
Si de verdad quieres ser específico sobre lo que pytest muestra en tu pantalla, aquí tienes algunos argumentos de línea de comandos útiles que te permiten configurar su comportamiento.
-v]Agregar el flag -v (verbose) mostrará tanto la información del entorno como un resumen de las pruebas, además de los fallos de las pruebas:
$(my_venv) python3 -m pytest -o markers=task -v exercises/<exercise_name>/<test_file_test.py>
======================================== test session starts ===========================================
platform darwin -- Python 3.9.0, pytest-6.2.5, -- /usr/local/envs/my_env/bin/python3
cachedir: .pytest_cache
metadata: {'Python': '3.9.0', 'Platform': 'macOS-10.14.6-x86_64-i386-64bit', 'Packages': {'pytest': '6.2.1'}, 'Plugins': {'subtests': '0.5.0', 'pylint': '0.18.0'}
rootdir: /Users/<user>/exercism/python, configfile: pytest.ini
plugins: subtests-0.5.0, pylint-0.18.0
collected 5 items
exercises/exercise-name/exercise_file_test.py::ExerciseNameTest::test_one FAILED [ 20%]
exercises/exercise-name/exercise_file_test.py::ExerciseNameTest::test_two FAILED
exercises/exercise-name/exercise_file_test.py::ExerciseNameTest::test_three PASSED [ 40%]
exercises/concept/exercise-name/exercise_file_test.py::ExerciseNameTest::test_four FAILED
exercises/concept/exercise-name/exercise_file_test.py::ExerciseNameTest::test_five PASSED [ 60%]
exercises/concept/exercise-name/exercise_file_test.py::ExerciseNameTest::test_six FAILED
exercises/concept/exercise-name/exercise_file_test.py::ExerciseNameTest::test_seven PASSED [ 80%]
exercises/concept/exercise-name/exercise_file_test.py::ExerciseNameTest::test_eight FAILED
exercises/concept/exercise-name/exercise_file_test.py::ExerciseNameTest::test_nine PASSED [100%]
================================================ FAILURES ======================================================
# Failed tests are then individually printed out below
.......
-x]Usar el flag -x ejecutará las pruebas con normalidad, pero detendrá la ejecución al primer fallo de una prueba.
Esto ayuda cuando quieres depurar una sola tarea o un solo fallo a la vez:
$(my_venv) python3 -m pytest -o markers=task -x exercises/<exercise_name>/<test_file_test.py>
=================== FAILURES ====================
_______________ example_test_foo ________________
...
...
============ short test summary info ============
FAILED example_test.py::ExampleTest::example_test_foo
!!!!!!!!!!! stopping after 1 failures !!!!!!!!!!!
========== 1 failed, 5 passed in 0.28s ==========
--ff]El complemento pytest-cache recuerda qué pruebas fallaron la última vez que ejecutaste pytest, así que usar el flag --ff le indica a pytest que ejecute primero las pruebas que fallaron antes y luego continúe con el resto de las pruebas.
Esto puede acelerar tus pruebas si estás haciendo muchos ajustes pequeños en torno a una tarea o un conjunto de entradas en particular.
$(my_venv) python3 -m pytest -o markers=task --ff <example_file_test.py>
==================== 7 passed in 503s ====================
Recomendamos usar los siguientes comandos para hacer tu depuración más fácil y (posiblemente) más rápida:
Primero cambia tu directorio de trabajo al directorio del ejercicio que quieres probar:
$(my_venv) cd path/to/exercise
Luego, ejecuta las pruebas junto con los argumentos explicados antes -x y --ff:
$(my_venv) python3 -m pytest -o markers=task -x --ff <example_file_test.py>
Esto pondrá a prueba tu solución.
Cuando pytest encuentra una prueba fallida, el programa se detiene y te dice qué prueba falló.
Cuando hagas ajustes y vuelvas a ejecutar las pruebas, pytest ejecutará primero la prueba que falló antes y luego continuará con las demás.
Si quieres «depurar como un profesional», puedes usar el argumento --pdb después del comando pytest y entrar al depurador de Python integrado, PDB.
$(my_venv) python3 -m pytest -o markers=task -x --ff --pdb <example_file_test.py>
=============== 4 passed in 0.15s ===============
Cuando una prueba falla, entrar a PDB te permitirá recorrer tu código paso a paso viendo el ámbito actual, además de comprobar el valor de las variables y la firma de distintas funciones.
Puedes encontrar más detalles sobre el módulo PDB en la documentación de Python sobre PDB.
Además, los documentos de pytest sobre PDB y esta guía de Real Python son muy útiles.
Si quieres ampliar tu IDE con algunas herramientas que te ayuden a probar y mejorar tu código, consulta la página de herramientas. Ahí exploramos varios IDE, editores y algunas extensiones útiles para el análisis de código y la depuración.
Nota: Si instalaste Python en Windows a través del Instalador de la PSF, el comando será py en lugar de python3.
Escribir python3 -m cada vez que quieres ejecutar un módulo puede resultar un poco molesto.
Para evitarlo, puedes agregar la carpeta Scripts de tu instalación de Python a tu path.
Si no sabes dónde instalaste Python, ejecuta el siguiente comando en tu terminal:
$ python3 -c "import os, sys; print(os.path.dirname(sys.executable))"
<python_directory>
El directorio devuelto es donde está instalada tu versión activa actual de Python; en esta sección se le llama <python_directory>.
Haz clic en el botón Windows Start y busca Edit the system environment variables, luego presiona Enter.
Después presiona Environment Variables...:

Luego encuentra la variable Path en tus User variables, selecciónala y haz clic en Edit...:

Después agrega una nueva línea, como se muestra en la imagen, reemplazando <python_directory> con el directorio de tu instalación de Python:

Lo siguiente debería funcionar en la mayoría de las distribuciones de Linux y versiones de MacOS con un shell bash.
Los comandos pueden variar según la distribución de Linux y según si se usa un shell fish o zsh.
Reemplaza <python_directory> con la salida de python3 -c "import os, sys; print(os.path.dirname(sys.executable))"
export PATH="$PATH:<python_directory>"