Articulo de referencia

pytest

Pytest es un framework de pruebas para Python que se originó en el proyecto PyPy . Se puede usar para escribir diversos tipos de pruebas de software, incluyendo pruebas unitaria...

Este es un buen artículo. Haz clic aquí para obtener más información.

Pytest es un framework de pruebas para Python que se originó en el proyecto PyPy . Se puede usar para escribir diversos tipos de pruebas de software, incluyendo pruebas unitarias , de integración , de extremo a extremo y funcionales . Entre sus características se incluyen pruebas parametrizadas , fixtures y reescritura de aserciones .

Las funciones auxiliares de Pytest proporcionan el contexto para las pruebas al pasar los nombres de los parámetros en los casos de prueba; su parametrización elimina el código duplicado para probar múltiples conjuntos de entrada y salida; y sus sentencias assert reescritas proporcionan información detallada sobre las causas de los fallos.

Historia

Pytest se desarrolló como parte de un esfuerzo de paquetes de terceros para solucionar las deficiencias del módulo integrado unittest de Python. Su origen se remonta a PyPy, una alternativa al código fuente estándar de CPython de Python .

Desde su creación a principios de 2003, PyPy ha hecho mucho hincapié en las pruebas . PyPy contaba con pruebas unitarias para el código recién escrito, pruebas de regresión para detectar errores y pruebas de integración utilizando el conjunto de pruebas unitarias existente de CPython. [ 2 ]

A mediados de 2004, surgió un marco de pruebas llamado utest y los colaboradores de PyPy comenzaron a convertir los casos de prueba existentes a utest. Mientras tanto, en EuroPython 2004 se creó una biblioteca estándar complementaria para pruebas, llamada std. Este paquete estableció los principios, como la reescritura de aserciones, de lo que más tarde se convertiría en pytest. A finales de 2004, el proyecto std pasó a llamarse py, std.utest se convirtió en py.test y la biblioteca py se separó de PyPy. En noviembre de 2010, se lanzó pytest 2.0.0 como un paquete separado de py. Todavía se llamaba py.test hasta agosto de 2016, pero tras el lanzamiento de pytest 3.0.0, el punto de entrada de línea de comandos recomendado pasó a ser pytest. [ 3 ]

Pytest ha sido clasificado por la plataforma de seguridad para desarrolladores Snyk como uno de los proyectos clave del ecosistema de Python debido a su popularidad. Algunos proyectos conocidos que cambiaron a pytest desde unittest y nose (otro paquete de pruebas) incluyen los de Mozilla y Dropbox . [ 4 ] [ 5 ] [ 6 ] [ 7 ]

Características

Pruebas parametrizadas

En las pruebas de software, es común enviar valores a través de funciones de prueba y verificar que la salida sea correcta. En muchos casos, para probar exhaustivamente las funcionalidades , es necesario probar múltiples conjuntos de entrada/salida, y escribir estos casos por separado generaría código duplicado, ya que la mayoría de las acciones serían las mismas, diferenciándose únicamente en los valores de entrada/salida. La función de pruebas parametrizadas de Pytest elimina este código duplicado al combinar diferentes iteraciones en un solo caso de prueba, ejecutar estas iteraciones y mostrar el resultado de cada prueba por separado. [ 8 ]

Las pruebas parametrizadas en pytest se marcan con el @pytest.mark.parametrize(argnames, argvalues)decorador , donde el primer parámetro , argnames, es una cadena de nombres separados por comas, y argvalueses una lista de valores que se pasan a argnames. Cuando hay varios nombres en argnames, argvaluessería una lista de tuplas donde los valores de cada tupla corresponden a los nombres en argnamespor índice. Los nombres en argnamesse pasan a la función de prueba marcada con el decorador como parámetros. Cuando pytest ejecuta dichas pruebas decoradas, cada par de argnamesy argvaluesconstituiría una ejecución separada con su propia salida de prueba e identificador único. El identificador se puede usar para ejecutar pares de datos individuales. [ 8 ] : 52–58 [ 9 ]

Afirmar la reescritura

