Categorías
Python

Inicio de sesión en Python

 

Tabla de Contenidos

  • Nuestro primer PyCon Junto
  • equipo InterviewsJim AndersonGeir Arne HjelleJames MertzDan Bader
  • Jim Anderson
  • Geir Arne Hjelle
  • James Mertz
  • Dan Bader
  • Resumen
  • Jim Anderson
  • Geir Arne Hjelle
  • James Mertz
  • Dan Bader

Hay muchas PyCons en todo el mundo cada año, pero el mayor de todos ellos es PyCon los Estados Unidos (Estados Unidos). Este año, más de 3.000 Pythonistas descendió en Cleveland, Ohio, para aprender, colaborar, contribuir, y encontrarse con viejos y nuevos amigos por igual. Estoy seguro que muchos de ustedes ya son conscientes de lo PyCon Estados Unidos es, pero si no, entonces sugeriría leer nuestra guía para PyCon para aprender más.

Nuestro primer PyCon Junto

Este año, real del pitón se dio la oportunidad de unirse a otros creadores de contenido en el stand PyCharm creadores de contenido, donde llegamos a pasar unos lectores de reuniones tiempo y miembros de la comunidad real del pitón . Ah, y nos dimos una tonelada de real del pitón pegatinas, y nos encontramos fuera de stock por completo! ¿Recibió el suyo?

El equipo también estaba excitado por nuestros autores Geir Arne Hjelle y Anthony Shaw, que estaban también allí como altavoces. Usted puede coger las grabaciones de sus conversaciones en plugins: añadiendo flexibilidad a las aplicaciones y Wily Python: La escritura más simple y más fácil de mantener Python en el canal de YouTube PyCon.

También tuvieron la suerte de ser capaz de organizar un espacio abierto real del pitón en PyCon para nuestros lectores. Tuvimos una excepcional participación, con 30 personas en asistencia.

Fue una gran oportunidad para nosotros, no sólo para llegar a agitar las manos y gracias por ayudarnos con su estímulo y retroalimentación, sino también para asegurarse de que podemos continuar empujando y producir mejor y un mejor contenido. Para escuchar la retroalimentación de los que asistieron fue una experiencia increíble, y nos va a tomar algunas de las ideas generadas de cara al futuro para ayudarnos a ofrecer una mejor experiencia de la lectura y el aprendizaje para usted.

A pesar de la conversación diaria en los grupos miembros y Slack personal, la mayoría del equipo real del pitón nunca había conocido en persona. Reunión cara a cara colegas y compartir una comida o una cerveza con ellos fue sin duda uno de los aspectos más destacados de toda la conferencia para mí personalmente.

Pero decidí a pedir al resto del equipo acerca de su experiencia, con la esperanza de que podríamos llegar a algunos consejos útiles consejos o acciones concretas para que en caso de que todavía tiene que asistir a su primera PyCon.

Hice las mismas tres preguntas a algunos de los miembros del equipo que asistieron a PyCon y cotejar sus respuestas a continuación. Las preguntas fueron: Entrevistas

equipo

sin más preámbulos, vamos a ver lo que tenían que decir.

Jim Anderson

estoy Jim Anderson, y yo soy un desarrollador de firmware embebido por día, trabajando principalmente en C ++ para las cámaras de seguridad de vídeo producen. Llego a hacer un poco de Python en el trabajo también. En real Python, soy un autor y un revisor técnico, por lo general tiende hacia los artículos que son ya sea de bajo nivel, herramienta relacionada, o temas generales CS.

Esta fue mi primera PyCon. Finalmente decidí ir simplemente debido a la emoción que estaba viendo al respecto en la comunidad real Python. La gente que sabía que habían sido previamente hablado hasta tanto. Tenían razón.

había tantos puntos destacados! Llegar a conocer finalmente a algunos de mis real Python compañeros de trabajo fue muy fresco, por supuesto, como era pasar un rato en la sección de contenido-creadores de la cabina PyCharm. (Gracias, JetBrains!)

yo diría que el mejor recuerdo que tengo, el que realmente solidificó la atmósfera en mi mente, estaba viendo un amigo de PythonistaCafe y PyCon hablar con alguien que estaba trabajando el lugar limpiando . Ella estaba tan tomada por la amabilidad de la conferencia que estaba preguntando por él y encontrar la manera de que pudiera ser una parte de ella el próximo año. Tal vez vamos a llegar a verla en Pittsburgh.

Hubo una charla que había programado para ir y sólo explotó el tiempo y se perdió. Fue la construcción de un páncreas artificial de código abierto, y todavía estoy decepcionado que no lo hacen. Es un gran tema y una gran charla.

Geir Arne Hjelle

Mi nombre es Geir Arne Hjelle, y me creció en un pequeño pueblo en el norte de Noruega. Actualmente, vivo en Oslo en la que trabajo con diferentes proyectos de ciencia de datos y aprendizaje automático. La mayoría de las veces, llego a utilizar Python y la excelente ciencia pila de datos construido encima de numpy.

he estado escribiendo para Python real desde la primavera de 2018, la mayoría de los paquetes y conceptos generales de Python. Mi primer artículo era sobre el paquete pathlib, y actualmente estoy trabajando en uno sobre el funcionamiento de las importaciones. Además, apoyo de otros autores al hacer una revisión de sus artículos, ambas revisiones contorno y revisiones técnicas.

Este año fue mi primera PyCon Estados Unidos. Vivo en Noruega, por lo que asistir a conferencias, principalmente en Europa. Esta caída, que estará en EuroSciPy por quinta vez. Sin embargo, después de unirse al equipo de real Python, yo estaba realmente tentado por la oportunidad de conocer a algunos de mis nuevos amigos y colegas en el medio silvestre.

James y yo consiguieron reunirse el pasado verano, pero por lo demás sabían todo el equipo por sus avatares holgura. Reunión y salir con el resto de la banda real Python, y nerding sobre algunos de los comentarios que hemos hecho el uno al otro son grandes recuerdos que atesorará durante mucho tiempo.

Hay tanto que sucede en PyCon. Fui todo en y me quedé por los tutoriales, la conferencia principal, y partes de las pruebas de velocidad. Me gustó mucho todo.

Los tutoriales eran grandes, incluyendo inmersión profunda de David Beazley en el cálculo lambda. (¡Sí, las matemáticas!) Tuve la suerte de llegar a dar una charla durante la conferencia, que fue muy divertido. Yo estaba muy bien cuidado antes de mi presentación: Creo que esta es la primera vez que he tenido mi propia habitación para las preparaciones, y alguien me caminando hacia la sala de presentación.

Posteriormente, tengo algunas preguntas muy agradables e interesantes. Durante las pruebas de velocidad, tengo que ayudar un poco en la nueva biblioteca importlib.metadata Jason Coombs y Barry Varsovia están armando para Python 3.8. Fue genial ver de primera mano cómo algunos de los desarrolladores principales están trabajando.

Tenía tantas grandes experiencias en Cleveland que es difícil pensar en cosas que no tengo la oportunidad de hacerlo. Si bien, voy a admitir que en este PyCon, estaba bastante centrado en mí mismo (especialmente con ser mi charla durante la última sesión de la conferencia).

La próxima vez, voy a dejar de lado algún tiempo para ser voluntario y asegúrese de que para apoyar el funcionamiento de la conferencia más que yo en esta ocasión. Fue genial ver cómo todo el mundo aportó: Me dieron la bienvenida y nos registramos por Ernest W. Durbin III, que era también el presidente de toda la conferencia.

James Mertz

estoy James Mertz, y soy un Ingeniero de Software Assurance en el Jet Propulsion Laboratory (JPL). Actualmente estoy trabajando en el proyecto Europa Clipper, que es un satélite que será orbitando alrededor de Júpiter y hacer viajes muy cerca cerca de la luna Europa. He estado escribiendo por Python real alrededor de un año ahora con temas que van desde la documentación de Python a cómo sacar el máximo provecho de PyCon.

Este es mi cuarto año en PyCon, por lo que estoy empezando a conocer a mi camino alrededor de la conferencia, aunque cada año es lo suficientemente diferente para mantener traerme de vuelta. Este año fue de lejos el mejor para mí por dos razones: el voluntariado y reunirse con la banda real Python (tanto los autores y los lectores).

En mi guía sobre cómo obtener el máximo rendimiento de PyCon, realmente poner un enfoque en ser voluntario en PyCon. Me di cuenta de que, mientras que yo había hecho algunas cosas en los últimos años, realmente no había practicado lo que predicaba. Decidí aceptar plenamente este y trataba de ayudar en todo lo que podía.

Al final de la conferencia, que tuvo:

  • sido un “gorila” tutorial para inmersión profunda de David Beazley en cálculo lambda
  • Ayudado con registro de entrada en el registro e incluso llegó a comprobar en Michael Kennedy desde Python Bytes y charlas Python para mí
  • Hecho la bolsa de botín relleno de baile en línea DJ-ed por Larry Hastings
  • sido un corredor personal de sesión (la persona que hace que el altavoz está en la habitación a tiempo)
  • Has estado en una silla personal de sesión (la persona quien introduce el altavoz)

a pesar de todo, he hecho algunas conexiones muy sorprendentes y sentí gran poder contribuir un poco a la comunidad que tanto amo.

Hablando de la comunidad, reunirse con la comunidad real Python fue otro momento muy importante. Como autores, realmente no conseguimos muchas oportunidades para reunirse con cada otra cara a cara. Por lo tanto, para cumplir finalmente con algunas de las personas que he llegado a conocer tan bien digitalmente, en el mundo físico, era una experiencia surrealista. Lo que hizo que era mejor que, a pesar de que estábamos todos de diferentes lugares del mundo con diferentes experiencias de la vida, hemos sido capaces de construir rápidamente un espíritu de equipo.

Tal vez incluso mejor que conocer a mis otros miembros del equipo real del pitón , que se reunía, los lectores. Llevamos a cabo nuestra primera real del pitón espacio abierto, donde muchos de los que se detuvo a conversar. Como autor de un editor digital, es difícil a veces para conectar con la gente que usted está escribiendo para, pero para mí, que se ha convertido en más fácil.

experiencia PyCon de este año fue en general bastante equilibrado como llegué a hacer un montón de redes, viendo charlas y tutoriales, e incluso el voluntariado. Lo único que podía pensar que me gustaría poder haber hecho era dar una presentación de algún tipo. Eso es lo que el próximo año es de embargo.

Dan Bader

Hey yo soy Dan Bader, y yo soy el dueño y editor en jefe aquí en real Python. También hago todo el back-end y el desarrollo de front-end para el CMS basado en Django y otras infraestructuras que se ejecuta en realpython.com.

Soy un largo tiempo de Pythonista y super apasionada sobre la enseñanza de Python. Publicar mi propio libro de programación Python fue un sueño de toda la vida y llegar a ejecutar real del pitón junto con un equipo impresionante ahora es la guinda del pastel!

Este año fue mi quinta PyCon, y no será el último, eso es seguro …

mis mejores momentos personales estaban colgando con el equipo tutorial real Python y conocer a muchos de ellos en persona por primera vez. Eso hizo que mi corazón saltar! Fuimos a buscar comida y bebidas un par de noches, y una memoria aleatoria que yo probablemente nunca olvido es averiguar cuánto Logan ama el espectáculo chicas de oro de TV: – D

Durante el día, los buenos chicos de JetBrains dio nosotros algo de espacio en su stand PyCharm, por lo que todos tenemos que llevar nuestra botín real Python y charlar con los lectores, así como la mano pegatinas y pines. Eso fue super divertido!

Otra gran memoria es el espacio abierto real Python organizamos donde varias docenas de lectores y miembros presentaron para decir “hola”. Que acaba de soplar mi mente y fue una de mis experiencias favoritas PyCon hasta ahora!

me sentí bastante quemado cuando llegué por primera vez en PyCon después de trabajar sin parar durante un par de meses en el lanzamiento de nuestras suscripciones función de video, y al ver esta participación masiva sentía increíble. Realmente no sé qué decir al principio! Gracias a todos por parar cerca 🙂

Este año fue también la segunda vez que fuimos anfitriones de un Meetup-espacio abierto para el foro PythonistaCafe , y fue super cool para ver cómo este proyecto poco loco ha provocado tal muy unida y temible comunidad ahora.

Otro punto a destacar fue la grabación en vivo de un episodio del podcast Talk Python junto con Mike Kennedy. Siempre una delicia salir con este chico 🙂

Ojalá hubiera tenido más tiempo para ir a las conversaciones. Me quedé muy impresionado con las conversaciones que Geir Arne y Anthony de la Tutorial Equipo real del pitón dio. Asegúrese de revisar las grabaciones cuando se tiene la oportunidad.

feliz Pythoning, y nos vemos el próximo año!

Resumen

Independientemente de la ubicación, un PyCon es una experiencia gozosa. Si usted es Colegas de la reunión, amigos en línea, o extraños que comparten una pasión que no sea Python, que es la gente que hacen que la experiencia especial. El viejo dicho, “vino de la lengua, pero se quedó para la comunidad” no es más cierto que en PyCon Estados Unidos.

No hay dos Pythonistas son los mismos, y hay algo para todos en la diversidad de los eventos, charlas y tutoriales que tienen lugar. En lo personal, yo estoy deseando PyCon del próximo año ya. Horario lo permite, voy a hacer todo lo posible para unirse a las pruebas de velocidad en 2020. Sin embargo, incluso si no consigo que marque eso de mi lista, ya sé que el año que viene voy a estar emocionado de conocer a usted y muchos otros, a pesar de mi introversión.

si estuviera en PyCon Estados Unidos y llegó a decir “hola”, o se unió a nosotros para los espacios abiertos pitón real o PythonistaCafe , a continuación, dejar un comentario a continuación y háganos saber lo que era su parte favorita de PyCon. ¿Cuál es tu un consejo le daría a alguien que asistirá a cualquier PyCon por primera vez el año que viene? codificación feliz!

Categorías
Python

Gestores de contexto Python y el «con» Declaración

 

Tabla de Contenidos

  • ¿Qué pasó en PyCon África
  • principal Conferencia
  • Moustapha Cisse: El potencial de impacto positivo a través de AI
  • Meili Triantafyllidi: lecciones aprendidas de 6 años en PyLadies Berlín
  • caramelo Tricia Khohliwe: Web Realidad Virtual y a-Frame
  • Nicolás del Grosso: Revelación de los espaguetis (Consejos para Refactorizando Código)
  • Jessica Upani: Esta cosa es Python realmente de trabajo?
  • Kelvin Oyana: Bridging the Talent brecha entre Comunidades Python e Industria
  • Daniele Procida: más simple del mundo, más barato Plotter
  • Ewa Jodlowska: Keynote
  • Anna Makarudze: Lo que el desarrollador de África puede hacer para aumentar la diversidad en Tech
  • Panel

  • discusión: el papel del desarrollador Python africana en la Comunidad
  • Anthony Shaw: el destacarse en un mundo de 20 millones de desarrolladores
  • Cierre principal: Kojo Idrissa
  • Sprints Día
  • Resumen

PyCon África era una maravilla, inspirar, y técnicamente iluminar conferencia que tuvo lugar en Accra, Ghana, del 6 de agosto al 10 de 2019 en la Universidad de Ghana. Esta conferencia fue la primera conferencia panafricana para los desarrolladores de Python y asistieron 323 Pythonistas de 26 países diferentes. La mayoría de los asistentes viajaron desde países de todo África, y varios oradores procedían de los EE.UU., los Países Bajos, Alemania, Brasil e Italia.

Python se está convirtiendo cada vez más adoptado en todo el mundo. En África, Python está ganando un lugar especial para sí mismo, donde se utiliza ampliamente para el desarrollo web y la ciencia de datos. empresas africanas están buscando desarrolladores con conocimientos de Python en estas áreas, y tener un PyCon en África proporciona una base de apoyo para ayuda a los programadores de África. Bono

gratuito: 5 pensamientos sobre Python Maestría, un curso gratuito para los desarrolladores de Python que muestra la hoja de ruta y la mentalidad que necesita para tomar sus habilidades de Python al siguiente nivel.

¿Qué pasó en PyCon África

En el día antes de que comenzara la conferencia principal, los asistentes tomaron algún tiempo para adaptarse. Los que se acaban de cómo empezar con Python asistió a una sesión Día principiantes dirigido por Joey Darko para ayudar a establecer sus ordenadores para el desarrollo de Python. Me uní a otro grupo de viajeros internacionales en un recorrido de Accra, Ghana. Visitamos muchos lugares turísticos como la Plaza de la Independencia, el centro cultural, y algunos de los mercados locales para tener una idea de la forma de Ghana de la vida.

