Más lejos 
Las pruebas sistemáticas de software, especialmente en la comunidad Python, a menudo se ignoran por completo o se realizan de una manera especial. Muchos programadores de Python desconocen por completo la existencia de pytest. Brian Ocken se toma la molestia de demostrar que probar software con pytest es fácil, natural e incluso interesante.
Dmitry Zinoviev
Autor de Data Science Essentials en Python

Los ejemplos en este libro están escritos usando Python 3.6 y pytest 3.2. pytest 3.2 es compatible con Python 2.6, 2.7 y Python 3.3+.
El código fuente para el proyecto Tareas, así como para todas las pruebas que se muestran en este libro, está disponible en el enlace en la página web del libro en pragprog.com . No necesita descargar el código fuente para comprender el código de prueba; El código de prueba se presenta de forma conveniente en los ejemplos. Pero para seguir las tareas del proyecto o adaptar ejemplos de prueba para probar su propio proyecto (¡sus manos están desatadas!), Debe ir a la página web del libro y descargar el trabajo. Allí, en la página web del libro, hay un enlace para mensajes de erratas y un foro de discusión .
Debajo del spoiler hay una lista de artículos en esta serie.
Agradecimientos
Primero tengo que agradecer a Michelle, mi esposa y mi mejor amiga. Es una pena que no veas la habitación en la que estoy escribiendo. En lugar de una mesa, tengo una antigua mesa de comedor cuadrada de roble en la que hay suficiente espacio para colocar el papel. Una hermosa estantería de vidrio con mis juguetes retro-espaciales que hemos recopilado a lo largo de los años, así como libros técnicos, placas de circuitos y bolas de malabarismo. Antiguas cajas de aluminio para almacenar papel en la parte superior llenas de notas, cables e incluso las pegatinas restantes para cohetes. Una de las paredes está cubierta de terciopelo, que compramos hace muchos años, cuando la tienda de telas decidió cerrar definitivamente. La tela debería calmar el eco cuando grabo podcasts.
Me gusta escribir aquí no solo porque es conveniente y coherente con mi mundo interior, sino también porque es el espacio que Michel creó conmigo y para mí. Ella y yo siempre hemos sido un equipo, y ella apoyó increíblemente mis ideas locas para escribir un blog, comenzar un podcast o dos, y ahora, durante el último año más o menos, escribir este libro. Se aseguró de que tuviera tiempo y espacio para escribir. Cuando me canso y pienso si aún tengo fuerzas para escribir, ella me ofrece que continúe durante veinte minutos y vea cómo me sentiré en ese momento, hizo lo mismo cuando me ayudó a pasar la última hora. noches de colegio. Realmente, realmente no podría haberlo hecho sin ella.
También tengo dos hijas sorprendentemente sorprendentes, curiosas y brillantes, Gabriella y Sofía, que son dos de mis mayores admiradores. Ella ofrece a todos los que hablan sobre programación que escuchen mis podcasts, y Phia hizo alarde de una pegatina para el código de prueba en su mochila, que tomó en segundo grado.
Hay muchas más personas para agradecer.
Mi editora, Katherine Dvorak, me ayudó a reunir un montón de ideas y temas al azar en una progresión coherente, y esta es la razón por la cual este es un libro y no una serie de publicaciones de blog. Entré en este proyecto como blogger, y me apegué demasiado a los muchos titulares, subtítulos y artículos de lista, y Katie me guió pacientemente para que pudiera ser una mejor escritora.
Gracias a Suzanne Davidson Palatinate, Andy Hunt y el resto de Pragmatic Bookshelf por darme una oportunidad.
Los revisores técnicos me mantuvieron honesto en pytest, pero también en estilo Python, y son la razón por la que los ejemplos de código siguen a PEP 8. Gracias a Oliver Bestwalter, Florian Bruhin, Floris Bruinog, Mark Goody, Peter Hampton, Dave Hunt, Al Crinker, Lokesh Kumaru Makani, Bruno Oliveira, Ronnie Pfannschmidt, Rafael Pierzine, Luciano Ramallo, Frank Ruiz y Dmitry Zinoviev. Muchos de esta lista también son desarrolladores de kernel de pytest y / o soportan increíbles complementos de pytest.
Un agradecimiento especial a Luciano. Después de escribir este libro, envié los primeros cuatro capítulos a varios revisores. Luciano fue uno de ellos, y su reseña fue la más difícil de leer. No creo que haya seguido todos sus consejos, pero debido a sus comentarios, revisé y reescribí la mayoría de los primeros tres capítulos y cambié algo en el resto del libro.
Gracias a todo el equipo de pytest-dev por crear una herramienta de prueba tan genial. Gracias a Oliver Bestwalter, Florian Bruhin, Floris Bruinoh, Dave Hunt, Holger Krekel, Bruno Oliveira, Ronnie Pfannschmidt, Rafael Pierzine y muchos otros por responder mis preguntas sobre la vida a lo largo de los años.
Y por último, pero no menos importante, necesito agradecer a las personas que me agradecieron. Aprovecharon la oportunidad para informarme por correo electrónico que mi trabajo les ahorró tiempo y facilitó el trabajo. ¡Esto es genial y me hace feliz! Gracias
Brian okken
septiembre 2017
Prólogo
El uso de Python está aumentando no solo en el desarrollo de software, sino también en áreas como el análisis de datos, la investigación, las pruebas y la medición, así como en otras industrias. El desarrollo de Python en muchas áreas críticas también va acompañado del deseo de realizar pruebas de software de manera correcta, eficiente y efectiva para garantizar que los programas funcionen correctamente y den los resultados correctos. Además, cada vez más proyectos de software abarcan una integración continua e incluyen una fase de prueba automatizada a medida que se acortan los ciclos de lanzamiento y las pruebas manuales cuidadosas de proyectos cada vez más complejos simplemente no son factibles. Los equipos deben poder confiar en las pruebas realizadas por los servidores de integración continua que les dicen si pueden confiar en su software lo suficiente como para lanzarlo.
Entra en pytest.
¿Qué es pytest?
Pytest, una herramienta confiable de prueba de Python, se puede utilizar para todos los tipos y niveles de pruebas de software. pytest puede ser utilizado por equipos de desarrollo, equipos de control de calidad, grupos de prueba independientes, personas que practican TDD y proyectos de código abierto. De hecho, los proyectos en Internet han cambiado de unittest o nose a pytest , incluidos Mozilla y Dropbox. Por qué Debido a que pytest ofrece características poderosas como reescribir "afirmar", modelos de plug-in de terceros y un modelo de accesorio potente pero simple que no tiene comparación en ningún otro marco de prueba.
pytest es una plataforma de prueba de software, lo que significa que pytest es un programa de línea de comandos. Una herramienta que encuentra automáticamente pruebas escritas, ejecuta pruebas y escribe informes con el resultado. Tiene una biblioteca de lociones que puede usar en las pruebas para ayudarlo a realizar pruebas de manera más eficiente. Se puede ampliar escribiendo sus propios complementos o instalando los de terceros. Se puede usar para probar distribuciones de Python. Y se integra a la perfección con otras herramientas, como la integración continua y la automatización web.
Aquí hay algunas razones por las que pytest se destaca entre muchas otras pruebas de sistemas integrados:
- Las pruebas simples son fáciles de escribir en pytest.
- Las pruebas complejas son aún más fáciles de escribir.
- Las pruebas son fáciles de leer.
- Las pruebas son fáciles de leer. (Es tan importante que esto se indique dos veces).
- Puedes comenzar en segundos.
assert
usa para fallar la prueba, no self.assertEqual()
o self.assertLessThan()
. ¡Solo afirma !- Puede usar pytest para ejecutar pruebas escritas para unittest o nose.
pytest está activamente desarrollado y respaldado por una comunidad apasionada y en crecimiento. Es tan ampliable y flexible que se adapta fácilmente a su flujo de trabajo. Y dado que se instala por separado de su versión de Python, puede usar la misma versión más reciente de pytest en Python 2 heredado (2.6 y superior) y Python 3 (3.3 y superior).
Aprendizaje de pytest al probar una aplicación de ejemplo
¿Te gustaría aprender Pytest probando ejemplos tontos que nunca verás en la vida real? Yo tambien No vamos a hacer esto en este libro. En cambio, vamos a escribir pruebas para un proyecto que, espero, tenga mucho en común con las aplicaciones que probará después de leer este libro.
Proyecto de tareas
La aplicación que veremos se llama Tareas. Tasks es una aplicación de seguimiento de tareas mínimas con una interfaz de línea de comandos. Tiene bastante en común con muchos otros tipos de aplicaciones, que, espero, pueda ver fácilmente cómo los conceptos de prueba que aprende al desarrollar pruebas contra problemas son aplicables a sus proyectos ahora y en el futuro.
Aunque Tasks tiene una interfaz de línea de comandos (CLI), la CLI interactúa con el resto del código a través de una interfaz de programación de aplicaciones (API). Una API es la interfaz a la que dirigiremos la mayoría de nuestras pruebas. La API interactúa con la capa de administración de la base de datos, que interactúa con la base de datos de documentos: MongoDB o TinyDB . El tipo de base de datos se configura cuando se inicializa la base de datos. Antes de enfocarnos en la API, veamos las tareas en sí mismas, una herramienta de línea de comandos que proporciona una interfaz de usuario para las tareas.
Aquí hay una sesión de ejemplo:
$ tasks add 'do something' --owner Brian $ tasks add 'do something else' $ tasks list ID owner done summary -- ----- ---- ------- 1 Brian False do something 2 False do something else $ tasks update 2 --owner Brian $ tasks list ID owner done summary -- ----- ---- ------- 1 Brian False do something 2 Brian False do something else $ tasks update 1 --done True $ tasks list ID owner done summary -- ----- ---- ------- 1 Brian True do something 2 Brian False do something else $ tasks delete 1 $ tasks list ID owner done summary -- ----- ---- ------- 2 Brian False do something else $
Nota del traductor: en el caso de utilizar la plataforma Windows, me encontré con varios problemas al probar esta sesión.
- Se debe crear una carpeta para la base de datos de
tasks_db
llamada tasks_db
en la carpeta de su usuario. Por ejemplo c:\Users\User_1\tasks_db\
- Use comillas en lugar de apóstrofes. De lo contrario, obtenemos tal error.
$ tareas agregan 'hacer otra cosa'
Uso: las tareas agregan [OPCIONES] RESUMEN
Error: Tengo argumentos extra inesperados (otra cosa ')
Esta no es la aplicación de administración de tareas más difícil, pero es lo suficientemente compleja como para usarla para estudiar las pruebas.
Estrategia de prueba
Aunque pytest es adecuado para pruebas unitarias, pruebas de integración, pruebas de sistema o pruebas de extremo a extremo y pruebas funcionales, la estrategia de prueba del proyecto Tareas se centra principalmente en las pruebas funcionales subcutáneas. Las siguientes son algunas definiciones útiles:
- Prueba de unidad : una prueba que prueba un pequeño fragmento de código, como una función o clase, de forma aislada del resto del sistema. Reviso las pruebas en el Capítulo 1, Introducción a pytest, en la página 1, para realizar pruebas unitarias La estructura de datos de las tareas.
- Prueba de integración : una prueba que prueba un fragmento de código más grande puede incluir varias clases o subsistemas. En su mayoría, la etiqueta utilizada para algunas pruebas es más grande que una prueba unitaria, pero más pequeña que una prueba del sistema.
- Prueba del sistema (de extremo a extremo) : una prueba que prueba todo el sistema bajo prueba en un entorno lo más cercano posible al entorno del usuario final.
- Pruebas funcionales : una prueba que prueba una pieza de la funcionalidad del sistema. Una prueba que prueba qué tan bien agregamos, eliminamos o actualizamos un elemento de tarea en Tareas es una prueba funcional.
- Prueba subcutánea : una prueba que se ejecuta no para la interfaz de usuario final, sino para una interfaz ubicada justo debajo de la superficie. Dado que la mayoría de las pruebas en este libro se prueban en el nivel API, no en la CLI, califican como pruebas subcutáneas.
¿Cómo se organiza este libro?
En el Capítulo 1, “Introducción a pytest” en la página 1, instala pytest y se prepara para usarlo. Luego, toma una parte del proyecto Tareas: una estructura de datos que representa una sola tarea (llamada tupla llamada Tarea), y la usa para probar ejemplos. Aprenderá a ejecutar pytest con varios archivos de prueba. Verá muchas opciones de línea de comandos populares y extremadamente útiles para pytest, como la capacidad de reiniciar las fallas de prueba, detener la ejecución después de la primera falla, controlar el seguimiento de la pila y la versión de varias páginas de la ejecución de la prueba, y mucho más.
En el capítulo 2, “Creación de funciones de prueba”, en la página 23, instalará Tareas localmente con pip y verá cómo estructurar las pruebas en un proyecto de Python. Debe hacer esto para comenzar a escribir pruebas para una aplicación real. Todos los ejemplos en este capítulo ejecutan pruebas para la aplicación instalada, incluida la escritura en la base de datos. Las funciones de prueba reales son el enfoque de este capítulo y aprenderá cómo usar la assert
efectiva en las pruebas. También aprenderá sobre marcadores. Una función que le permite marcar muchas pruebas que se ejecutarán simultáneamente, marcar pruebas que se omitirán o decirle a pytest que ya sabemos que algunas pruebas fallarán. Hablaré sobre cómo ejecutar solo algunas pruebas, no solo con marcadores, sino también estructurando nuestro código de prueba en directorios, módulos y clases, y cómo ejecutar estos subconjuntos de pruebas.
No todos los códigos de prueba están incluidos en las funciones de prueba. En el capítulo 3, "Fixtures de pytest", en la página 49, aprenderá cómo poner los datos de prueba en los fixtures de prueba, así como configurar y romper el código. Establecer el estado de un sistema (o subsistema o unidad individual) es una parte importante de las pruebas de software. Aprenderá este aspecto de los accesorios de pytest para ayudar a inicializar la base de datos del proyecto Tareas y completar previamente los datos de prueba para algunas pruebas. Los accesorios son una parte increíblemente poderosa de pytest, y aprenderá cómo usarlos de manera efectiva para reducir aún más la duplicación del código de prueba y ayudar a que su código de prueba sea increíblemente legible y mantenible. Los dispositivos Pytest también son parametrizables, similares a las funciones de prueba, y utilizará esta función para poder ejecutar todas sus pruebas con TinyDB y MongoDB, las partes del servidor de bases de datos compatibles con Tareas.
En el capítulo 4, “Accesorios incorporados”, en la página 71, verá algunos de los accesorios integrados suministrados por pytest. Aprenderá cómo los dispositivos incorporados pytest pueden rastrear directorios y archivos temporales por usted, ayudarlo a verificar la salida del código de prueba, usar parches de mono, verificar advertencias y mucho más.
En el capítulo 5, "Complementos", en la página 95, aprenderá cómo agregar opciones de línea de comando a pytest, cambiar la salida de pytest y compartir la configuración de pytest, incluidos los accesorios, con otros usuarios mediante escritura, empaquetado y distribución ( distribuir) complementos propios. El complemento que desarrollamos en este capítulo se usa para crear los errores de prueba que vemos al probar tareas, un poco mejor. También aprenderá a probar los complementos de prueba correctamente. ¿Qué tipo de meta? Y por si acaso, si este capítulo no te inspira lo suficiente como para escribir tus propios complementos, elegí un montón de excelentes complementos para mostrar lo que es posible en el Apéndice 3, "Paquete de muestra de complementos", en la página 163.
Hablando de personalización, en el capítulo 6, "Configuración", en la página 113, aprenderá cómo configurar el lanzamiento de pytest predeterminado para su proyecto utilizando archivos de configuración. Con el archivo pytest.ini , puede hacer cosas como almacenar los parámetros de la línea de comandos para no tener que ingresarlos todo el tiempo, decirle a pytest que no busque en directorios específicos los archivos de prueba, especifique la versión mínima de pytest que su pruebas y más. Estos elementos de configuración se pueden colocar en tox.ini o setup.cfg .
En el capítulo final, Capítulo 7, usando pytest con otras herramientas, en la página 125, verá cómo puede tomar el ya potente pytest y sobrecargar sus pruebas con herramientas adicionales. Ejecutará el proyecto Tareas en varias versiones de Python con tox. Probará las tareas de CLI sin ejecutar el resto del sistema con simulacro. Utilizará coverage.py para verificar si el código fuente del proyecto de tarea se está probando. Utilizará Jenkins para ejecutar suites de prueba y mostrar resultados a lo largo del tiempo. Y finalmente, verá cómo pytest se puede usar para ejecutar pruebas de unittest, así como para intercambiar accesorios de estilo pytest con pruebas basadas en unittest.
Lo que necesitas saber
Pitón
No necesitas ser un gurú de Python. Los ejemplos no hacen nada sobrenatural o extraño.
pip
Debe usar pip para instalar los complementos de pytest y el mismo pytest. Si desea actualizar pip, consulte el Apéndice 2, pip, en la página 159.
Línea de comando
Escribí este libro y capturé ejemplos de resultados usando bash en una computadora portátil Mac. Sin embargo, los únicos comandos que uso en bash son cd para ir a un directorio específico y, por supuesto, pytest. Como cd existe en Windows cmd.exe y en todos los shells de Unix que conozco, todos los ejemplos deberían estar disponibles para ejecutarse en cualquier aplicación de terminal que decida utilizar.
Eso es todo No necesita ser un experto en programación para comenzar a escribir pruebas automatizadas con pytest.
Muestras de código y recursos de Internet
Los ejemplos en este libro están escritos usando Python 3.6 y pytest 3.2. pytest 3.2 es compatible con Python 2.6, 2.7 y Python 3.3+.
El código fuente para el proyecto Tareas, así como para todas las pruebas que se muestran en este libro, está disponible en el enlace en la página web del libro en pragprog.com . No necesita descargar el código fuente para comprender el código de prueba; El código de prueba se presenta de forma conveniente en los ejemplos. Pero para seguir las tareas del proyecto o adaptar ejemplos de prueba para probar su propio proyecto (¡sus manos están desatadas!), Debe ir a la página web del libro para descargar el trabajo. Allí, en la página web del libro, hay un enlace a la publicación de erratas y al foro de discusión .
He estado programando durante más de veinticinco años, y nada me hizo escribir código de prueba tanto como Pytest. Espero que aprendas mucho de este libro, y espero que al final te encante el código de prueba como a mí.
Más lejos 