Al escribir pruebas de software, la instrucción `assert` es un medio principal para comunicar fallos en las pruebas, donde se comparan los valores esperados con los valores reales. [ 8 ] : 32–34 Mientras que la palabra clave `assert` integrada de Python solo genera `AssertionError` sin detalles en caso de fallo, `pytest` reescribe la palabra clave `assert` de Python y proporciona una salida detallada sobre las causas de los fallos, como a qué se evalúan las expresiones en la instrucción `assert`. Se puede hacer una comparación con las instrucciones `assert` de `unittest` (el módulo integrado de Python para pruebas): [ 8 ] : 32

unittestSe adhiere a una sintaxis más verbosa porque está inspirada en JUnit del lenguaje de programación Java , al igual que la mayoría de las bibliotecas de pruebas unitarias; pytest logra lo mismo interceptando las llamadas de assert integradas de Python, lo que hace que el enfoque sea más conciso. [ 8 ] : 32 [ 6 ]

fixtures de Pytest

Las pruebas de Pytest verifican que el código informático se comporta como se espera [ 10 ] utilizando pruebas que están estructuradas en una secuencia de arreglo, acción y afirmación conocida como AAA. [ 11 ] Sus fixtures proporcionan el contexto para las pruebas. Se pueden usar para poner un sistema en un estado conocido y para pasar datos a las funciones de prueba. Los fixtures constituyen prácticamente la fase de arreglo en la anatomía de una prueba (AAA, abreviatura de arreglo , acción , afirmación ). [ 11 ] [ 10 ] Los fixtures de Pytest pueden ejecutarse antes de los casos de prueba como configuración o después de los casos de prueba para limpieza, pero son diferentes de las configuraciones y limpiezas de unittest y nose (otro marco de pruebas de Python de terceros) . Las funciones declaradas como fixtures de pytest están marcadas por el @pytest.fixturedecorador , cuyos nombres luego se pueden pasar a las funciones de prueba como parámetros. [ 12 ] Cuando pytest encuentra los nombres de los fixtures en los parámetros de las funciones de prueba, primero busca en el mismo módulo dichos fixtures, y si no los encuentra, los busca en el archivo conftest.py. [ 8 ] : 61

Por ejemplo:

importar pytest@pytest . fixture def dataset (): """Devuelve algunos datos para probar las funciones""" return { "data1" : 1 , "data2" : 2 }def test_dataset ( dataset ): """prueba y confirma el valor del fixture""" assert dataset == { "data1" : 1 , "data2" : 2 }

En el ejemplo anterior, la función fixture de pytest datasetdevuelve un diccionario, que luego se pasa a la función de prueba test_datasetpara la aserción. Además de la detección de fixtures dentro del mismo archivo que los casos de prueba, las fixtures de pytest también se pueden colocar en el archivo conftest.py en el directorio tests. Puede haber varios archivos conftest.py, cada uno ubicado dentro de un directorio tests para que se detecten las fixtures para cada subconjunto de pruebas. [ 8 ] : 63

Alcances de los accesorios

En pytest, los ámbitos de fixture permiten al usuario definir cuándo se debe llamar a un fixture. Hay cuatro ámbitos de fixture: ámbito de función , ámbito de clase , ámbito de módulo y ámbito de sesión. Los fixtures con ámbito de función son los predeterminados para todos los fixtures de pytest, que se llaman cada vez que se ejecuta una función que tiene el fixture como parámetro. El objetivo de especificar un ámbito de fixture más amplio es eliminar las llamadas repetidas a fixtures, que podrían ralentizar la ejecución de la prueba. Los fixtures con ámbito de clase se llaman una vez por clase de prueba, independientemente del número de veces que se llamen, y la misma lógica se aplica a todos los demás ámbitos. Al cambiar el ámbito de fixture, solo es necesario agregar el parámetro scope a los decoradores de fixture, por ejemplo, . [ 8 ] : 72 [ 13 ]@pytest.fixture(scope="class")

Filtrado de prueba

Otra característica de pytest es su capacidad para filtrar las pruebas, donde solo se seleccionan las pruebas deseadas para ejecutar, o se comportan de una manera determinada según lo desee el desarrollador. Con la opción "k" (por ejemplo, pytest -k some_name), pytest solo ejecutaría las pruebas cuyos nombres incluyan some_name. Lo contrario es cierto, donde se puede ejecutar , y pytest ejecutará todas las pruebas cuyos nombres no incluyan . [ 14 ]pytest -k "not some_name"some_name