Al día siguiente se dedicó a talleres, y dos se ejecutan simultáneamente en ambas las sesiones de mañana y tarde. El taller de Django niñas introdujo las mujeres y los principiantes a Django Django desarrollo. Otros talleres se centraron en conceptos como la visualización de datos, pruebas y iteradores.

principal Conferencia

La conferencia principal se inició el 8 de agosto y se inició con una ceremonia de apertura que contó con la danza tradicional de Ghana y las palabras de bienvenida de Marlene Mhangami, el Presidente de África Python. Cada día de la conferencia tenía una apertura y cierre de la charla de apertura.

vamos a echar un vistazo a algunas de las conversaciones que se dieron durante los dos días de la conferencia.

Moustapha Cisse: El potencial de impacto positivo a través de AI

Moustapha Cisse es el jefe del centro de la IA de Google en Accra y él dio el discurso de apertura en el primer día de la conferencia principal. La charla de moustapha era acerca de cómo tecnólogos africanos pueden utilizar la tecnología para resolver los problemas africanos. En su charla, habló de algunos de los trabajos que está involucrado en por Google y en el espacio de AI, como el uso de inteligencia artificial para la predicción de la enfermedad, y las imágenes de satélite para reunir información y estadísticas para la predicción de crecidas permitido por la IA.

Meili Triantafyllidi: lecciones aprendidas de 6 años en Berlín PyLadies

Meili Triantafyllidi es el co-fundador de PyLadies Berlín. Hay una serie de PyLadies y mujeres centrada en los grupos de usuarios de Python alrededor de África. Estos grupos están haciendo un montón de trabajo increíble, pero como todo en la vida, siempre hay margen de mejora.

Meili Triantafyllidi dio una charla oportuna sobre las lecciones que aprendió de seis años de funcionamiento de PyLadies Berlín. En su charla, ella compartió consejos y las mejores prácticas para la fabricación de los eventos más inclusiva, accesible y seguro. Su charla también cubrió la información sobre cómo ejecutar eventos, obtener los altavoces de la derecha, y mejorar las habilidades de hablar en público. reunión

Un PyLadies se llevó a cabo después de la charla de Meili. La reunión estableció un propósito y planes de apoyo a programadores de las mujeres en África, en particular mediante la creación de un canal dedicado PyLadies África en los PyLadies grupo Slack común.

caramelo Tricia Khohliwe: Web Realidad Virtual y A-Frame

caramelo Khohliwe, un altavoz Tech Mozilla, dio una charla sobre WebVR, una tecnología abierta que le permite experimentar la realidad virtual en su navegador independientemente del dispositivo que utilice. El objetivo de la charla de caramelo era A-Frame, un framework de desarrollo web para crear experiencias 3D y WebVR utilizando HTML. A partir de esta charla informativa, he aprendido cómo usar A-Frame para crear y dibujar componentes WebVR. Estoy deseando probarlo en proyectos futuros!

Nicolás Del Grosso: Revelación de los espaguetis (Consejos para Refactorizando Código)

Nick Del Grosso dio una charla sobre la refactorización de código. Explicó cómo el código de proyecto puede causar problemas y nos llevó a través del proceso de refactorización de forma segura. También habló de las estrategias para la identificación de código muerto, elegir buenos nombres de variables, y el uso de herramientas de código ayuda refactor.

Jessica Upani: es esta cosa Python realmente de trabajo?

Jessica Upani de la comunidad de Namibia Python dio una charla instructiva sobre los diferentes grupos de la comunidad Python en Namibia. Se refirió a los desafíos que venció y qué lecciones otras comunidades pitón africana pueden aprender de ellos.

Kelvin Oyana: Bridging the Gap Talento entre las comunidades de Python y la charla de Industria

Kelvin estaba a punto de la línea divisoria entre lo que las empresas esperan de los desarrolladores y lo que los desarrolladores pueden hacer realidad. También ofreció una idea de cómo esto puede reducir la diferencia, tanto por las comunidades y los desarrolladores individuales.

Daniele Procida: más simple del mundo, más barato Plotter

Daniele Procida es un desarrollador del núcleo de Django y uno de los miembros del equipo de organización de PyCon África. En su charla, Daniele presentó un interesante proyecto: un simple plotter construyó utilizando cartón, un software de Raspberry Pi, algunos servomotores, y Python. Su proyecto encarna el espíritu de inventiva e innovación que caracteriza a la empresa africana.

Ewa Jodlowska: Keynote

Ewa Jodlowska, el Director Ejecutivo de la Fundación para el Software Python (PSF), dio una charla magistral sobre el PSF, cómo se trabaja con la comunidad mundial, y sus planes para el futuro. Ewa arrojar más luz sobre los diferentes programas de la PSF se ejecuta para fomentar el crecimiento de la comunidad Python, tales como el programa de patrocinio y el Programa Embajador Python en América del Sur.

Anna Makarudze: Lo que el desarrollador de África puede hacer para aumentar la diversidad en Tech

Anna Makarudze dio el discurso de cierre en el primer día de la conferencia principal. Ella es una Software Engineer en BriteCore (uno de los patrocinadores de diamantes de PyCon África), el vicepresidente de la Django Software Foundation, y el Coordinador de recaudación de fondos para la Fundación de Django niñas. Anna se basó en sus experiencias en estas organizaciones para discutir como conferencias, organizaciones y desarrolladores individuales pueden aumentar las cifras de diversidad en la tecnología.

Mesa redonda: El papel del desarrollador Python africana en el

Comunidad Hubo una discusión de grupo de líderes en los negocios, la tecnología y el desarrollo comunitario. Marlene Manghami moderó el debate sobre el papel de la comunidad Python africano en el espacio global de tecnología. Sus panelistas fueron Salomón Apenya, Daniel Roy Greenfeld, y James Yankah.

Salomón Apenya es un Consultor Senior en Andela, una empresa que distribuye hallazgos y construye equipos de ingeniería en África. Daniel Roy Greenfeld es co-autor de dos bolas de Django y vicepresidente de Ingeniería de Ejecución BriteCore. James Yankah es el director gerente de Brompton Group, un grupo de empresas que ofrecen servicios de reclutamiento, formación, gestión, logística y seguridad.

Anthony Shaw: El destacarse en un mundo de 20 millones de desarrolladores

En el último día de la conferencia, tuve el placer de conocer y escuchar a Anthony Shaw, un compañero de real del pitón autor. Anthony dio una charla dirigida a los nuevos desarrolladores para ayudarles a tener éxito en sus carreras de desarrollo. En la charla, Anthony discutió maneras de salir adelante, crecer su conjunto de habilidades, aprender nuevas tecnologías, y luchar contra la duda y el síndrome de impostor. Concluyó con consejos sobre cómo clavar entrevistas técnicas.

Cierre principal: Kojo Idrissa

El cierre de apertura sobre el último día de la conferencia fue dada por Kojo Idrissa, un organizador para DjangoCon y una Django Eventos Fundación América del Norte (DEFNA) Embajador. Kojo refleja en las lecciones del pasado y cómo la diáspora africana ha tenido un efecto en todos nosotros.

Día Sprints

El día después de la conferencia principal se dedica a carreras cortas! Aquí es donde el grupo de personas para trabajar en varios proyectos de código abierto Python. Yo era parte de un equipo que trabajó en cortador de galletas y otros proyectos relacionados. Presenté un PR que quedó fusionado en el proyecto y también me ayudó a mentora otros miembros del equipo.

recomiendo cualquiera que no ha asistido a una carrera de velocidad antes de hacerlo! Es una gran manera de practicar sus habilidades, contribuyen a un proyecto de código abierto, y conoce a los desarrolladores involucrados en el proyecto.

Resumen

PyCon África fue un gran éxito y nada menos que fantástico! Fue un comienzo bueno para la comunidad africana, ya que reunió, por primera vez, los desarrolladores de Python de las diferentes comunidades del pitón africana. Asimismo, ha permitido saber de representantes de la PSF sobre cómo la comunidad Python está organizado y financiado. Para muchos, esta fue la primera vez que las personas de las diferentes comunidades se reunieron en persona después de años de colaboración en línea.

Para mí, la experiencia valió la pena el sacrificio y el gasto porque llegué a conocer y hablar con gente de todo el mundo y aprender acerca de cómo utilizan Python en su trabajo o estudios. Di una charla relámpago sobre cómo enviar notificaciones en el escritorio de scripts de Python utilizando Python y otras herramientas nativas de Linux.

Otro punto a destacar de asistir a PyCon África fue que pude conocer a muchos de nuestros lectores, y un número de ellos atribuye su éxito a gran parte del contenido que leen aquí en real del pitón . Anthony Shaw y también me regalaron muchos real del pitón pegatinas. Aquí hay una foto que tomamos con Edison, un amigo y lector de real del pitón :

0190809_113244.149c0fd85db5.jpg»>

Uno de los problemas que enfrentan los organizadores de la conferencia estaba haciendo accesible a tantas personas como sea posible. Los viajes dentro de África es caro y difícil para muchos africanos. Por ejemplo, un visado de entrada a Ghana solo cuesta $ 100 a $ 200 dólares estadounidenses. Añadir a que el costo de los viajes y el alojamiento, y el evento estaba fuera del alcance de muchas personas que estaban interesadas en asistir. donaciones

voluntarias de individuos y el patrocinio empresarial de real del pitón , BriteCore, Andela, y varios otros patrocinadores ayudaron a cubrir el costo de los pasajes, alojamiento, viajes y para aquellos que lo necesitaban. Si desea hacer que la gente más africanos que participan en Python, y luego considerar el apoyo a futuros eventos de Python en África y la contratación de los desarrolladores africanos para trabajar de forma remota en sus equipos.

En el momento de escribir estas líneas, los vídeos de la conferencia no se han puesto a disposición, pero hay un video destacado que también incluye entrevistas con algunos de los asistentes. También puede leer el informe oficial de los organizadores de la conferencia. Si usted está pensando en asistir a una PyCon cerca de usted, a continuación, echa un vistazo a cómo obtener el máximo rendimiento de PyCon.

Categorías
Python

Cómo sacar el máximo provecho de PyCon

 

Tabla de Contenidos

  • Proyecto LayoutLicensingREADMEContributing Guidelinessetup.py
  • Licensing
  • README
  • Contribuir Directrices
  • setup.py
  • GitHubHandling Tire RequestsVersioning, ramificación, y los lanzamientos
  • Tire el manejo de solicitudes
  • de versiones, ramificación, y liberaciones
  • Documentación
  • Automatizar el código de calidad
  • Colaboración vs Cooperación
  • Resumen
  • Licensing
  • README
  • Contribuir Directrices
  • setup.py Tire Manejo
  • Pide
  • de versiones, ramificación, y los lanzamientos

Este es un puesto de invitado por Patrick Altman, un apasionado pirata informático de código abierto, y vicepresidente de ingeniería en Eldarion.

En este artículo vamos a diseccionar una aplicación de Django repetitivo destinado a desarrollar rápidamente proyectos de código abierto que se adhieren a las convenciones ampliamente compartidos.

La disposición (o patrón) que vamos a estar viendo se basa en django-Raya-pagos. En este diseño se ha probado con éxito por más de 100 proyectos de código abierto diferentes publicados por Eldarion y Pinax.

a medida que avanza a través de este artículo, tenga en cuenta que su proyecto específico puede variar de este patrón; Sin embargo, hay una serie de elementos que son bastante comunes entre los proyectos de Python, y para algunos proyectos de código abierto de titulación en general. Nos centraremos en estos artículos.

Proyecto Disposición

Un diseño de proyecto de buena ayuda a un nuevo usuario navegar por su código fuente. Hay ciertas convenciones que son comúnmente aceptadas, así que son importantes para acatar. Además, un buen diseño de proyecto ayuda con el empaquetado. diseños

Proyecto

diferirán un poco dependiendo de si son paquetes de Python (como una aplicación Django reutilizable) o algo así como un proyecto de Django. Utilizando nuestro proyecto de ejemplo, nos gustaría destacar algunos aspectos del diseño, así como los archivos incluidos en el nivel superior del proyecto.

Debe reservar la raíz de su proyecto para los archivos de metadatos que describen diversos aspectos de su proyecto, como una licencia, CONTRIBUTING.md, README.rst, así como las secuencias de comandos para ejecutar pruebas y embalajes. Además, debe haber una carpeta en este nivel de la raíz que se llama lo que quiere el nombre del paquete de Python que sea. En nuestro ejemplo django-Raya-pagos es pagos. Por último, debe almacenar la documentación como un proyecto basado Sphinx en una carpeta llamada docs.

Licensing

En general, es mejor para licenciar su software en el MIT permisiva o licencias BSD si su objetivo es la adopción más extendida posible. Cuanto mayor es la adopción, la mayor exposición en entornos del mundo real variaron que aumenta la oportunidad para la retroalimentación y la cooperación a través de solicitudes de extracción. Almacenar el contenido de la licencia en un archivo de licencia en la raíz de su proyecto.

README

Cada proyecto debe tener un archivo README.rst en la raíz del proyecto. En este documento se debe presentar brevemente el usuario al proyecto, describir lo que resuelve un problema, y ​​proporcionar una rápida guía de introducción.

Nombre que README.rst y lo puso en la raíz de tu repositorio GitHub y la mostrará en la página principal del proyecto para los usuarios potenciales para ver y hojear a través de obtener una idea rápida de cómo el software puede ayudar a ellos.

Usando reStructuredText en lugar de Markdown en el readme se recomienda para que muestre muy bien en PyPI si publica su paquete.

Contribuir archivo Directrices

Un CONTRIBUTING.md analiza el libro de estilo de código, los procesos y directrices para las personas que deseen contribuir código a través de solicitudes de tiro para su proyecto. Esto es útil en la reducción de la barrera para las personas que deseen contribuir código. contribuyentes de primera vez pueden estar nervioso acerca de hacer algo mal o fuera de convenciones y el más detallado de este documento es más se puede comprobar a sí mismos sin tener que hacer preguntas que pudieran ser demasiado tímido para preguntar.

setup.py

Un buen empaque ayuda a la distribución de su proyecto. Al escribir un script setup.py, puede aprovechar utilidades de paquetes de Python para crear y publicar su proyecto en PyPI.

Este es un script muy simple. Por ejemplo, aquí está el núcleo del guión de django-Raya-pagos:

PACKAGE = "payments"
NAME = "django-stripe-payments"
DESCRIPTION = "a payments Django app for Stripe"
AUTHOR = "Patrick Altman"
AUTHOR_EMAIL = "paltman@eldarion.com"
URL = "https://github.com/eldarion/django-stripe-payments"
VERSION = __import__(PACKAGE).__version__

setup(
    name=NAME,
    version=VERSION,
    description=DESCRIPTION,
    long_description=read("README.rst"),
    author=AUTHOR,
    author_email=AUTHOR_EMAIL,
    license="BSD",
    url=URL,
    packages=find_packages(exclude=["tests.*", "tests"]),
    package_data=find_package_data(PACKAGE, only_in_packages=False),
    classifiers=[
        "Development Status :: 3 - Alpha",
        "Environment :: Web Environment",
        "Intended Audience :: Developers",
        "License :: OSI Approved :: BSD License",
        "Operating System :: OS Independent",
        "Programming Language :: Python",
        "Framework :: Django",
    ],
    install_requires=[
        "django-jsonfield>=0.8",
        "stripe>=1.7.9",
        "django>=1.4",
        "pytz"
    ],
    zip_safe=False
)

Hay varias cosas que suceden aquí. Recuerda que hemos discutido haciendo el archivo reStructuredText README.rst?

Eso se debe a que como se puede ver por la long_description estamos utilizando el contenido de ese archivo para poblar la página de destino en PyPI y ese es el lenguaje de marcas utilizado allí. Los clasificadores son un conjunto de metadatos que ayuda a poner su proyecto en las categorías adecuadas en PyPI.

Por último, el argumento install_requires se asegurará de que cuando el paquete está instalado que estas dependencias enumeradas se instalan o que ya están instalados.

GitHub

Si el proyecto no está en GitHub que están realmente desaparecidas. Seguro que hay otros DVCS basada en Web (sistema distribuido de control de versiones) sitios que ofrecen alojamiento gratuito de código abierto, pero ninguno ha hecho más por la fuente abierta que GitHub.

Manipulación y jalar solicitudes

parte de la construcción de un gran proyecto de código abierto está haciendo más grande que uno mismo. Esto implica no sólo aumentar simplemente la base de usuarios, sino también la base de contribuyentes. GitHub (y git en general) realmente ha transformado cómo se hace esto.

Una clave para el aumento de contribuyentes es responder en la gestión de las solicitudes de extracción. Esto no significa aceptar todas las contribuciones, pero también permanecen abiertas las respuestas de mentalidad y mango con la deferencia que le gustaría recibir si contribuían a otro proyecto.

No sólo cerca de las solicitudes que no desee, pero toma el tiempo para explicar por qué no se acepta, o si es posible explicar cómo se pueden mejorar para que puedan ser exceptuados. Si las mejoras son menores o que de lo contrario se pueden mejorar por sí mismo, seguir adelante y aceptarlo y luego hacer las correcciones que le gustaría. Hay una línea muy fina entre pedir mejoras en comparación con sólo les hace a sí mismo.

El principio rector es crear un ambiente acogedor y agradecido. Recuerde que sus colaboradores están ofreciendo su tiempo y energía para mejorar su proyecto.

versiones, la ramificación, y los lanzamientos

Lea y siga semántica de versiones al crear versiones.

Al hacer grandes lanzamientos siempre documentar cambios incompatibles con claridad hacia atrás. Es más fácil si el documento cambia a medida que los está cometiendo mediante la actualización de un archivo de registro de cambios a medida que trabaja entre versiones. Este archivo podría ser simplemente un fichero de cambios en la raíz de su proyecto, o parte de su documentación en un archivo en algún lugar como docs / changelog.rst. Esto le permitirá crear agradables notas de la versión con muy poco esfuerzo.

mantener estable al maestro. Siempre existe la posibilidad de que la gente va a usar el código maestro en lugar de un comunicado de paquetes. Crear ramas de características para el trabajo y de mezcla cuando se probó y relativamente estable.

Documentación

Ningún proyecto es totalmente completa hasta que hay una cierta cantidad de documentación. Una buena documentación ahorra a los usuarios de tener que leer el código fuente para determinar cómo utilizar el software. Una buena documentación comunica que se preocupa por sus usuarios.

Con Leer la documentación, que puede tener la documentación de renderizado y alojado de forma gratuita de forma automática. Se actualizará automáticamente en cada confirmación de dominar que es super cool.

Para utilizar Leer los documentos, se debe crear un proyecto de documentación basada en la documentación Sphinx carpeta en la raíz de su proyecto. Esto realmente es una cosa bastante simple y consiste en un Makefile y un archivo conf.py y luego una colección de archivos reStructuredText formateado. Esto se puede hacer de forma manual copiando y pegando el archivo Makefile y conf.py de un proyecto anterior y la modificación de los valores, o ejecutando:

$ pip install Sphinx
$ sphinx-quickstart

Código Automatización de Calidad

Hay una serie de herramientas que puede utilizar para ayudar a la calidad torreón bajo control de sus proyectos. Pelusa, pruebas y cobertura de las pruebas de todo debe ser utilizado para ayudar a asegurar la calidad no se mueve durante la vida del proyecto.

de inicio con pelusa con algo como pylint o pyflakes o PEP8. Todos ellos tienen sus ventajas y desventajas, que están más allá del alcance de este artículo para explorar. Punto es: estilo coherente es el primer paso de un proyecto de alta calidad. Además, ayudando con el estilo de estos borra de pueden ayudar a identificar algunos errores simples rápidamente.

Por ejemplo, para django-Raya-pagos, tenemos un guión que combina dos herramientas que ejecutan diferentes pelusa con excepciones personalizadas para nuestro proyecto:

# lint.sh
pylint --rcfile=.pylintrc payments && pep8 --ignore=E501 payments

Tome un vistazo al archivo .pylintrc en los django-Raya-pagos para el reporto ejemplos de algunas de las excepciones. Una cosa acerca de pylint es que es bastante agresivo y puede ser ruidoso con las cosas son que realmente no son problemáticos. Es necesario decidir por sí mismo para ajustar su propio archivo .pylintrc pero recomienda la documentación y el archivo para que sepa más adelante por qué se está excluyendo ciertas reglas.

Configuración de una buena infraestructura de la prueba es importante para demostrar que sus obras de código. Por otra parte, escribiendo algunas de sus pruebas de primera puede ayudar a pensar a través de su API. Incluso si usted escribe pruebas último, el acto de escribir pruebas expondrá puntos débiles en el diseño de su API y / u otros problemas de usabilidad que se pueden abordar antes de que se informa.

Parte de su infraestructura de pruebas debe implicar el uso de coverage.py para mantener un ojo en la cobertura de un módulo. Esta herramienta no le dirá si el código es probado, sólo usted puede hacer eso, sino que le ayudará a identificar el código que no se ejecuta en absoluto para que sepa qué código es definitivamente no se está probando.

Una vez que haya desprendimiento de fibras, scripts de pruebas y de cobertura integrado en su proyecto puede automatización de la configuración para que estas herramientas ejecutar en cada pulsación en una entornos más (por ejemplo, versiones diferentes de Python, diferentes versiones de Django, o ambos en una matriz de prueba) .

La creación de una integración Travis puede ejecutar pruebas de forma automática y borra de. Batas pueden ser añadidos a esta configuración para proporcionar la cobertura de la prueba histórica cuando Travis construye plazo. Ambos tienen características que le permiten incrustar una insignia en su README.md para mostrar estado más reciente construcción y cobertura.

Colaboración vs Cooperación

Durante DjangoCon 2011, David Eaves dio un discurso de apertura que elocuentemente en palabras la idea de que a pesar de la colaboración y la cooperación tienen definiciones similares, hay una sutil diferencia:

“Yo diría que la colaboración, la cooperación a diferencia , obliga a las partes involucradas en un proyecto a resolver los problemas de forma conjunta “.

Aleros va a dedicar un post entero específicamente a la forma en GitHub fue la fuerza motriz para la innovación cómo el código abierto funciona de forma específica, el aspecto de la gestión de la comunidad. En “Cómo GitHub guardadas Open Source” (ver Recursos), Alero afirma:

“Creo proyectos de código abierto funcionan mejor cuando los colaboradores son capaces de participar en la cooperación de bajo costo de transacción y colaboración elevado coste de transacción se reduce al mínimo. El genio de código abierto es que no requiere un grupo de debatir todos los temas y trabajar en forma colectiva los problemas, sino todo lo contrario “.

Él va a hablar sobre el valor de bifurcación y cómo se reduce el alto costo de la colaboración al permitir la cooperación bajo costo entre las personas capaces de asumir proyectos adelante sin permiso. Este se bifurcan empuja la necesidad de coordinación hasta soluciones están listas para ser fusionado en, lo que permite mucho más rápido y dinámico experimentación.

Puede dar forma a su proyecto de manera similar, con el mismo objetivo de aumentar la cooperación bajo costo y reducir al mínimo la colaboración cara a lo largo de la escritura, el mantenimiento y el apoyo a su proyecto siguiendo las convenciones y los patrones detallados en este post.

Resumen

Muchas estaba cubierto aquí con pequeños ejemplos reales. La mejor manera de aprender acerca de estas cosas en detalle es para navegar por los repositorios en GitHub de proyectos que hacen un buen trabajo en estos patrones.

Pinax tiene su propio repetitivo aquí, que puede ser utilizado para generar rápidamente un proyecto basado en las convenciones y los patrones que se encuentran en este post.

Tenga en cuenta, que incluso si vas con nuestra repetitivo o algún otro texto modelo, tendrá que encontrar un estilo en la ejecución de estas cosas que se ajuste a usted y su proyecto. Todas estas cosas son, además de escribir el código real de su proyecto, pero todos ayudan en el crecimiento de una comunidad de colaboradores.

Categorías
Python

Django marco Resto – Introducción

 

Tabla de Contenidos

  • Introducción
  • Prueba del Mock API
  • Prueba

  • un servicio que llega a las API Pruebas
  • Skipping que afectó a la real API
  • próximos pasos

A pesar de ser tan útil, APIs externas pueden ser un dolor de prueba. Al llegar a una API real, las pruebas están a merced del servidor externo, lo que puede dar lugar a los siguientes puntos de dolor:

  • El ciclo de solicitud-respuesta puede tardar varios segundos. Esto puede no parecer mucho al principio, pero los compuestos de tiempo con cada prueba. Imagínese llamar a una API 10, 50, o incluso 100 veces cuando se prueba toda su aplicación.
  • La API puede haber límites de ritmo establecido.
  • El servidor API puede ser inalcanzable. Puede que el servidor está en mantenimiento? Tal vez con un error y el equipo de desarrollo está trabajando para conseguir de nuevo funcional> ¿Realmente desea el éxito de sus pruebas a depender de la salud de un servidor que no controlas?

Sus pruebas no deben evaluar si un servidor API se está ejecutando; deberían probar si su código está funcionando como se esperaba.

En el tutorial anterior, se introdujo el concepto de objetos simulados, demostró cómo se podía utilizar para el código de prueba que interactúa con las API externas. Este tutorial se basa en los mismos temas, pero aquí se puede caminar a través de la forma de construir realmente un servidor simulacro en lugar de burlarse de las API. Con un servidor maqueta en su lugar, se pueden realizar pruebas de extremo a extremo. Puede utilizar la aplicación y obtener retroalimentación real desde el servidor simulacro en tiempo real.

Cuando termine de trabajar a través de los siguientes ejemplos, se han programado un simulacro de servidor básico y dos pruebas – uno que utiliza el servidor API real y uno que utiliza el servidor simulado. Ambas pruebas tendrán acceso al mismo servicio, una API que recupera una lista de usuarios.

NOTA: Este tutorial usa Python v3.5.1.

Introducción

Inicio siguiendo la sección de primeros pasos de la entrada anterior. O agarrar el código desde el repositorio. Asegúrese de que los pases de prueba antes de pasar:

$ nosetests --verbosity=2 project
test_todos.test_request_response ... ok

----------------------------------------------------------------------
Ran 1 test in 1.029s

OK
Prueba

el Mock API

Con la puesta en marcha completa, puede programar su servidor simulado. Escribir una prueba que describe el comportamiento: Proyecto

/ pruebas / test_mock_server.py

# Third-party imports...
from nose.tools import assert_true
import requests

def test_request_response():
url = 'http://localhost:{port}/users'.format(port=mock_server_port)

# Send a request to the mock API server and store the response.
response = requests.get(url)

# Confirm that the request-response cycle completed successfully.
assert_true(response.ok)

Aviso que comienza mirando casi idéntica a la prueba API real. La URL ha cambiado y ahora está apuntando a un punto final de la API en localhost donde el servidor simulacro se ejecutará.

Aquí es cómo crear un servidor de simulacro en Python: Proyecto

/ pruebas / test_mock_server.py

# Standard library imports...
from http.server import BaseHTTPRequestHandler, HTTPServer
import socket
from threading import Thread

# Third-party imports...
from nose.tools import assert_true
import requests

class MockServerRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
# Process an HTTP GET request and return a response with an HTTP 200 status.
self.send_response(requests.codes.ok)
self.end_headers()
return

def get_free_port():
s = socket.socket(socket.AF_INET, type=socket.SOCK_STREAM)
s.bind(('localhost', 0))
address, port = s.getsockname()
s.close()
return port

class TestMockServer(object):
@classmethod
def setup_class(cls):
# Configure mock server.
cls.mock_server_port = get_free_port()
cls.mock_server = HTTPServer(('localhost', cls.mock_server_port), MockServerRequestHandler)

# Start running mock server in a separate thread.
# Daemon threads automatically shut down when the main process exits.
cls.mock_server_thread = Thread(target=cls.mock_server.serve_forever)
cls.mock_server_thread.setDaemon(True)
cls.mock_server_thread.start()

def test_request_response(self):
url = 'http://localhost:{port}/users'.format(port=self.mock_server_port)

# Send a request to the mock API server and store the response.
response = requests.get(url)

# Confirm that the request-response cycle completed successfully.
print(response)
assert_true(response.ok)

En primer lugar, crear una subclase de BaseHTTPRequestHandler. Esta clase captura la petición y construye la respuesta al cambio. Reemplazar la función do_GET () para elaborar la respuesta para una solicitud HTTP GET. En este caso, basta con devolver un estado OK. A continuación, escribir una función para obtener un número de puerto disponible para el servidor simulacro de uso.

El siguiente bloque de código en realidad configura el servidor. Aviso cómo el código crea una instancia HTTPServer y lo pasa un número de puerto y un controlador. A continuación, crear un hilo, para que el servidor se puede ejecutar de forma asincrónica y el hilo principal del programa puede comunicarse con él. Hacer que el hilo de un demonio, que le dice al hilo de parada cuando las principales salidas del programa. Por último, iniciar el hilo para servir al servidor de simulacro para siempre (hasta que terminen las pruebas).

Crear una clase de prueba y mover la función de prueba a la misma. Debe añadir un método adicional para garantizar que el servidor simulacro se puso en marcha antes que cualquiera de las pruebas realizadas. Tenga en cuenta que este nuevo código vive dentro de una función especial a nivel de clase, setup_class ().

Ejecute las pruebas y verlos pasar:

$ nosetests --verbosity=2 project

a probar un servicio que llega a la API

Es posible que desee llamar a más de un punto final de la API en su código. A medida que el diseño de su aplicación, es probable que crear funciones de servicio para enviar peticiones a una API y luego procesar las respuestas de alguna manera. Tal vez va a almacenar los datos de respuesta en una base de datos. O se pasa los datos a una interfaz de usuario.

Refactor su código para tirar de la URL base API hardcoded en una constante. Añadir esta variable a un archivo constants.py : Proyecto

/ constants.py

BASE_URL = 'http://jsonplaceholder.typicode.com'

A continuación, encapsulan la lógica para recuperar los usuarios de la API en una función. Aviso cómo las nuevas direcciones URL puede ser creado por unirse a una ruta URL a la base.

proyecto / services.py

# Standard library imports...
from urllib.parse import urljoin

# Third-party imports...
import requests

# Local imports...
from project.constants import BASE_URL

USERS_URL = urljoin(BASE_URL, 'users')

def get_users():
response = requests.get(USERS_URL)
if response.ok:
return response
else:
return None

Mover el código del servidor maqueta del archivo de función para un nuevo archivo de Python, por lo que fácilmente se puede reutilizar. Añadir lógica condicional para el controlador de solicitudes para comprobar qué API punto final de la petición HTTP es la orientación. Reforzar la respuesta mediante la adición de un poco de información de cabecera y una carga útil sencilla respuesta básica. La creación del servidor y puntapié inicial de código se pueden encapsular en un método de conveniencia, start_mock_server (). proyecto

/ pruebas / mocks.py

# Standard library imports...
from http.server import BaseHTTPRequestHandler, HTTPServer
import json
import re
import socket
from threading import Thread

# Third-party imports...
import requests

class MockServerRequestHandler(BaseHTTPRequestHandler):
USERS_PATTERN = re.compile(r'/users')

def do_GET(self):
if re.search(self.USERS_PATTERN, self.path):
# Add response status code.
self.send_response(requests.codes.ok)

# Add response headers.
self.send_header('Content-Type', 'application/json; charset=utf-8')
self.end_headers()

# Add response content.
response_content = json.dumps([])
self.wfile.write(response_content.encode('utf-8'))
return

def get_free_port():
s = socket.socket(socket.AF_INET, type=socket.SOCK_STREAM)
s.bind(('localhost', 0))
address, port = s.getsockname()
s.close()
return port

def start_mock_server(port):
mock_server = HTTPServer(('localhost', port), MockServerRequestHandler)
mock_server_thread = Thread(target=mock_server.serve_forever)
mock_server_thread.setDaemon(True)
mock_server_thread.start()

Con los cambios en la lógica completado, alteran las pruebas a utilizar la nueva función de servicio. Actualizar las pruebas para comprobar el aumento de la información que se pasa de nuevo desde el servidor. proyecto

/ pruebas / test_real_server.py proyecto

# Third-party imports...
from nose.tools import assert_dict_contains_subset, assert_is_instance, assert_true

# Local imports...
from project.services import get_users

def test_request_response():
response = get_users()

assert_dict_contains_subset({'Content-Type': 'application/json; charset=utf-8'}, response.headers)
assert_true(response.ok)
assert_is_instance(response.json(), list)

/ pruebas / test_mock_server.py

# Third-party imports...
from unittest.mock import patch
from nose.tools import assert_dict_contains_subset, assert_list_equal, assert_true

# Local imports...
from project.services import get_users
from project.tests.mocks import get_free_port, start_mock_server

class TestMockServer(object):
@classmethod
def setup_class(cls):
cls.mock_server_port = get_free_port()
start_mock_server(cls.mock_server_port)

def test_request_response(self):
mock_users_url = 'http://localhost:{port}/users'.format(port=self.mock_server_port)

# Patch USERS_URL so that the service uses the mock server URL instead of the real URL.
with patch.dict('project.services.__dict__', {'USERS_URL': mock_users_url}):
response = get_users()

assert_dict_contains_subset({'Content-Type': 'application/json; charset=utf-8'}, response.headers)
assert_true(response.ok)
assert_list_equal(response.json(), [])

Aviso una nueva técnica que se utiliza en el test_ simulacro _server.py código. La línea de respuesta = get_users () se envuelve con una función patch.dict () de la biblioteca mock .