Los marcadores de Pytest, además de alterar el comportamiento de las pruebas, también pueden filtrarlas. Los marcadores de Pytest son decoradores de Python que comienzan con la sintaxis y se colocan encima de las funciones de prueba. Con diferentes marcadores con nombres arbitrarios, al ejecutar desde la línea de comandos solo se ejecutarán las pruebas decoradas con dichos marcadores. [ 8 ] : 13 Todos los marcadores disponibles se pueden listar junto con sus descripciones; los usuarios también pueden definir marcadores personalizados y registrarlos en pytest.ini, en cuyo caso también se listarán esos marcadores personalizados junto con los marcadores integrados. [ 8 ] : 147@pytest.mark.<markername>pytest -m <markername>pytest --markerspytest --markers

Véase también

Referencias

  1. "Versión 9.1.1" . 19 de junio de 2026. Consultado el 20 de junio de 2026 .
  2. Bolz-Tereick, Carl Friedrich (9 de septiembre de 2018). "Blog de estado de PyPy" . PyPy . Archivado del original el 6 de julio de 2022. Recuperado el 12 de mayo de 2022 .
  3. "Historial" . pytest . Archivado del original el 16 de mayo de 2022. Consultado el 13 de abril de 2022 .
  4. "Ejemplos de proyectos" . Pytest . Archivado del original el 1 de febrero de 2022. Consultado el 1 de febrero de 2022 .
  5. Koorapati, Nipunn. "Open Sourcing Pytest Tools" . Dropbox . Archivado del original el 11 de junio de 2024. Recuperado el 1 de febrero de 2022 .
  6. 1 2 Oliveira, Bruno (agosto de 2018). Guía de inicio rápido de pytest . Packt Publishing . ISBN 978-1-78934-756-2Archivado del original el 1 de febrero de 2022. Consultado el 1 de febrero de 2022 .
  7. "pytest" . Snyk . Archivado del original el 27 de junio de 2022. Consultado el 12 de mayo de 2022 .
  8. 1 2 3 4 5 6 7 8 9 10 Okken, Brian (septiembre de 2017). Python Testing with Pytest (1.ª ed.). The Pragmatic Bookshelf. ISBN  9781680502404Archivado del original el 20 de enero de 2022. Consultado el 22 de enero de 2022 .
  9. "Parametrización de fixtures y funciones de prueba" . pytest.org . Archivado del original el 4 de junio de 2022. Consultado el 24 de mayo de 2022 .
  10. 1 2 Viafore, Patrick (12 de julio de 2021). Python robusto . O'Reilly Media, Inc. ISBN 978-1-0981-0061-2Archivado del original el 3 de julio de 2022. Consultado el 3 de julio de 2022. Las pruebas verifican que lo que has creado funciona como esperas.
  11. 1 2 Khorikov, Vladimir (enero de 2020). Principios, prácticas y patrones de las pruebas unitarias . Publicado por Manning Publications. ISBN 9781617296277Archivado del original el 4 de junio de 2022. Consultado el 4 de junio de 2022 .
  12. "Acerca de los fixtures" . Pytest . Archivado del original el 7 de febrero de 2022. Consultado el 7 de febrero de 2022 .
  13. Ashwin, Pajankar (27 de febrero de 2017). Automatización de pruebas unitarias en Python: Técnicas prácticas para desarrolladores y probadores de Python . Apress. ISBN 9781484226766Archivado del original el 7 de marzo de 2022. Consultado el 7 de marzo de 2022 .
  14. Molina, Alessandro (febrero de 2021). Creación de software guiado por pruebas con Python . Editorial(es): Packt Publishing. ISBN 9781838642655Archivado del original el 8 de marzo de 2022. Consultado el 8 de marzo de 2022 .
  • Sitio web oficialEdita esto en Wikidata
  • https://pypi.org/project/pytest/
  • https://docs.pytest.org
  • Tutorial de pytest