¿Qué hace esta afirmación?

Recuerde, ha movido la función requests.get () de la lógica de función para los get_users función de servicio (). Internamente, get_users () llama requests.get () utilizando la variable USERS_URL. La función patch.dict () reemplaza temporalmente el valor de la variable USERS_URL. De hecho, lo hace sólo en el ámbito de la sentencia with. Después de que las carreras de código, la variable USERS_URL se restaura a su valor original. Este código parches la URL a utilizar la dirección del servidor simulado.

Ejecutar las pruebas y los ven pasar.

$ nosetests --verbosity=2
test_mock_server.TestMockServer.test_request_response ... 127.0.0.1 - - [05/Jul/2016 20:45:30] "GET /users HTTP/1.1" 200 -
ok
test_real_server.test_request_response ... ok
test_todos.test_request_response ... ok

----------------------------------------------------------------------
Ran 3 tests in 0.871s

OK

Saltarse Pruebas de que afectó a la API real

Comenzamos este tutorial que describe los méritos de la prueba de un servidor de simulacro en lugar de uno real, sin embargo, su código prueba actualmente ambos. ¿Cómo se configura las pruebas de ignorar el servidor real? La biblioteca de Python ‘unittest’ ofrece varias funciones que le permiten saltarse las pruebas. Puede utilizar la función de salto condicional ‘skipIf’ junto con una variable de entorno para alternar las pruebas de servidores reales dentro y fuera. En el siguiente ejemplo, se pasa un nombre de etiqueta que debe ser ignorado:

$ export SKIP_TAGS=real

proyecto / constants.py proyecto

# Standard-library imports...
import os

BASE_URL = 'http://jsonplaceholder.typicode.com'
SKIP_TAGS = os.getenv('SKIP_TAGS', '').split()

/ pruebas / test_real_server.py

# Standard library imports...
from unittest import skipIf

# Third-party imports...
from nose.tools import assert_dict_contains_subset, assert_is_instance, assert_true

# Local imports...
from project.constants import SKIP_TAGS
from project.services import get_users

@skipIf('real' in SKIP_TAGS, 'Skipping tests that hit the real API server.')
def test_request_response():
response = get_users()

assert_dict_contains_subset({'Content-Type': 'application/json; charset=utf-8'}, response.headers)
assert_true(response.ok)
assert_is_instance(response.json(), list)

ejecutar las pruebas y prestar atención a cómo el verdadero prueba del servidor se ignora:

$ nosetests --verbosity=2 project
test_mock_server.TestMockServer.test_request_response ... 127.0.0.1 - - [05/Jul/2016 20:52:18] "GET /users HTTP/1.1" 200 -
ok
test_real_server.test_request_response ... SKIP: Skipping tests that hit the real API server.
test_todos.test_request_response ... ok

----------------------------------------------------------------------
Ran 3 tests in 1.196s

OK (SKIP=1)

próximos pasos

Ahora que ha creado un servidor de simulacro para probar sus llamadas a la API externos, puede aplicar este conocimiento a sus propios proyectos. Construir sobre las pruebas simples creadas aquí. Ampliar la funcionalidad del controlador para imitar el comportamiento de la API reales más de cerca.

Pruebe los siguientes ejercicios para subir de nivel:

  • devolver una respuesta con un estado de HTTP 404 (no encontrado) si se envía una petición con una ruta desconocida.
  • devolver una respuesta con un estado de HTTP 405 (Método no permitido) si se envía una solicitud con un método que no está permitido (POST, DELETE, UPDATE). datos de usuario real
  • cambio de una solicitud válida a / usuarios.
  • escribir pruebas para capturar esos escenarios.

Coge el código desde el repositorio.

Categorías
Python

Generación de datos aleatorios en Python (Guía)

 

Tabla de Contenidos

  • Introducción
  • Prueba del Mock API
  • Prueba

  • un servicio que llega a las API Pruebas
  • Skipping que afectó a la real API
  • próximos pasos

A pesar de ser tan útil, APIs externas pueden ser un dolor de prueba. Al llegar a una API real, las pruebas están a merced del servidor externo, lo que puede dar lugar a los siguientes puntos de dolor:

  • El ciclo de solicitud-respuesta puede tardar varios segundos. Esto puede no parecer mucho al principio, pero los compuestos de tiempo con cada prueba. Imagínese llamar a una API 10, 50, o incluso 100 veces cuando se prueba toda su aplicación.
  • La API puede haber límites de ritmo establecido.
  • El servidor API puede ser inalcanzable. Puede que el servidor está en mantenimiento? Tal vez con un error y el equipo de desarrollo está trabajando para conseguir de nuevo funcional> ¿Realmente desea el éxito de sus pruebas a depender de la salud de un servidor que no controlas?

Sus pruebas no deben evaluar si un servidor API se está ejecutando; deberían probar si su código está funcionando como se esperaba.

En el tutorial anterior, se introdujo el concepto de objetos simulados, demostró cómo se podía utilizar para el código de prueba que interactúa con las API externas. Este tutorial se basa en los mismos temas, pero aquí se puede caminar a través de la forma de construir realmente un servidor simulacro en lugar de burlarse de las API. Con un servidor maqueta en su lugar, se pueden realizar pruebas de extremo a extremo. Puede utilizar la aplicación y obtener retroalimentación real desde el servidor simulacro en tiempo real.

Cuando termine de trabajar a través de los siguientes ejemplos, se han programado un simulacro de servidor básico y dos pruebas – uno que utiliza el servidor API real y uno que utiliza el servidor simulado. Ambas pruebas tendrán acceso al mismo servicio, una API que recupera una lista de usuarios.

NOTA: Este tutorial usa Python v3.5.1.

Introducción

Inicio siguiendo la sección de primeros pasos de la entrada anterior. O agarrar el código desde el repositorio. Asegúrese de que los pases de prueba antes de pasar:

$ nosetests --verbosity=2 project
test_todos.test_request_response ... ok

----------------------------------------------------------------------
Ran 1 test in 1.029s

OK
Prueba

el Mock API

Con la puesta en marcha completa, puede programar su servidor simulado. Escribir una prueba que describe el comportamiento: Proyecto

/ pruebas / test_mock_server.py

# Third-party imports...
from nose.tools import assert_true
import requests

def test_request_response():
url = 'http://localhost:{port}/users'.format(port=mock_server_port)

# Send a request to the mock API server and store the response.
response = requests.get(url)

# Confirm that the request-response cycle completed successfully.
assert_true(response.ok)

Aviso que comienza mirando casi idéntica a la prueba API real. La URL ha cambiado y ahora está apuntando a un punto final de la API en localhost donde el servidor simulacro se ejecutará.

Aquí es cómo crear un servidor de simulacro en Python: Proyecto

/ pruebas / test_mock_server.py

# Standard library imports...
from http.server import BaseHTTPRequestHandler, HTTPServer
import socket
from threading import Thread

# Third-party imports...
from nose.tools import assert_true
import requests

class MockServerRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
# Process an HTTP GET request and return a response with an HTTP 200 status.
self.send_response(requests.codes.ok)
self.end_headers()
return

def get_free_port():
s = socket.socket(socket.AF_INET, type=socket.SOCK_STREAM)
s.bind(('localhost', 0))
address, port = s.getsockname()
s.close()
return port

class TestMockServer(object):
@classmethod
def setup_class(cls):
# Configure mock server.
cls.mock_server_port = get_free_port()
cls.mock_server = HTTPServer(('localhost', cls.mock_server_port), MockServerRequestHandler)

# Start running mock server in a separate thread.
# Daemon threads automatically shut down when the main process exits.
cls.mock_server_thread = Thread(target=cls.mock_server.serve_forever)
cls.mock_server_thread.setDaemon(True)
cls.mock_server_thread.start()

def test_request_response(self):
url = 'http://localhost:{port}/users'.format(port=self.mock_server_port)

# Send a request to the mock API server and store the response.
response = requests.get(url)

# Confirm that the request-response cycle completed successfully.
print(response)
assert_true(response.ok)

En primer lugar, crear una subclase de BaseHTTPRequestHandler. Esta clase captura la petición y construye la respuesta al cambio. Reemplazar la función do_GET () para elaborar la respuesta para una solicitud HTTP GET. En este caso, basta con devolver un estado OK. A continuación, escribir una función para obtener un número de puerto disponible para el servidor simulacro de uso.

El siguiente bloque de código en realidad configura el servidor. Aviso cómo el código crea una instancia HTTPServer y lo pasa un número de puerto y un controlador. A continuación, crear un hilo, para que el servidor se puede ejecutar de forma asincrónica y el hilo principal del programa puede comunicarse con él. Hacer que el hilo de un demonio, que le dice al hilo de parada cuando las principales salidas del programa. Por último, iniciar el hilo para servir al servidor de simulacro para siempre (hasta que terminen las pruebas).

Crear una clase de prueba y mover la función de prueba a la misma. Debe añadir un método adicional para garantizar que el servidor simulacro se puso en marcha antes que cualquiera de las pruebas realizadas. Tenga en cuenta que este nuevo código vive dentro de una función especial a nivel de clase, setup_class ().

Ejecute las pruebas y verlos pasar:

$ nosetests --verbosity=2 project

a probar un servicio que llega a la API

Es posible que desee llamar a más de un punto final de la API en su código. A medida que el diseño de su aplicación, es probable que crear funciones de servicio para enviar peticiones a una API y luego procesar las respuestas de alguna manera. Tal vez va a almacenar los datos de respuesta en una base de datos. O se pasa los datos a una interfaz de usuario.

Refactor su código para tirar de la URL base API hardcoded en una constante. Añadir esta variable a un archivo constants.py : Proyecto

/ constants.py

BASE_URL = 'http://jsonplaceholder.typicode.com'

A continuación, encapsulan la lógica para recuperar los usuarios de la API en una función. Aviso cómo las nuevas direcciones URL puede ser creado por unirse a una ruta URL a la base.

proyecto / services.py

# Standard library imports...
from urllib.parse import urljoin

# Third-party imports...
import requests

# Local imports...
from project.constants import BASE_URL

USERS_URL = urljoin(BASE_URL, 'users')

def get_users():
response = requests.get(USERS_URL)
if response.ok:
return response
else:
return None

Mover el código del servidor maqueta del archivo de función para un nuevo archivo de Python, por lo que fácilmente se puede reutilizar. Añadir lógica condicional para el controlador de solicitudes para comprobar qué API punto final de la petición HTTP es la orientación. Reforzar la respuesta mediante la adición de un poco de información de cabecera y una carga útil sencilla respuesta básica. La creación del servidor y puntapié inicial de código se pueden encapsular en un método de conveniencia, start_mock_server (). proyecto

/ pruebas / mocks.py

# Standard library imports...
from http.server import BaseHTTPRequestHandler, HTTPServer
import json
import re
import socket
from threading import Thread

# Third-party imports...
import requests

class MockServerRequestHandler(BaseHTTPRequestHandler):
USERS_PATTERN = re.compile(r'/users')

def do_GET(self):
if re.search(self.USERS_PATTERN, self.path):
# Add response status code.
self.send_response(requests.codes.ok)

# Add response headers.
self.send_header('Content-Type', 'application/json; charset=utf-8')
self.end_headers()

# Add response content.
response_content = json.dumps([])
self.wfile.write(response_content.encode('utf-8'))
return

def get_free_port():
s = socket.socket(socket.AF_INET, type=socket.SOCK_STREAM)
s.bind(('localhost', 0))
address, port = s.getsockname()
s.close()
return port

def start_mock_server(port):
mock_server = HTTPServer(('localhost', port), MockServerRequestHandler)
mock_server_thread = Thread(target=mock_server.serve_forever)
mock_server_thread.setDaemon(True)
mock_server_thread.start()

Con los cambios en la lógica completado, alteran las pruebas a utilizar la nueva función de servicio. Actualizar las pruebas para comprobar el aumento de la información que se pasa de nuevo desde el servidor. proyecto

/ pruebas / test_real_server.py proyecto

# Third-party imports...
from nose.tools import assert_dict_contains_subset, assert_is_instance, assert_true

# Local imports...
from project.services import get_users

def test_request_response():
response = get_users()

assert_dict_contains_subset({'Content-Type': 'application/json; charset=utf-8'}, response.headers)
assert_true(response.ok)
assert_is_instance(response.json(), list)

/ pruebas / test_mock_server.py

# Third-party imports...
from unittest.mock import patch
from nose.tools import assert_dict_contains_subset, assert_list_equal, assert_true

# Local imports...
from project.services import get_users
from project.tests.mocks import get_free_port, start_mock_server

class TestMockServer(object):
@classmethod
def setup_class(cls):
cls.mock_server_port = get_free_port()
start_mock_server(cls.mock_server_port)

def test_request_response(self):
mock_users_url = 'http://localhost:{port}/users'.format(port=self.mock_server_port)

# Patch USERS_URL so that the service uses the mock server URL instead of the real URL.
with patch.dict('project.services.__dict__', {'USERS_URL': mock_users_url}):
response = get_users()

assert_dict_contains_subset({'Content-Type': 'application/json; charset=utf-8'}, response.headers)
assert_true(response.ok)
assert_list_equal(response.json(), [])

Aviso una nueva técnica que se utiliza en el test_ simulacro _server.py código. La línea de respuesta = get_users () se envuelve con una función patch.dict () de la biblioteca mock .

¿Qué hace esta afirmación?

Recuerde, ha movido la función requests.get () de la lógica de función para los get_users función de servicio (). Internamente, get_users () llama requests.get () utilizando la variable USERS_URL. La función patch.dict () reemplaza temporalmente el valor de la variable USERS_URL. De hecho, lo hace sólo en el ámbito de la sentencia with. Después de que las carreras de código, la variable USERS_URL se restaura a su valor original. Este código parches la URL a utilizar la dirección del servidor simulado.

Ejecutar las pruebas y los ven pasar.

$ nosetests --verbosity=2
test_mock_server.TestMockServer.test_request_response ... 127.0.0.1 - - [05/Jul/2016 20:45:30] "GET /users HTTP/1.1" 200 -
ok
test_real_server.test_request_response ... ok
test_todos.test_request_response ... ok

----------------------------------------------------------------------
Ran 3 tests in 0.871s

OK

Saltarse Pruebas de que afectó a la API real

Comenzamos este tutorial que describe los méritos de la prueba de un servidor de simulacro en lugar de uno real, sin embargo, su código prueba actualmente ambos. ¿Cómo se configura las pruebas de ignorar el servidor real? La biblioteca de Python ‘unittest’ ofrece varias funciones que le permiten saltarse las pruebas. Puede utilizar la función de salto condicional ‘skipIf’ junto con una variable de entorno para alternar las pruebas de servidores reales dentro y fuera. En el siguiente ejemplo, se pasa un nombre de etiqueta que debe ser ignorado:

$ export SKIP_TAGS=real

proyecto / constants.py proyecto

# Standard-library imports...
import os

BASE_URL = 'http://jsonplaceholder.typicode.com'
SKIP_TAGS = os.getenv('SKIP_TAGS', '').split()

/ pruebas / test_real_server.py

# Standard library imports...
from unittest import skipIf

# Third-party imports...
from nose.tools import assert_dict_contains_subset, assert_is_instance, assert_true

# Local imports...
from project.constants import SKIP_TAGS
from project.services import get_users

@skipIf('real' in SKIP_TAGS, 'Skipping tests that hit the real API server.')
def test_request_response():
response = get_users()

assert_dict_contains_subset({'Content-Type': 'application/json; charset=utf-8'}, response.headers)
assert_true(response.ok)
assert_is_instance(response.json(), list)

ejecutar las pruebas y prestar atención a cómo el verdadero prueba del servidor se ignora:

$ nosetests --verbosity=2 project
test_mock_server.TestMockServer.test_request_response ... 127.0.0.1 - - [05/Jul/2016 20:52:18] "GET /users HTTP/1.1" 200 -
ok
test_real_server.test_request_response ... SKIP: Skipping tests that hit the real API server.
test_todos.test_request_response ... ok

----------------------------------------------------------------------
Ran 3 tests in 1.196s

OK (SKIP=1)

próximos pasos

Ahora que ha creado un servidor de simulacro para probar sus llamadas a la API externos, puede aplicar este conocimiento a sus propios proyectos. Construir sobre las pruebas simples creadas aquí. Ampliar la funcionalidad del controlador para imitar el comportamiento de la API reales más de cerca.

Pruebe los siguientes ejercicios para subir de nivel:

  • devolver una respuesta con un estado de HTTP 404 (no encontrado) si se envía una petición con una ruta desconocida.
  • devolver una respuesta con un estado de HTTP 405 (Método no permitido) si se envía una solicitud con un método que no está permitido (POST, DELETE, UPDATE). datos de usuario real
  • cambio de una solicitud válida a / usuarios.
  • escribir pruebas para capturar esos escenarios.

Coge el código desde el repositorio.

Categorías
Python

Entrevista comunidad Python con Mike Driscoll

 

Tabla de Contenidos

  • Introducción
  • Prueba del Mock API
  • Prueba

  • un servicio que llega a las API Pruebas
  • Skipping que afectó a la real API
  • próximos pasos

A pesar de ser tan útil, APIs externas pueden ser un dolor de prueba. Al llegar a una API real, las pruebas están a merced del servidor externo, lo que puede dar lugar a los siguientes puntos de dolor:

  • El ciclo de solicitud-respuesta puede tardar varios segundos. Esto puede no parecer mucho al principio, pero los compuestos de tiempo con cada prueba. Imagínese llamar a una API 10, 50, o incluso 100 veces cuando se prueba toda su aplicación.
  • La API puede haber límites de ritmo establecido.
  • El servidor API puede ser inalcanzable. Puede que el servidor está en mantenimiento? Tal vez con un error y el equipo de desarrollo está trabajando para conseguir de nuevo funcional> ¿Realmente desea el éxito de sus pruebas a depender de la salud de un servidor que no controlas?

Sus pruebas no deben evaluar si un servidor API se está ejecutando; deberían probar si su código está funcionando como se esperaba.

En el tutorial anterior, se introdujo el concepto de objetos simulados, demostró cómo se podía utilizar para el código de prueba que interactúa con las API externas. Este tutorial se basa en los mismos temas, pero aquí se puede caminar a través de la forma de construir realmente un servidor simulacro en lugar de burlarse de las API. Con un servidor maqueta en su lugar, se pueden realizar pruebas de extremo a extremo. Puede utilizar la aplicación y obtener retroalimentación real desde el servidor simulacro en tiempo real.

Cuando termine de trabajar a través de los siguientes ejemplos, se han programado un simulacro de servidor básico y dos pruebas – uno que utiliza el servidor API real y uno que utiliza el servidor simulado. Ambas pruebas tendrán acceso al mismo servicio, una API que recupera una lista de usuarios.

NOTA: Este tutorial usa Python v3.5.1.

Introducción

Inicio siguiendo la sección de primeros pasos de la entrada anterior. O agarrar el código desde el repositorio. Asegúrese de que los pases de prueba antes de pasar:

$ nosetests --verbosity=2 project
test_todos.test_request_response ... ok

----------------------------------------------------------------------
Ran 1 test in 1.029s

OK
Prueba

el Mock API

Con la puesta en marcha completa, puede programar su servidor simulado. Escribir una prueba que describe el comportamiento: Proyecto

/ pruebas / test_mock_server.py

# Third-party imports...
from nose.tools import assert_true
import requests

def test_request_response():
url = 'http://localhost:{port}/users'.format(port=mock_server_port)

# Send a request to the mock API server and store the response.
response = requests.get(url)

# Confirm that the request-response cycle completed successfully.
assert_true(response.ok)

Aviso que comienza mirando casi idéntica a la prueba API real. La URL ha cambiado y ahora está apuntando a un punto final de la API en localhost donde el servidor simulacro se ejecutará.

Aquí es cómo crear un servidor de simulacro en Python: Proyecto

/ pruebas / test_mock_server.py

# Standard library imports...
from http.server import BaseHTTPRequestHandler, HTTPServer
import socket
from threading import Thread

# Third-party imports...
from nose.tools import assert_true
import requests

class MockServerRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
# Process an HTTP GET request and return a response with an HTTP 200 status.
self.send_response(requests.codes.ok)
self.end_headers()
return

def get_free_port():
s = socket.socket(socket.AF_INET, type=socket.SOCK_STREAM)
s.bind(('localhost', 0))
address, port = s.getsockname()
s.close()
return port

class TestMockServer(object):
@classmethod
def setup_class(cls):
# Configure mock server.
cls.mock_server_port = get_free_port()
cls.mock_server = HTTPServer(('localhost', cls.mock_server_port), MockServerRequestHandler)

# Start running mock server in a separate thread.
# Daemon threads automatically shut down when the main process exits.
cls.mock_server_thread = Thread(target=cls.mock_server.serve_forever)
cls.mock_server_thread.setDaemon(True)
cls.mock_server_thread.start()

def test_request_response(self):
url = 'http://localhost:{port}/users'.format(port=self.mock_server_port)

# Send a request to the mock API server and store the response.
response = requests.get(url)

# Confirm that the request-response cycle completed successfully.
print(response)
assert_true(response.ok)

En primer lugar, crear una subclase de BaseHTTPRequestHandler. Esta clase captura la petición y construye la respuesta al cambio. Reemplazar la función do_GET () para elaborar la respuesta para una solicitud HTTP GET. En este caso, basta con devolver un estado OK. A continuación, escribir una función para obtener un número de puerto disponible para el servidor simulacro de uso.

El siguiente bloque de código en realidad configura el servidor. Aviso cómo el código crea una instancia HTTPServer y lo pasa un número de puerto y un controlador. A continuación, crear un hilo, para que el servidor se puede ejecutar de forma asincrónica y el hilo principal del programa puede comunicarse con él. Hacer que el hilo de un demonio, que le dice al hilo de parada cuando las principales salidas del programa. Por último, iniciar el hilo para servir al servidor de simulacro para siempre (hasta que terminen las pruebas).

Crear una clase de prueba y mover la función de prueba a la misma. Debe añadir un método adicional para garantizar que el servidor simulacro se puso en marcha antes que cualquiera de las pruebas realizadas. Tenga en cuenta que este nuevo código vive dentro de una función especial a nivel de clase, setup_class ().

Ejecute las pruebas y verlos pasar:

$ nosetests --verbosity=2 project

a probar un servicio que llega a la API

Es posible que desee llamar a más de un punto final de la API en su código. A medida que el diseño de su aplicación, es probable que crear funciones de servicio para enviar peticiones a una API y luego procesar las respuestas de alguna manera. Tal vez va a almacenar los datos de respuesta en una base de datos. O se pasa los datos a una interfaz de usuario.

Refactor su código para tirar de la URL base API hardcoded en una constante. Añadir esta variable a un archivo constants.py : Proyecto

/ constants.py

BASE_URL = 'http://jsonplaceholder.typicode.com'

A continuación, encapsulan la lógica para recuperar los usuarios de la API en una función. Aviso cómo las nuevas direcciones URL puede ser creado por unirse a una ruta URL a la base.

proyecto / services.py

# Standard library imports...
from urllib.parse import urljoin

# Third-party imports...
import requests

# Local imports...
from project.constants import BASE_URL

USERS_URL = urljoin(BASE_URL, 'users')

def get_users():
response = requests.get(USERS_URL)
if response.ok:
return response
else:
return None

Mover el código del servidor maqueta del archivo de función para un nuevo archivo de Python, por lo que fácilmente se puede reutilizar. Añadir lógica condicional para el controlador de solicitudes para comprobar qué API punto final de la petición HTTP es la orientación. Reforzar la respuesta mediante la adición de un poco de información de cabecera y una carga útil sencilla respuesta básica. La creación del servidor y puntapié inicial de código se pueden encapsular en un método de conveniencia, start_mock_server (). proyecto

/ pruebas / mocks.py

# Standard library imports...
from http.server import BaseHTTPRequestHandler, HTTPServer
import json
import re
import socket
from threading import Thread

# Third-party imports...
import requests

class MockServerRequestHandler(BaseHTTPRequestHandler):
USERS_PATTERN = re.compile(r'/users')

def do_GET(self):
if re.search(self.USERS_PATTERN, self.path):
# Add response status code.
self.send_response(requests.codes.ok)

# Add response headers.
self.send_header('Content-Type', 'application/json; charset=utf-8')
self.end_headers()

# Add response content.
response_content = json.dumps([])
self.wfile.write(response_content.encode('utf-8'))
return

def get_free_port():
s = socket.socket(socket.AF_INET, type=socket.SOCK_STREAM)
s.bind(('localhost', 0))
address, port = s.getsockname()
s.close()
return port

def start_mock_server(port):
mock_server = HTTPServer(('localhost', port), MockServerRequestHandler)
mock_server_thread = Thread(target=mock_server.serve_forever)
mock_server_thread.setDaemon(True)
mock_server_thread.start()

Con los cambios en la lógica completado, alteran las pruebas a utilizar la nueva función de servicio. Actualizar las pruebas para comprobar el aumento de la información que se pasa de nuevo desde el servidor. proyecto

/ pruebas / test_real_server.py proyecto

# Third-party imports...
from nose.tools import assert_dict_contains_subset, assert_is_instance, assert_true

# Local imports...
from project.services import get_users

def test_request_response():
response = get_users()

assert_dict_contains_subset({'Content-Type': 'application/json; charset=utf-8'}, response.headers)
assert_true(response.ok)
assert_is_instance(response.json(), list)

/ pruebas / test_mock_server.py

# Third-party imports...
from unittest.mock import patch
from nose.tools import assert_dict_contains_subset, assert_list_equal, assert_true

# Local imports...
from project.services import get_users
from project.tests.mocks import get_free_port, start_mock_server

class TestMockServer(object):
@classmethod
def setup_class(cls):
cls.mock_server_port = get_free_port()
start_mock_server(cls.mock_server_port)

def test_request_response(self):
mock_users_url = 'http://localhost:{port}/users'.format(port=self.mock_server_port)

# Patch USERS_URL so that the service uses the mock server URL instead of the real URL.
with patch.dict('project.services.__dict__', {'USERS_URL': mock_users_url}):
response = get_users()

assert_dict_contains_subset({'Content-Type': 'application/json; charset=utf-8'}, response.headers)
assert_true(response.ok)
assert_list_equal(response.json(), [])

Aviso una nueva técnica que se utiliza en el test_ simulacro _server.py código. La línea de respuesta = get_users () se envuelve con una función patch.dict () de la biblioteca mock .

¿Qué hace esta afirmación?

Recuerde, ha movido la función requests.get () de la lógica de función para los get_users función de servicio (). Internamente, get_users () llama requests.get () utilizando la variable USERS_URL. La función patch.dict () reemplaza temporalmente el valor de la variable USERS_URL. De hecho, lo hace sólo en el ámbito de la sentencia with. Después de que las carreras de código, la variable USERS_URL se restaura a su valor original. Este código parches la URL a utilizar la dirección del servidor simulado.

Ejecutar las pruebas y los ven pasar.

$ nosetests --verbosity=2
test_mock_server.TestMockServer.test_request_response ... 127.0.0.1 - - [05/Jul/2016 20:45:30] "GET /users HTTP/1.1" 200 -
ok
test_real_server.test_request_response ... ok
test_todos.test_request_response ... ok

----------------------------------------------------------------------
Ran 3 tests in 0.871s

OK

Saltarse Pruebas de que afectó a la API real

Comenzamos este tutorial que describe los méritos de la prueba de un servidor de simulacro en lugar de uno real, sin embargo, su código prueba actualmente ambos. ¿Cómo se configura las pruebas de ignorar el servidor real? La biblioteca de Python ‘unittest’ ofrece varias funciones que le permiten saltarse las pruebas. Puede utilizar la función de salto condicional ‘skipIf’ junto con una variable de entorno para alternar las pruebas de servidores reales dentro y fuera. En el siguiente ejemplo, se pasa un nombre de etiqueta que debe ser ignorado:

$ export SKIP_TAGS=real

proyecto / constants.py proyecto

# Standard-library imports...
import os

BASE_URL = 'http://jsonplaceholder.typicode.com'
SKIP_TAGS = os.getenv('SKIP_TAGS', '').split()

/ pruebas / test_real_server.py

# Standard library imports...
from unittest import skipIf

# Third-party imports...
from nose.tools import assert_dict_contains_subset, assert_is_instance, assert_true

# Local imports...
from project.constants import SKIP_TAGS
from project.services import get_users

@skipIf('real' in SKIP_TAGS, 'Skipping tests that hit the real API server.')
def test_request_response():
response = get_users()

assert_dict_contains_subset({'Content-Type': 'application/json; charset=utf-8'}, response.headers)
assert_true(response.ok)
assert_is_instance(response.json(), list)

ejecutar las pruebas y prestar atención a cómo el verdadero prueba del servidor se ignora:

$ nosetests --verbosity=2 project
test_mock_server.TestMockServer.test_request_response ... 127.0.0.1 - - [05/Jul/2016 20:52:18] "GET /users HTTP/1.1" 200 -
ok
test_real_server.test_request_response ... SKIP: Skipping tests that hit the real API server.
test_todos.test_request_response ... ok

----------------------------------------------------------------------
Ran 3 tests in 1.196s

OK (SKIP=1)

próximos pasos

Ahora que ha creado un servidor de simulacro para probar sus llamadas a la API externos, puede aplicar este conocimiento a sus propios proyectos. Construir sobre las pruebas simples creadas aquí. Ampliar la funcionalidad del controlador para imitar el comportamiento de la API reales más de cerca.

Pruebe los siguientes ejercicios para subir de nivel:

  • devolver una respuesta con un estado de HTTP 404 (no encontrado) si se envía una petición con una ruta desconocida.
  • devolver una respuesta con un estado de HTTP 405 (Método no permitido) si se envía una solicitud con un método que no está permitido (POST, DELETE, UPDATE). datos de usuario real
  • cambio de una solicitud válida a / usuarios.
  • escribir pruebas para capturar esos escenarios.

Coge el código desde el repositorio.

Categorías
Python

Sin cabeza Pruebas de selenio con Python y PhantomJS

 

Esta semana, me acompañan Bob Belderbos y Julián Sequeira de PyBites fama. Bob es un desarrollador de software de Oracle, España. Julian es un Centro de Datos Technician en Amazon Web Services, en Australia.

Únase a nosotros para discutir cómo PyBites se inició y lo que tienen en el almacén para su futuro. También veremos en el amor secreto de Bob del dibujo y el amor no tan secreto de Julian de una buena pinta.

Ricky: Bienvenido, Bob y Julian! O se trata de Julian y Bob? En cualquier caso, gracias por acompañarme en esta entrevista. Vamos a empezar con las primeras preguntas habituales. ¿Cómo se obtiene en la programación? ¿Cuándo comenzó a usar Python?

Julian: preferimos ir por “booleano”. En realidad no, pero vamos a hacer que se pegue.

Me picaron por primera vez por el error de programación (nunca mejor dicho!) En la secundaria, pero en realidad se sumergió en la codificación a finales de 2015.

que necesitaba una manera de rastrear las horas extraordinarias que estaba en la hora en mi papel de Ingeniero de Campo en Oracle a asegurarse de que estaba siendo pagado correctamente. Introduzca Python (en la recomendación de Bob).

Me hice un tiempo extra de seguimiento de la CLI que formaba parte de un sistema de menús rudimentaria con opciones simples para calcular mi después de impuestos pago de horas extras. Era básico, funcionaba un lujo, y me enganchó en Python.

Consejo: Son los casos de uso del mundo real que hacen que el palo de aprendizaje!

La velocidad y simplicidad de Python en comparación con mis días de escuela secundaria usando C ++ me enganchó. Entonces empezamos PyBites y el pitón conseguimos real. ( real del pitón , lo consigue?)

Bob: Para mí, todo comenzó en Sun Microsystems en 2009. Me movió en el grupo de apoyo Sistemas y encontró un nicho para desarrollar una aplicación web para analizar salidas de diagnóstico, de los que estaban recibiendo miles de personas cada mes. Esto se convirtió en una herramienta de primera necesidad para la organización de soporte, ahorrando muchas horas de trabajo tedioso cada día.

Esta herramienta de diagnóstico era una mezcla salvaje de scripting shell (bash / sed / awk), Perl, PHP, y algunos jQuery. La empresa decidió pasar a la automatización completa de las solicitudes de servicio, para el que escribió un nuevo marco en Perl, que pronto se convirtió en una pesadilla para el mantenimiento, así que empecé a buscar otras soluciones.

Esto fue en 2012. Me encontré con Python y empecé a aprenderlo. Fue amor a primera vista: con su diseño limpio y elegante (tipo de importación esto en su REPL ), la falta de aparatos ortopédicos y otros C-como sintaxis, sólo se lee como Inglés! Es muy sencillo de aprender los conceptos básicos de Python, sin embargo, bajo las sábanas, es muy versátil.

Hay un gran artículo de Eric Raymond en Linux Journal titulado Por qué Python? , que describe su revelación cuando él cambió de Perl a Python.

he experimentado algo similar. Después de una reescritura rápida de la estructura de automatización en Python, se hizo relativamente “fácil” de hacer cambios, y lo amplió con muchas nuevas e interesantes características, todo ello sin grandes dolores de cabeza. A pesar de que la transición en otro papel, la solución todavía se mantiene activa. Desde entonces, he tenido la suerte de usar Python para casi todo mi trabajo.

Ricky: que ambos estén más famoso (para mejor o peor) por ser los co-fundadores de PyBites. Para aquellos que no saben acerca de PyBites, lo que es, y cómo se empezar?

de Boole: PyBites simplemente comenzó como un simple blog para compartir lo que estábamos aprendiendo en el espacio de Python. (Se utiliza un generador de sitio estático llamado Pelican). Estábamos dispuestos a empujar a nosotros mismos más allá de simplemente leer libros y ver vídeos. Escribir entradas de blog que nos hizo muy profunda de buceo para asegurarse de que estábamos comunicando los conceptos adecuados.

Poco después de su creación, que comenzó a probar algunas ideas. Una era la de retarnos a nosotros mismos, como inspirados por el desafío de café de Noé Kagan. Así que un día Bob se acercó con un ejercicio de Python para que resolvamos por el final de la semana.

Encontramos una página del curso JavaScript en mm: ss tiempos por vídeo, pero no la duración total. La tarea consistía en raspar el sitio y sumar todas las marcas de tiempo de vídeo, el cálculo de la duración total del curso.

Al final de la semana (Sprint), comparamos nuestras soluciones y retrospected en nuestros aprendizajes. Hemos tenido este “club de la lucha momento” (quizás no tan violenta …) de “debemos hacer esto de nuevo en algún momento”, y así es como nuestro código blog / comunidad desafía línea nació.

Nos miramos a GitHub, configure una Repo retos para nosotros publicamos nuestros retos y soluciones para, y luego creó una rama separada de la comunidad que los demás tirar de solicitar a su trabajo.

La tracción que ganamos de esta provocó la idea de que se convirtió en nuestra plataforma de codificación: CodeChalleng.es. Se compone de una creciente colección de casi 200 ejercicios de Python (llamado mordeduras de Py ), que se puede codificar en la comodidad de su navegador.

Otra gran cosa para nosotros estaba completando el # 100DaysOfCode desafío, que compartimos activamente en nuestro blog y las redes sociales. Esto hizo que nos entrevistamos en el podcast Talk Python y, a su vez, nos llevó a producir el # 100DaysOfCode en Python por supuesto, junto con Michael Kennedy.

Una lección importante para nosotros aquí es que sólo tiene que empezar y perfeccionismo gota. Un montón de cosas increíbles que sucedió no fue planeado, pero vino a nosotros porque hemos puesto algo por ahí que el interés generado, y actuamos sobre la valiosa información que recibimos en el proceso!

Ricky: Julian, usted no es un programador de día, y que funciona como un centro de datos de Técnico en Servicios Web de Amazon. ¿Cómo ha estado aprendiendo a código junto a alguien tan logrado como Bob? Yo supongo que ayudaría tener a alguien más experimentado como su socio de negocios? ¿Hay algo que usted fue sorprendido por o que se encuentran difícil como usted aprendió a código?

Julian: brecha El Pythonic entre Bob y me ha sido la piedra angular de PyBites. De hecho, es lo que nos dimos daría a nuestro blog un giro único!

A tal fin, ha sido un poco de una mezcla. Cuando el código junto a alguien tan capaz como Bob, la primera sensación es la de asombro. Usted ve la elegancia de su código y su capacidad para resolver problemas que ha pasado horas en adelante, en cuestión de momentos. Es realmente inspirador!

Pero no siempre. Se hace más fácil caer en la trampa síndrome impostor:

  • “Es mi código cada vez va a ser tan bueno?”
  • “¿Por qué me molesto?”
  • “Sólo está siempre va a ser mejor!”

La realidad es que siempre va a haber alguien mejor cuando se trata de código, y la vida en general! Aprendí rápidamente que en lugar de centrarse en el vacío de habilidades, que debería estar centrado en mi propio código, siendo orgulloso de mis logros, y abrazando lo que aportan a la mesa.

suficiente Curiosamente, y esto se aplica a ambos, las dificultades que golpeó con el aprendizaje y la gestión de código eran insignificantes. Es decir, lo aceptamos y nos encanta. (Digo esto ahora, pero nunca en el momento!)

La parte difícil es sorprendente ha sido el lado del negocio real de PyBites! También voy a añadir que mis días de no ser un codificador profesional puede estar llegando a su fin! ( Shhh !)

Ricky: Bob, en sus propias palabras, cuando se está “no esta trabajando duro para el hombre” en su trabajo diario, que amas a proyectos pequeños ajustes y construir en su tiempo libre. ¿Qué tipo de proyectos tiene usted sobre la marcha actualmente?

Bob: Actualmente, casi todo mi tiempo se va a producir el contenido del curso y la mejora de nuestra plataforma mediante la adición de más ejercicios y características. Con un mayor uso, hay más preguntas y comentarios / solicitudes, pero disfrutar de cada minuto de ella, ya que proporciona una gran manera de enseñar y guiar a Python otros desarrolladores, algo que realmente disfruto.

También estoy tomando la especialización Coursera Ciencias Aplicadas de datos porque amo datos y desea integrar esta más en mi trabajo del día a día.

Cuando esto y nuestro próximo curso ( suspenso … ) se lleva a cabo, mi flujo de trabajo predeterminado seguirá siendo similar:

Es lo que me apasiona y se suma a PyBites’ creciente cuerpo de contenido.

Esto es realmente algo que recomiendo para cualquier programador / dev. CV son legado. Comience a construir su blog / GitHub / marca para que tenga una cartera puede mostrar. También le permite a la reutilización lo que se genera para los proyectos futuros, y es una gran manera de la red / colaborar con los demás.

Ricky: obvio que tanto la parte del Es el gen empresarial. (Usted sólo tiene que mirar en el estante de Bob para ver la evidencia.) ¿Cuál ha sido la parte más difícil o más difícil para usted con iniciar su propio negocio / lateral prisa (PyBites)? ¿Se encuentra sus respectivos talentos se compensan entre sí?

booleanas: Sin duda la parte más difícil ha estado manejando nuestras prioridades.

Las prioridades clave tanto de nuestras vidas resultan ser muy similares:

  • Familia / niños
  • completa Tiempo trabajos del día
  • aprendizaje
  • PyBites

Como PyBites crece, también lo hace la inversión de tiempo requerido. No podemos tomar ese tiempo lejos de nuestros trabajos del día o nuestras familias, por lo que definitivamente ha sido el mayor obstáculo tratando de encontrar un equilibrio aceptable.

La perspectiva que hemos adoptado es que “si tenemos tiempo para ver Netflix, entonces tenemos tiempo para trabajar en PyBites.”

Con ese fin, más a menudo que no, que conscientemente tomar la decisión de no ver la televisión, jugar juegos, o salir, y hacer que el tiempo nuestro tiempo PyBites. No suena como mucho, pero después de un largo día de trabajo y llevar a los niños a la cama, vuelve a ponerse en las herramientas para trabajar en PyBites puede ser extremadamente difícil!

Dicho esto, decimos abiertamente a quien quiera oírla que no estaríamos donde estamos sin nuestro apoyo mutuo de unos a otros.

Si usted está tomando en todo lo que vale la pena, entonces se consigue un socio de la responsabilidad. Llevamos a cabo mutuamente responsables de los artículos que adquieren y construir uno al otro cuando las cosas no salen exactamente nuestro camino.

Nuestros diferentes talentos más definitivamente se compensan entre sí. Julian tiende a ser más del escritor, narrador, vendedor, gerente de negocios, y “boca”, mientras que Bob empuja profundamente en código, construye y mantiene las herramientas, tiene ideas increíbles, y apoya a la comunidad técnica. La combinación de estos dos conjuntos de talento, y tiene una máquina bien engrasada PyBites.

La mejor parte (y siendo fiel a nuestra creencia fundamental de que se aprende haciendo) es que aprender unos de otros. Empujamos mutuamente para mejorar de forma continua, a vivir fuera de la caja, y siempre probar algo nuevo.

Ricky: Ahora para mi última pregunta. ¿Qué más se puede conseguir hasta en su tiempo libre? ¿Qué otras aficiones e intereses tiene usted, aparte de Python y codificación?

Bob: Jaja Python y la codificación es una gran parte, pero fuera de eso me encanta cada minuto que puedo pasar con mi esposa y dos hijos.

También estoy interesado en seguir una rutina de ejercicios diaria, especialmente en lo que nuestro trabajo requiere mucho tiempo de estar y la pantalla! Me encanta leer libros y consumir podcasts. Cuando más tiempo libre, el aprendizaje de idiomas y el dibujo son otras dos cosas que realmente me gustan.

Julian: bien, cortar la codificación y Python, uf!

Al igual que Bob, la prioridad es pasar tiempo con mi esposa y dos niños también. Cualquier persona con niños pequeños sabrá que realmente no tiene mucho tiempo después de que haya terminado quitar el polvo, así que el tiempo manía se limita en estos días.

Cuando hago tomar unos minutos raras, no PyBites, me encanta tocar la guitarra eléctrica, juego videojuegos, leer y jugar con mi Frambuesa Pi y domótica.

Además, siendo la mariposa social que soy, me encanta pasar el rato con amigos y disfrutar de unas cervezas. Me llegar a un pub, me gritar un buen Pilsner, y voy a ser su mejor amigo!

(Espera un segundo. Did Bob acaba de decir que le gusta dibujar?)

Ricky ¿Hay proyectos que desea compartir con nuestros lectores? ¿Dónde podemos encontrar más información acerca de ustedes y lo que está haciendo?

de Boole: Aparte del blog, nuestro orgullo y alegría es nuestra actual plataforma de Python ejercicios de codificación en línea.

También creó el # 100DaysOfCode en el curso de Python con Michael Kennedy y se han convertido en formadores en el Talk Python plataforma de formación a mí . Una vez más, algo que estamos muy orgullosos. (Más por venir en este espacio!)

Puede encontrar y seguir Julian en los lugares oscuros a continuación:

  • Twitter: @_juliansequeira
  • LinkedIn: https://www.linkedin.com/in/juliansequeira/
  • Udemy: yo también creó un frasco curso de introducción en Udemy! el blog
  • personal: https://www.techmoneykids.com/

Bob:

  • Twitter: @bbelderbos
  • LinkedIn: https://www.linkedin.com/in/bbelderbos/
  • Personal blog: https://bobbelderbos.com

Gracias Julian y Bob para una entrevista el entretenimiento. Si usted no ha obtenido PyBites últimamente, a continuación, le animo a hacerlo. Si tienes a alguien que le gustaría que yo entrevista como parte de esta serie, a continuación, dejar un comentario más abajo. codificación feliz!

Categorías
Python

Automatización web moderna con Python y selenio

 

Tabla de Contenidos

  • Qué KeyError Python generalmente significa
  • ¿Dónde más puede ver un KeyError Python en la librería estándar
  • cuando se necesita para criar a un KeyError Python en su propio código
  • Cómo manejar un KeyError Python Cuando You See ItThe solución habitual: .get () La solución Raras: Comprobación de KeysThe Solución general: try excepto
  • La solución habitual: .get ()
  • La solución Raras: Comprobación de llaves
  • la solución general: try excepto
  • Conclusión

  • The usual Solución: .get ()
  • la solución Raras: Comprobación de llaves
  • la solución general: try excepto

Mira ahora Este tutorial tiene un vídeo relacionado curso creado por el equipo del real Python . Mira que junto con el tutorial escrito para profundizar su comprensión: Excepciones Python KeyError y forma de abordarlos excepción KeyError de

Python es una excepción común encontrado por los principiantes. Saber por qué un KeyError se puede subir y algunas soluciones para evitar que se detenga su programa son pasos esenciales para mejorar como programador de Python.

Al final de este tutorial, usted sabrá:

  • Qué KeyError Python normalmente significa
  • Dónde más puede ver un KeyError en la biblioteca estándar
  • Como manejar un KeyError cuando lo ves
  • Bono

gratuito: Haga clic aquí para obtener nuestro libre Hoja de trucos Python que le muestra los conceptos básicos de Python 3, como trabajar con tipos de datos, diccionarios, listas y funciones de Python.

Qué excepción Python KeyError por lo general significa

Un KeyError Python es lo que se genera cuando se intenta acceder a una clave que no se encuentra en un diccionario (dict). documentación oficial de Python

dice que el KeyError se eleva cuando se accede a una asignación de teclas y no se encuentra en el mapeo. Un mapeo es una estructura de datos que se asigna un conjunto de valores a otro. El mapeo más común en Python es el diccionario.

El KeyError Python es un tipo de excepción y LookupError denota que no era una cuestión de recuperar la clave que estaba buscando. Cuando vea un KeyError, el significado semántico es que la clave se buscó no se pudo encontrar.

En el siguiente ejemplo, se puede ver un diccionario (edades) se define con las edades de tres personas. Al intentar acceder a una clave que no está en el diccionario, un KeyError se eleva:

>>> ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33}
>>> ages['Michael']
Traceback (most recent call last):
File "", line 1, in
KeyError: 'Michael'

Aquí, el intento de acceder a la clave ‘Michael’ en las edades resultados del diccionario en un KeyError siendo criados. En la parte inferior del rastreo, se obtiene la información relevante:

  • El hecho de que un KeyError se elevó
  • La llave que no se pudo encontrar, que era ‘Michael’

La segunda a la última línea dice que la línea que produce la excepción. Esta información es más útil cuando se ejecuta el código Python desde un archivo.

Nota: Cuando se produce una excepción en Python, que se realiza con un rastreo . El rastreo le da toda la información relevante para poder determinar por qué la excepción fue levantado y lo que lo causó.

aprender a leer una retraza de Python y la comprensión de lo que está diciendo es crucial para mejorar como programador de Python.

En el siguiente programa, se puede ver las edades diccionario definido de nuevo. Esta vez, se le pedirá que proporcione el nombre de la persona para recuperar la edad para:

1 # ages.py
2
3 ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33}
4 person = input('Get age for: ')
5 print(f'{person} is {ages[person]} years old.')

Este código se tome el nombre que proporciona en el indicador y el intento de recuperar la edad para esa persona. Lo que se teclea en el indicador de se utilizará como clave para las edades de diccionario, en la línea 4.

Repitiendo el ejemplo no desde arriba, obtenemos otra de rastreo, esta vez con información acerca de la línea en el archivo que el KeyError es resucitado de entre:

$ python ages.py
Get age for: Michael
Traceback (most recent call last):
File "ages.py", line 4, in
print(f'{person} is {ages[person]} years old.')
KeyError: 'Michael'

el programa falla cuando se le da una llave que no está en el diccionario. Aquí, últimas líneas del rastreo apuntan al problema. Archivo «ages.py», línea 4, en le indica qué línea de qué archivo produce la excepción KeyError resultante. A continuación, se muestran esa línea. Por último, la excepción KeyError proporciona la clave que falta.

Así se puede ver que la última línea del rastreo KeyError no le da suficiente información sobre su cuenta, pero las líneas antes de que se puede obtener mucho más cerca de la comprensión de lo que salió mal.

Nota: Al igual que el ejemplo anterior, la mayoría de los otros ejemplos en este tutorial de hacer uso de aviones F-cuerdas, que se introdujeron en Python 3.6.

¿Dónde más puede ver un KeyError Python en la Norma Biblioteca

La gran mayoría de las veces, un KeyError Python se eleva debido a una clave no se encuentra en un diccionario o una subclase diccionario (como os.environ).

En casos raros, también se puede ver que se crió en otros lugares en la biblioteca estándar de Python, como en el módulo de archivo zip, si un artículo no se encuentra en un archivo ZIP. Sin embargo, estos lugares conservan el mismo significado semántico de la KeyError Python, que no está encontrando la clave solicitada.

En el siguiente ejemplo, se puede ver utilizando la clase zipfile.ZipFile para extraer información acerca de un archivo ZIP usando .getinfo ():

>>> from zipfile import ZipFile
>>> zip_file = ZipFile('the_zip_file.zip')
>>> zip_file.getinfo('something')
Traceback (most recent call last):
File "", line 1, in
File "/patho/python/installation/zipfile.py", line 1304, in getinfo
'There is no item named %r in the archive' % name)
KeyError: "There is no item named 'something' in the archive"

Esto no parece realmente una búsqueda clave de diccionario. En su lugar, se trata de una llamada a zipfile.ZipFile.getinfo () que plantea la excepción.

El rastreo también se ve un poco diferente con un poco más de información dado que sólo la clave que falta: KeyError: «No hay ningún elemento denominado ‘algo’ en el archivo».

La última cosa a tener en cuenta es que la línea que planteó la KeyError no está en su código. Es en el código zip, pero las líneas anteriores del rastreo indica qué líneas en el código de la causa del problema.

cuando se necesita para criar a un KeyError Python en su propio código

Puede haber momentos en los que tiene sentido traer a colación una excepción de Python KeyError en su propio código. Esto se puede hacer mediante el uso de la palabra clave aumento y llamando la excepción KeyError:

raise KeyError(message)

Por lo general, el mensaje sería la clave que falta. Sin embargo, como en el caso del paquete zip, se puede optar por darle un poco más de información para ayudar a la próxima desarrollador a entender mejor lo que salió mal.

Si deciden criar a un KeyError Pitón en su propio código, simplemente asegúrese de que su caso de uso coincide con el significado semántico detrás de la excepción. Cabe indicar que la clave se buscó no se pudo encontrar.

Cómo manejar un KeyError Python cuando lo ves

cuando se encuentra con un KeyError, hay algunas formas estándar para manejarlo. Dependiendo de su caso de uso, algunas de estas soluciones podría ser mejor que los demás. El objetivo final es dejar de excepciones KeyError inesperados de ser levantada.

La solución habitual: .get ()

Si el KeyError se eleva desde una búsqueda de claves diccionario fracasado en su propio código, se puede utilizar .get () para devolver el valor ya sea encontrar en la clave especificada o un valor predeterminado.

Al igual que el ejemplo de recuperación de la edad de antes, el siguiente ejemplo muestra una mejor manera de obtener la edad del diccionario utilizando la clave proporcionada en el indicador:

1 # ages.py
2
3 ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33}
4 person = input('Get age for: ')
5 age = ages.get(person)
6
7 if age:
8 print(f'{person} is {age} years old.')
9 else:
10 print(f"{person}'s age is unknown.")

Aquí, la línea 5 muestra cómo se puede obtener el valor de la edad de las edades usando .get (). Esto dará lugar a la variable edad que tenga el valor de edad encontrado en el diccionario de la llave suministrada o un valor predeterminado, Nada en este caso.

Esta vez, no se obtiene una excepción KeyError elevada debido a la utilización del método más seguro .get () para obtener la edad en lugar de intentar acceder a la clave directamente:

$ python ages.py
Get age for: Michael
Michael's age is unknown.

En la ejecución ejemplo anterior, el KeyError está ya no se levantó cuando se proporciona una mala llave. La clave ‘Michael’ no se encuentra en el diccionario, pero mediante el uso de .get (), obtenemos una Ninguno regresó en lugar de un KeyError elevada.

La variable edad, o bien tener la edad de la persona encontraron en el diccionario o el valor por defecto (por defecto ninguno). También puede especificar un valor predeterminado diferente en la llamada .get () pasando un segundo argumento.

Se trata de la línea 5 del ejemplo anterior con una edad predeterminada diferente especificado utilizando .get ():

age = ages.get(person, 0)

Aquí, en lugar de ‘Michael’ Ninguno de regresar, volvería 0 porque no se encuentra la clave y el valor predeterminado valor de retorno es 0. ahora

la solución Raras: Comprobación de llaves

Hay momentos en que es necesario determinar la existencia de una clave en un diccionario. En estos casos, el uso de .get () no le puede dar la información correcta. Conseguir una Ninguno de regresar de una llamada a .get () podría significar que la clave no se ha encontrado o que el valor encontrado en la clave del diccionario es en realidad Ninguno.

Con un diccionario o un diccionario-como objeto, puede utilizar el operador in para determinar si una llave está en la asignación. Este operador devuelve un valor booleano (verdadero o falso) que indica si la clave se encuentra en el diccionario.

En este ejemplo, que está recibiendo un diccionario respuesta de llamar a una API. Esta respuesta podría tener un valor de clave de error definido en la respuesta, lo que indicaría que la respuesta está en un estado de error:

1 # parse_api_response.py
2 ...
3 # Assuming you got a `response` from calling an API that might
4 # have an error key in the `response` if something went wrong
5
6 if 'error' in response:
7 ... # Parse the error state
8 else:
9 ... # Parse the success state

Aquí, hay una diferencia en la comprobación para ver si existe la clave de error en la respuesta y la obtención de un valor predeterminado el valor de la clave. Este es un caso raro donde lo que en realidad se está buscando es si la clave está en el diccionario y no lo que el valor en esa clave es.

la solución general: try excepto

Al igual que con alguna excepción, siempre se puede utilizar la prueba, excepto el bloque para aislar el código de excepción potencial de sensibilización y proporcionar una solución de copia de seguridad.

Puede utilizar el intento, excepto bloque en un ejemplo similar al anterior, pero esta vez proporcionar un mensaje predeterminado a imprimir se debe levantar un KeyError en el caso normal:

1 # ages.py
2
3 ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33}
4 person = input('Get age for: ')
5
6 try:
7 print(f'{person} is {ages[person]} years old.')
8 except KeyError:
9 print(f"{person}'s age is unknown.")

Aquí, se puede ver el caso normal en el intento bloquear la impresión del nombre y la edad de la persona. El caso de copia de seguridad se encuentra en el bloque de excepción, en el que si un KeyError se eleva en el caso normal, entonces el caso de copia de seguridad es imprimir un mensaje diferente.

El intento excepto solución de bloqueo es también una gran solución para otros lugares que no sean compatibles con .get () o el operador in. También es la mejor solución si el KeyError está siendo levantado de código de otra persona.

Aquí hay un ejemplo usando el paquete zip de nuevo. Esta vez, el intento excepto bloque nos da una manera de detener la excepción KeyError de detener el programa:

>>> from zipfile import ZipFile
>>> zip = ZipFile('the_zip_file.zip')
>>> try:
... zip.getinfo('something')
... except KeyError:
... print('Can not find "something"')
...
Can not find "something"

Puesto que la clase ZipFile no proporciona .get (), al igual que lo hace el diccionario, es necesario utilizar el try excepto solución. En este caso, usted no tiene que saber de antemano qué valores son válidos para pasar a .getinfo ().

Conclusión

Ahora ya sabe algunos lugares comunes donde excepción KeyError de Python podría elevarse y algunos grandes soluciones que puede utilizar para evitar que se detenga su programa.

Ahora, la próxima vez que vea un KeyError levantó, se sabrá que es probable que sea sólo un mal diccionario de búsqueda de claves. También podrá encontrar toda la información que necesita para determinar dónde viene el error de mirar las últimas líneas de la traza.

Si el problema es una búsqueda de clave de diccionario en su propio código, a continuación, puede cambiar el acceso a la clave directamente en el diccionario a usar el método más seguro .get () con un valor de retorno por defecto. Si el problema no viene de su propio código, a continuación, utilizando la prueba, excepto bloque es la mejor opción para controlar el flujo de su código. Excepciones

no tienen que dar miedo. Una vez que sepa cómo entender la información proporcionada a usted en sus rastreos y la causa de la excepción, entonces usted puede utilizar estas soluciones para hacer sus programas de flujo más predecible.

Mira ahora Este tutorial tiene un vídeo relacionado curso creado por el equipo del Real Python. Mira que junto con el tutorial escrito para profundizar su comprensión: Excepciones Python KeyError y forma de abordarlos

Categorías
Python

Estructura Python Programa léxico

 

Tabla de Contenidos

  • Qué KeyError Python generalmente significa
  • ¿Dónde más puede ver un KeyError Python en la librería estándar
  • cuando se necesita para criar a un KeyError Python en su propio código
  • Cómo manejar un KeyError Python Cuando You See ItThe solución habitual: .get () La solución Raras: Comprobación de KeysThe Solución general: try excepto
  • La solución habitual: .get ()
  • La solución Raras: Comprobación de llaves
  • la solución general: try excepto
  • Conclusión

  • The usual Solución: .get ()
  • la solución Raras: Comprobación de llaves
  • la solución general: try excepto

Mira ahora Este tutorial tiene un vídeo relacionado curso creado por el equipo del real Python . Mira que junto con el tutorial escrito para profundizar su comprensión: Excepciones Python KeyError y forma de abordarlos excepción KeyError de

Python es una excepción común encontrado por los principiantes. Saber por qué un KeyError se puede subir y algunas soluciones para evitar que se detenga su programa son pasos esenciales para mejorar como programador de Python.

Al final de este tutorial, usted sabrá:

  • Qué KeyError Python normalmente significa
  • Dónde más puede ver un KeyError en la biblioteca estándar
  • Como manejar un KeyError cuando lo ves
  • Bono

gratuito: Haga clic aquí para obtener nuestro libre Hoja de trucos Python que le muestra los conceptos básicos de Python 3, como trabajar con tipos de datos, diccionarios, listas y funciones de Python.

Qué excepción Python KeyError por lo general significa

Un KeyError Python es lo que se genera cuando se intenta acceder a una clave que no se encuentra en un diccionario (dict). documentación oficial de Python

dice que el KeyError se eleva cuando se accede a una asignación de teclas y no se encuentra en el mapeo. Un mapeo es una estructura de datos que se asigna un conjunto de valores a otro. El mapeo más común en Python es el diccionario.

El KeyError Python es un tipo de excepción y LookupError denota que no era una cuestión de recuperar la clave que estaba buscando. Cuando vea un KeyError, el significado semántico es que la clave se buscó no se pudo encontrar.

En el siguiente ejemplo, se puede ver un diccionario (edades) se define con las edades de tres personas. Al intentar acceder a una clave que no está en el diccionario, un KeyError se eleva:

>>> ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33}
>>> ages['Michael']
Traceback (most recent call last):
File "", line 1, in
KeyError: 'Michael'

Aquí, el intento de acceder a la clave ‘Michael’ en las edades resultados del diccionario en un KeyError siendo criados. En la parte inferior del rastreo, se obtiene la información relevante:

  • El hecho de que un KeyError se elevó
  • La llave que no se pudo encontrar, que era ‘Michael’

La segunda a la última línea dice que la línea que produce la excepción. Esta información es más útil cuando se ejecuta el código Python desde un archivo.

Nota: Cuando se produce una excepción en Python, que se realiza con un rastreo . El rastreo le da toda la información relevante para poder determinar por qué la excepción fue levantado y lo que lo causó.

aprender a leer una retraza de Python y la comprensión de lo que está diciendo es crucial para mejorar como programador de Python.

En el siguiente programa, se puede ver las edades diccionario definido de nuevo. Esta vez, se le pedirá que proporcione el nombre de la persona para recuperar la edad para:

1 # ages.py
2
3 ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33}
4 person = input('Get age for: ')
5 print(f'{person} is {ages[person]} years old.')

Este código se tome el nombre que proporciona en el indicador y el intento de recuperar la edad para esa persona. Lo que se teclea en el indicador de se utilizará como clave para las edades de diccionario, en la línea 4.

Repitiendo el ejemplo no desde arriba, obtenemos otra de rastreo, esta vez con información acerca de la línea en el archivo que el KeyError es resucitado de entre:

$ python ages.py
Get age for: Michael
Traceback (most recent call last):
File "ages.py", line 4, in
print(f'{person} is {ages[person]} years old.')
KeyError: 'Michael'

el programa falla cuando se le da una llave que no está en el diccionario. Aquí, últimas líneas del rastreo apuntan al problema. Archivo «ages.py», línea 4, en le indica qué línea de qué archivo produce la excepción KeyError resultante. A continuación, se muestran esa línea. Por último, la excepción KeyError proporciona la clave que falta.

Así se puede ver que la última línea del rastreo KeyError no le da suficiente información sobre su cuenta, pero las líneas antes de que se puede obtener mucho más cerca de la comprensión de lo que salió mal.

Nota: Al igual que el ejemplo anterior, la mayoría de los otros ejemplos en este tutorial de hacer uso de aviones F-cuerdas, que se introdujeron en Python 3.6.

¿Dónde más puede ver un KeyError Python en la Norma Biblioteca

La gran mayoría de las veces, un KeyError Python se eleva debido a una clave no se encuentra en un diccionario o una subclase diccionario (como os.environ).

En casos raros, también se puede ver que se crió en otros lugares en la biblioteca estándar de Python, como en el módulo de archivo zip, si un artículo no se encuentra en un archivo ZIP. Sin embargo, estos lugares conservan el mismo significado semántico de la KeyError Python, que no está encontrando la clave solicitada.

En el siguiente ejemplo, se puede ver utilizando la clase zipfile.ZipFile para extraer información acerca de un archivo ZIP usando .getinfo ():

>>> from zipfile import ZipFile
>>> zip_file = ZipFile('the_zip_file.zip')
>>> zip_file.getinfo('something')
Traceback (most recent call last):
File "", line 1, in
File "/patho/python/installation/zipfile.py", line 1304, in getinfo
'There is no item named %r in the archive' % name)
KeyError: "There is no item named 'something' in the archive"

Esto no parece realmente una búsqueda clave de diccionario. En su lugar, se trata de una llamada a zipfile.ZipFile.getinfo () que plantea la excepción.

El rastreo también se ve un poco diferente con un poco más de información dado que sólo la clave que falta: KeyError: «No hay ningún elemento denominado ‘algo’ en el archivo».

La última cosa a tener en cuenta es que la línea que planteó la KeyError no está en su código. Es en el código zip, pero las líneas anteriores del rastreo indica qué líneas en el código de la causa del problema.

cuando se necesita para criar a un KeyError Python en su propio código

Puede haber momentos en los que tiene sentido traer a colación una excepción de Python KeyError en su propio código. Esto se puede hacer mediante el uso de la palabra clave aumento y llamando la excepción KeyError:

raise KeyError(message)

Por lo general, el mensaje sería la clave que falta. Sin embargo, como en el caso del paquete zip, se puede optar por darle un poco más de información para ayudar a la próxima desarrollador a entender mejor lo que salió mal.

Si deciden criar a un KeyError Pitón en su propio código, simplemente asegúrese de que su caso de uso coincide con el significado semántico detrás de la excepción. Cabe indicar que la clave se buscó no se pudo encontrar.

Cómo manejar un KeyError Python cuando lo ves

cuando se encuentra con un KeyError, hay algunas formas estándar para manejarlo. Dependiendo de su caso de uso, algunas de estas soluciones podría ser mejor que los demás. El objetivo final es dejar de excepciones KeyError inesperados de ser levantada.

La solución habitual: .get ()

Si el KeyError se eleva desde una búsqueda de claves diccionario fracasado en su propio código, se puede utilizar .get () para devolver el valor ya sea encontrar en la clave especificada o un valor predeterminado.

Al igual que el ejemplo de recuperación de la edad de antes, el siguiente ejemplo muestra una mejor manera de obtener la edad del diccionario utilizando la clave proporcionada en el indicador:

1 # ages.py
2
3 ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33}
4 person = input('Get age for: ')
5 age = ages.get(person)
6
7 if age:
8 print(f'{person} is {age} years old.')
9 else:
10 print(f"{person}'s age is unknown.")

Aquí, la línea 5 muestra cómo se puede obtener el valor de la edad de las edades usando .get (). Esto dará lugar a la variable edad que tenga el valor de edad encontrado en el diccionario de la llave suministrada o un valor predeterminado, Nada en este caso.

Esta vez, no se obtiene una excepción KeyError elevada debido a la utilización del método más seguro .get () para obtener la edad en lugar de intentar acceder a la clave directamente:

$ python ages.py
Get age for: Michael
Michael's age is unknown.

En la ejecución ejemplo anterior, el KeyError está ya no se levantó cuando se proporciona una mala llave. La clave ‘Michael’ no se encuentra en el diccionario, pero mediante el uso de .get (), obtenemos una Ninguno regresó en lugar de un KeyError elevada.

La variable edad, o bien tener la edad de la persona encontraron en el diccionario o el valor por defecto (por defecto ninguno). También puede especificar un valor predeterminado diferente en la llamada .get () pasando un segundo argumento.

Se trata de la línea 5 del ejemplo anterior con una edad predeterminada diferente especificado utilizando .get ():

age = ages.get(person, 0)

Aquí, en lugar de ‘Michael’ Ninguno de regresar, volvería 0 porque no se encuentra la clave y el valor predeterminado valor de retorno es 0. ahora

la solución Raras: Comprobación de llaves

Hay momentos en que es necesario determinar la existencia de una clave en un diccionario. En estos casos, el uso de .get () no le puede dar la información correcta. Conseguir una Ninguno de regresar de una llamada a .get () podría significar que la clave no se ha encontrado o que el valor encontrado en la clave del diccionario es en realidad Ninguno.

Con un diccionario o un diccionario-como objeto, puede utilizar el operador in para determinar si una llave está en la asignación. Este operador devuelve un valor booleano (verdadero o falso) que indica si la clave se encuentra en el diccionario.

En este ejemplo, que está recibiendo un diccionario respuesta de llamar a una API. Esta respuesta podría tener un valor de clave de error definido en la respuesta, lo que indicaría que la respuesta está en un estado de error:

1 # parse_api_response.py
2 ...
3 # Assuming you got a `response` from calling an API that might
4 # have an error key in the `response` if something went wrong
5
6 if 'error' in response:
7 ... # Parse the error state
8 else:
9 ... # Parse the success state

Aquí, hay una diferencia en la comprobación para ver si existe la clave de error en la respuesta y la obtención de un valor predeterminado el valor de la clave. Este es un caso raro donde lo que en realidad se está buscando es si la clave está en el diccionario y no lo que el valor en esa clave es.

la solución general: try excepto

Al igual que con alguna excepción, siempre se puede utilizar la prueba, excepto el bloque para aislar el código de excepción potencial de sensibilización y proporcionar una solución de copia de seguridad.

Puede utilizar el intento, excepto bloque en un ejemplo similar al anterior, pero esta vez proporcionar un mensaje predeterminado a imprimir se debe levantar un KeyError en el caso normal:

1 # ages.py
2
3 ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33}
4 person = input('Get age for: ')
5
6 try:
7 print(f'{person} is {ages[person]} years old.')
8 except KeyError:
9 print(f"{person}'s age is unknown.")

Aquí, se puede ver el caso normal en el intento bloquear la impresión del nombre y la edad de la persona. El caso de copia de seguridad se encuentra en el bloque de excepción, en el que si un KeyError se eleva en el caso normal, entonces el caso de copia de seguridad es imprimir un mensaje diferente.

El intento excepto solución de bloqueo es también una gran solución para otros lugares que no sean compatibles con .get () o el operador in. También es la mejor solución si el KeyError está siendo levantado de código de otra persona.

Aquí hay un ejemplo usando el paquete zip de nuevo. Esta vez, el intento excepto bloque nos da una manera de detener la excepción KeyError de detener el programa:

>>> from zipfile import ZipFile
>>> zip = ZipFile('the_zip_file.zip')
>>> try:
... zip.getinfo('something')
... except KeyError:
... print('Can not find "something"')
...
Can not find "something"

Puesto que la clase ZipFile no proporciona .get (), al igual que lo hace el diccionario, es necesario utilizar el try excepto solución. En este caso, usted no tiene que saber de antemano qué valores son válidos para pasar a .getinfo ().

Conclusión

Ahora ya sabe algunos lugares comunes donde excepción KeyError de Python podría elevarse y algunos grandes soluciones que puede utilizar para evitar que se detenga su programa.

Ahora, la próxima vez que vea un KeyError levantó, se sabrá que es probable que sea sólo un mal diccionario de búsqueda de claves. También podrá encontrar toda la información que necesita para determinar dónde viene el error de mirar las últimas líneas de la traza.

Si el problema es una búsqueda de clave de diccionario en su propio código, a continuación, puede cambiar el acceso a la clave directamente en el diccionario a usar el método más seguro .get () con un valor de retorno por defecto. Si el problema no viene de su propio código, a continuación, utilizando la prueba, excepto bloque es la mejor opción para controlar el flujo de su código. Excepciones

no tienen que dar miedo. Una vez que sepa cómo entender la información proporcionada a usted en sus rastreos y la causa de la excepción, entonces usted puede utilizar estas soluciones para hacer sus programas de flujo más predecible.

Mira ahora Este tutorial tiene un vídeo relacionado curso creado por el equipo del Real Python. Mira que junto con el tutorial escrito para profundizar su comprensión: Excepciones Python KeyError y forma de abordarlos

Categorías
Python

Python puro vs vs NumPy TensorFlow Comparación de Rendimiento

 

Tabla de Contenidos

  • Introducción a Pruebas en DjangoTypes de paquetes practicesStructureThird partes testsBest
  • Tipos de pruebas
  • Mejor practica paquetes Estructura
  • de terceros
  • ExamplesSetupTesting ModelsTesting ViewsTesting FormsTesting la API
  • Configuración
  • Prueba

  • modelos
  • Prueba

  • Vistas
  • Prueba

  • Formularios
  • Prueba

  • las API
  • la próxima vez
  • Tipos de pruebas de paquetes
  • de terceros
  • mejores prácticas
  • Estructura del setup
  • modelos
  • Testing

  • Testing

  • vistas
  • Prueba

  • Formularios
  • Prueba

  • la API

Prueba

es vital. Sin probar correctamente su código, que nunca se sabe si el código funciona como debería, ahora o en el futuro, cuando los cambios de código base. Incontables horas se pueden perder la solución de problemas causados ​​por cambios en el código base. Lo que es peor, puede que ni siquiera sabe que hay problemas en absoluto hasta los usuarios finales se quejan de ello, que obviamente no es la forma en que desea averiguar sobre descansos de código.

Tener pruebas en lugar será ayuda asegurar que si se rompe una función específica va a saber de él. Las pruebas también hacen que la depuración se rompe en el código mucho más fácil, lo que ahorra tiempo y dinero.

He perdido literalmente conciertos en el pasado de no probar nuevas funciones adecuadamente contra el antiguo código base. No dejes que esto te pase. Tome la prueba en serio. Va a tener más confianza en su código, y su empleador tendrá más confianza en usted. Básicamente se trata de una póliza de seguro.

Prueba ayuda estruturas buen código, encontrar errores y documentación de escritura.

En este post, vamos a estar mirando primero una introducción breve que incluye las mejores prácticas antes de mirar algunos ejemplos. Bono

gratuito: Haga clic aquí para obtener acceso a una guía gratuita Django Recursos de Aprendizaje (PDF) que le muestra sugerencias y trucos, así como los errores comunes a evitar al crear aplicaciones web Python + Django.

Introducción a Prueba de Django

Tipos de pruebas Unidad

y la integración son los dos principales tipos de pruebas: pruebas unitarias

    • están aislados pruebas que ponen a prueba una función específica. Las pruebas
    • de integración, por su parte, son las pruebas más grandes que se centran en el comportamiento del usuario y probar aplicaciones enteras. Dicho de otra manera, las pruebas de integración combina diferentes piezas de funcionalidad código para asegurarse de que se comportan correctamente.

    Centrarse en las pruebas unitarias. Escribir un montón de éstos. Estas pruebas son mucho más fáciles de escribir y pruebas de integración de depuración frente, y cuanto más se tenga, menos pruebas de integración que va a necesitar. Las pruebas unitarias deben ser rápidos. Vamos a ver algunas técnicas para acelerar las pruebas.

    Dicho esto, las pruebas de integración son a veces todavía necesario incluso si tiene cobertura con pruebas unitarias, ya que las pruebas de integración pueden ayudar a regresiones código de captura.

    En general, las pruebas de resultado ya sea en un éxito (resultados esperados), insuficiencia (resultados inesperados), o un error. No sólo es necesario para la prueba de los resultados esperados, sino también qué tan bien su código controla resultados inesperados.

    Mejor practica

    • actualizar localmente,
    • ejecutar el conjunto de pruebas, arreglar errores
    • , PUSH
    • al repositorio y puesta en escena, y luego prueba
    • de nuevo en la organización antes de enviar el código. Estructura

    Estructura

    sus pruebas para adaptarse a su proyecto. Me inclino a favor de poner todas las pruebas para cada aplicación en el archivo tests.py y agrupar las pruebas por lo que estoy probando – por ejemplo, modelos, vistas, formularios, etc.

    También se puede derivar (eliminar) las pruebas archivo .py por completo y estructurar sus pruebas de esta manera dentro de cada aplicación:

    └── app_name
    └── tests
    ├── __init__.py
    ├── test_forms.py
    ├── test_models.py
    └── test_views.py

    por último, se podría crear una carpeta de prueba independiente, que refleja toda la estructura del proyecto, la colocación de un archivo tests.py en cada carpeta de aplicación.

    proyectos más grandes deben utilizar una de las últimas estructuras. Si sabe que su proyecto más pequeño con el tiempo se escala en algo mucho más grande, lo mejor es utilizar una de las dos últimas estructuras también. Estoy a favor de la primera y la tercera estructuras, ya que me resulta más fácil diseñar pruebas para cada aplicación cuando todos ellos son visibles en una secuencia de comandos. Los paquetes de terceros

    Use los siguientes paquetes y bibliotecas para ayudar con la escritura y el funcionamiento de su banco de pruebas:

    • django-webtest: hace que sea mucho más fácil de escribir pruebas funcionales y afirmaciones que coinciden con la experiencia del usuario final. La combinación de estas pruebas con las pruebas de Selenium para una cobertura total en las plantillas y puntos de vista. la cobertura
    • : se utiliza para medir la efectividad de las pruebas, que muestra el porcentaje de su base de código cubierto por las pruebas. Si usted apenas está comenzando a establecer las pruebas de unidad, la cobertura puede ayudar a ofrecer sugerencias sobre lo que debe ser probado. La cobertura también se puede utilizar para convertir la prueba en un juego: Trato de aumentar el porcentaje de código cubierto por las pruebas de cada día, por ejemplo.
    • django-descubrir-corredor: ayuda a localizar las pruebas si se organizan de una manera diferente (por ejemplo, fuera del tests.py). Así que si a organizar sus pruebas en carpetas separadas, como en el ejemplo anterior, puede utilizar descubrir favorito para localizar las pruebas. factory_boy
    • , model_mommy, y mock: todo se utilizan en lugar de los accesorios o la ORM para poblar los datos necesarios para la prueba. Ambas instalaciones y el ORM puede ser lento y necesitan ser actualizados cada vez que cambia su modelo.

    Ejemplos

    En este ejemplo básico, que estarán probando: modelos

    • , vistas
    • , formas
    • , y
    • la API.

    Descargar el Github repo aquí para seguir a lo largo. Configuración

    Instalar cobertura y agregarlo a su INSTALLED_APPS: cobertura

    $ pip install coverage==3.6

    Run:

    $ coverage run manage.py test whatever -v 2

    uso nivel de verbosidad 2, -v 2, para más detalles. También puede probar su proyecto Django a la vez con este comando: cobertura de ejecutar la prueba manage.py -v 2.

    elaborar su propio informe para ver dónde debe comenzar la prueba:

    $ coverage html

    abierto django15 / htmlcov / index.html a ver los resultados de su informe. Desplazarse hasta la parte inferior del informe. Puede omitir todas las filas de la carpeta virtualenv. Nunca prueba de cualquier cosa que es una función integrada de Python o biblioteca ya los que ya se ponen a prueba. Puede mover su virtualenv fuera de la carpeta para hacer que el limpiador de informe después de que corrió. inicio de

    Let probando los modelos. Modelos de prueba

    Dentro del informe de cobertura, haga clic en el enlace para “Lo / modelos”. Usted debe ver esta pantalla:

    En esencia, este informe se indica que hay que probar el título de una entrada. Sencillo.

    abierto tests.py y agregue el siguiente código:

    from django.test import TestCase
    from whatever.models import Whatever
    from django.utils import timezone
    from django.core.urlresolvers import reverse
    from whatever.forms import WhateverForm

    # models test
    class WhateverTest(TestCase):

    def create_whatever(self, title="only a test", body="yes, this is only a test"):
    return Whatever.objects.create(title=title, body=body, created_at=timezone.now())

    def test_whatever_creation(self):
    w = self.create_whatever()
    self.assertTrue(isinstance(w, Whatever))
    self.assertEqual(w.__unicode__(), w.title)

    lo que está pasando aquí? Hemos creado esencialmente un objeto cualquiera y probó si el título creado emparejado el título de esperar – lo que hizo.

    Nota: asegúrese de que sus nombres de función comience con test, que no sólo es una convención común sino también para que Django-descubrir-corredor puede localizar la prueba. Además, las pruebas de escritura para todos de los métodos que se suman a su modelo. la cobertura de gestión Re

    :

    $ coverage run manage.py test whatever -v 2

    debería ver los siguientes resultados, indicando la prueba se ha superado:

    test_whatever_creation (whatever.tests.WhateverTest) ... ok

    ----------------------------------------------------------------------
    Ran 1 test in 0.002s

    OK

    Entonces, si nos fijamos en el informe de la cobertura de nuevo, los modelos debe ahora estar al 100%.

    Prueba

    Vistas Vistas

    Testing

    a veces puede ser difícil. Yo generalmente uso unidad de pruebas para comprobar los códigos de estado, así como selenio WebDriver para probar AJAX, Javascript, etc.

    Agregue el código siguiente a la clase WhateverTest en tests.py :

    # views (uses reverse)

    def test_whatever_list_view(self):
    w = self.create_whatever()
    url = reverse("whatever.views.whatever")
    resp = self.client.get(url)

    self.assertEqual(resp.status_code, 200)
    self.assertIn(w.title, resp.content)

    Aquí buscamos a la URL del cliente , almacenar los resultados en la variable resp y luego probar nuestras afirmaciones. En primer lugar, comprobamos si el código de respuesta es 200, y luego probamos la parte posterior de respuesta real. Usted debe obtener resultados thefollowing:

    test_whatever_creation (whatever.tests.WhateverTest) ... ok
    test_whatever_list_view (whatever.tests.WhateverTest) ... ok

    ----------------------------------------------------------------------
    Ran 2 tests in 0.052s

    OK

    Ejecutar el informe de nuevo. Ahora debería ver un enlace para “Lo / puntos de vista”, que muestra los siguientes resultados:

    Puede también pruebas de escritura para asegurarse de que algo falla. Por ejemplo, si un usuario necesita que estar conectado para crear un nuevo objeto, la prueba tendría éxito si en realidad no puede crear el objeto. La mirada de

    Veamos una prueba rápida de selenio:

    # views (uses selenium)

    import unittest
    from selenium import webdriver

    class TestSignup(unittest.TestCase):

    def setUp(self):
    self.driver = webdriver.Firefox()

    def test_signup_fire(self):
    self.driver.get("http://localhost:8000/add/")
    self.driver.find_element_by_id('id_title').send_keys("test title")
    self.driver.find_element_by_id('id_body').send_keys("test body")
    self.driver.find_element_by_id('submit').click()
    self.assertIn("http://localhost:8000/", self.driver.current_url)

    def tearDown(self):
    self.driver.quit

    if __name__ == '__main__':
    unittest.main()

    Instalar el selenio:

    $ pip install selenium==2.33.0

    Ejecutar las pruebas. Firefox se debe cargar (si lo tienes instalado) y ejecute la prueba. a continuación, afirmamos que la página se carga correcta tras la presentación. También puede comprobar para asegurarse de que el nuevo objeto se agrega a la base de datos.

    Prueba

    Formularios

    Añadir los siguientes métodos:

    def test_valid_form(self):
    w = Whatever.objects.create(title='Foo', body='Bar')
    data = {'title': w.title, 'body': w.body,}
    form = WhateverForm(data=data)
    self.assertTrue(form.is_valid())

    def test_invalid_form(self):
    w = Whatever.objects.create(title='Foo', body='')
    data = {'title': w.title, 'body': w.body,}
    form = WhateverForm(data=data)
    self.assertFalse(form.is_valid())

    Aviso la forma en que están generando los datos de la forma de JSON. Este es un accesorio.

    Ahora debe tener 5 pruebas que pasan:

    test_signup_fire (whatever.tests.TestSignup) ... ok
    test_invalid_form (whatever.tests.WhateverTest) ... ok
    test_valid_form (whatever.tests.WhateverTest) ... ok
    test_whatever_creation (whatever.tests.WhateverTest) ... ok
    test_whatever_list_view (whatever.tests.WhateverTest) ... ok

    ----------------------------------------------------------------------
    Ran 5 tests in 12.753s

    OK

    Usted podría también pruebas de escritura que afirmar si se muestra un mensaje de error determinado en base a los validadores en el propio formulario.

    Prueba

    la API

    En primer lugar, se puede acceder a la API desde esta dirección: http: // localhost: 8000 / api lo / formato / = JSON. Esta es una configuración sencilla, por lo que las pruebas serán bastante simple también.

    Instalar lxml y XML desactivado:

    $ pip install lxml==3.2.3
    $ pip install defusedxml==0.4.1

    Añadir los siguientes casos de prueba:

    from tastypie.test import ResourceTestCase

    class EntryResourceTest(ResourceTestCase):

    def test_get_api_json(self):
    resp = self.api_client.get('/api/whatever/', format='json')
    self.assertValidJSONResponse(resp)

    def test_get_api_xml(self):
    resp = self.api_client.get('/api/whatever/', format='xml')
    self.assertValidXMLResponse(resp)

    Simplemente estamos afirmando que obtenemos una respuesta en cada caso.

    la próxima vez

    En el siguiente tutorial, vamos a encontrar un ejemplo más complicado, así como el uso de model_mommy para la generación de datos de prueba. Una vez más, se puede agarrar el código desde el repositorio. Bono

    gratuito: Haga clic aquí para obtener acceso a una guía gratuita Django Recursos de Aprendizaje (PDF) que le muestra sugerencias y trucos, así como los errores comunes a evitar al crear aplicaciones web Python + Django.

    Tienes algo que añadir? Deja un comentario más abajo.