Introducci贸n de pruebas en Python. Parte 3

Amigos, tenemos buenas noticias para ustedes. En primer lugar, el sol finalmente brilla en la calle, lo que significa que la primavera est谩 comenzando a hacerse cargo de sus derechos. La segunda noticia es m谩s especializada: el 20 de marzo, la primera lecci贸n comienza en un nuevo hilo en el curso "Desarrollador de Python" , en relaci贸n con esto publicamos la parte final del art铆culo "Introducci贸n a las pruebas en Python", cuyas partes anteriores se pueden leer aqu铆 y aqu铆 .

Pruebas en m煤ltiples entornos

Hasta ahora, ha estado probando una versi贸n de Python utilizando un entorno virtual con un conjunto espec铆fico de dependencias. Pero siempre puede ser necesario probar la aplicaci贸n en varias versiones de Python o en varias versiones del paquete. Tox es una aplicaci贸n que automatiza las pruebas en m煤ltiples entornos.



Instalaci贸n Tox

Tox est谩 disponible en PyPl como un paquete para instalar a trav茅s de pip:

$ pip install tox 

Despu茅s de la instalaci贸n, puede proceder a configurar Tox.

Personalizando Tox para sus dependencias

Tox se configura a trav茅s del archivo de configuraci贸n en el directorio del proyecto. Contiene lo siguiente:

  • El comando para ejecutar para ejecutar las pruebas;
  • Cualquier paquete adicional requerido para ejecutarse;
  • Versiones de destino de Python seleccionadas para probar.

En lugar de aprender la sintaxis para configurar Tox, puede comenzar iniciando una aplicaci贸n de inicio r谩pido.

 $ tox-quickstart 

La herramienta de configuraci贸n Tox le har谩 preguntas y crear谩 un archivo similar al siguiente en tox.ini :

 [tox] envlist = py27, py36 [testenv] deps = commands = python -m unittest discover 

Antes de iniciar Tox, aseg煤rese de que el setup.py con los pasos de instalaci贸n para el paquete est茅 en la carpeta de la aplicaci贸n. De lo contrario, use la gu铆a de creaci贸n setup.py .

Y si su proyecto no est谩 destinado a la distribuci贸n en PyPl, puede omitir este requisito agregando la siguiente l铆nea al archivo tox.ini bajo el encabezado tox :

 [tox] envlist = py27, py36 skipsdist=True 

Si no crea setup.py, y la aplicaci贸n tiene algunas dependencias en PyPl, deber谩 aclararlas en la secci贸n testenv . Por ejemplo, Django requerir谩 lo siguiente:

 [testenv] deps = django 

Al final de este paso, puede ejecutar las pruebas.

Ahora puede ejecutar Tox, y crear谩 dos entornos virtuales: uno para Python 2.7 y otro para Python 3.6. El directorio Tox se llama .tox/ . En 茅l, Tox ejecutar谩 -m unittest discover para cada entorno virtual.

Puede comenzar este proceso llamando a Tox desde la l铆nea de comandos:

 $ tox 

Tox producir谩 resultados de prueba para cada entorno. Cuando inicia Tox por primera vez, lleva tiempo crear entornos virtuales, pero cuando ejecuta Tox la segunda vez, todo funcionar谩 mucho m谩s r谩pido.
Los resultados de Tox son bastante simples. Se crean entornos para cada versi贸n, se instalan dependencias y luego se ejecutan comandos de prueba.

Hay algunas opciones de l铆nea de comando adicionales que vale la pena recordar.
Ejecutando un solo entorno, por ejemplo, Python 3.6:

 $ tox -e py36 

Volver a crear el entorno virtual cuando la dependencia cambia o los paquetes secundarios est谩n da帽ados:

 $ tox -r 

Ejecutar Tox con resultados menos detallados:

 $ tox -q 

Ejecutar Tox con una salida m谩s detallada:

 $ tox -v 

Puede leer m谩s sobre Tox en el sitio de documentaci贸n de Tox .

Prueba de automatizaci贸n

Hasta ahora, ha realizado pruebas manualmente ejecutando el comando. Pero hay herramientas para ejecutar pruebas autom谩ticamente cuando se realizan cambios y confirmarlos en un repositorio con un sistema de control de versiones, por ejemplo, Git. Las herramientas de automatizaci贸n de pruebas a menudo se denominan herramientas CI / CD, que significa "Integraci贸n continua / Implementaci贸n continua". Pueden ejecutar pruebas, compilar y publicar aplicaciones, e incluso implementarlas en producci贸n.
Travis CI es uno de los muchos servicios de CI disponibles.

隆Travis CI funciona bien con Python, y ahora puede automatizar la ejecuci贸n de todas las pruebas creadas en la nube! Travis CI es gratuito para cualquier proyecto de c贸digo abierto en GitHub y GitLab y est谩 disponible por una tarifa para proyectos privados.

Para comenzar, inicie sesi贸n y autent铆quese con sus credenciales de GitHub o GitLab. Luego cree un archivo llamado .travis.yml con el siguiente contenido:

 language: python python: - "2.7" - "3.7" install: - pip install -r requirements.txt script: - python -m unittest discover 

Esta configuraci贸n le da a Travis CI las siguientes instrucciones:

  • Prueba de Python 2.7 y 3.7 (Opcionalmente, puede reemplazarlos por cualquier otro).
  • Instalar todos los paquetes enumerados en require.txt (puede eliminar esta secci贸n si no tiene dependencias).
  • Ejecutando python -m unittest descubre para ejecutar pruebas.

Despu茅s de confirmar y enviar este archivo, Travis CI ejecutar谩 estos comandos cada vez que ingrese a su repositorio remoto de Git. Los resultados se pueden ver en su sitio web.

Que sigue

Ahora ya sabe c贸mo escribir pruebas, agregarlas a su proyecto, ejecutarlas e incluso hacerlo autom谩ticamente, para que pueda familiarizarse con los m茅todos avanzados, que pueden ser 煤tiles a medida que crece la biblioteca de pruebas.

Introducci贸n a la aplicaci贸n Linter

Tox y Travis CI tienen una configuraci贸n de equipo de prueba. En este tutorial, usamos python -m unittest discover como equipo de prueba.

Puede proporcionar uno o m谩s comandos en estas herramientas, que agregar谩n nuevas herramientas para mejorar la calidad de la aplicaci贸n.

Una de esas aplicaciones es el linter. Ver谩 tu c贸digo y dejar谩 comentarios. Por lo tanto, puede dar consejos sobre errores, corregir espacios finales e incluso anticipar posibles errores.

Para obtener m谩s informaci贸n sobre linters, consulte el Tutorial de calidad de c贸digo de Python .

Revestimiento pasivo con escamas8

flake8 es un linter popular que deja comentarios sobre el estilo de su c贸digo de acuerdo con la especificaci贸n PEP 8 .

Puede instalar flake8 usando pip:

 $ pip install flake8 

Luego puede ejecutar flake8 para un solo archivo, carpeta o plantilla:

 $ flake8 test.py test.py:6:1: E302 expected 2 blank lines, found 1 test.py:23:1: E305 expected 2 blank lines after class or function definition, found 1 test.py:24:20: W292 no newline at end of file 

Ver谩 una lista de errores y advertencias en su c贸digo encontrado por flake8 .
flake8 se puede configurar en la l铆nea de comando o en el archivo de configuraci贸n del proyecto. Si desea ignorar algunas reglas, por ejemplo E305, que se muestra arriba, puede establecer esto en la configuraci贸n. flake8 verificar谩 el archivo flake8 en la carpeta del proyecto o el archivo setup.cfg . Si desea utilizar Tox, puede agregar la flake8 configuraci贸n de tox.ini a tox.ini .

Este ejemplo ignora los directorios .git y __pycache__ , as铆 como la regla E305. Adem谩s, la longitud m谩xima de una cadena aumenta de 80 caracteres a 90. En alg煤n momento se dar谩 cuenta de que el l铆mite est谩ndar de 79 caracteres por l铆nea no es adecuado para las pruebas que pueden contener nombres largos de m茅todos, literales de cadena con valores de prueba y Otros datos largos. Por lo general, para las pruebas, aumente la longitud de la cadena a 120 caracteres:

 [flake8] ignore = E305 exclude = .git,__pycache__ max-line-length = 90 

Alternativamente, puede proporcionar estas opciones en la l铆nea de comando:

 $ flake8 --ignore E305 --exclude .git,__pycache__ --max-line-length=90 

Puede encontrar una lista completa de configuraciones en el sitio de documentaci贸n .
Ahora puede agregar flake8 a su configuraci贸n de CI. Para Travis CI, se ver谩 as铆:

 matrix: include: - python: "2.7" script: "flake8" 

Travis leer谩 la configuraci贸n en .flake8 y no podr谩 completar la compilaci贸n si hay errores de pelusa. Aseg煤rese de agregar la dependencia flake8 al archivo flake8 .

Linting agresivo con formateador de c贸digo

flake8 es un linter pasivo que solo recomienda ediciones; deber谩 ingresarlas en el c贸digo usted mismo. El formateador de c贸digo es un enfoque m谩s agresivo. Cambia el c贸digo autom谩ticamente seg煤n los estilos y dise帽os.

black es un formateador muy inexorable. No tiene ajustes y es muy meticuloso. Lo que lo convierte en una gran herramienta para insertar en su tuber铆a de prueba.

Tenga en cuenta: el negro requiere Python versi贸n 3.6 y superior.

Puede instalar black usando pip:

 $ pip install black 

Luego, para comenzar desde la l铆nea de comando, especifique el archivo o directorio que desea formatear:

 $ black test.py 

Mantenga limpio el c贸digo de prueba

Puede notar que al escribir pruebas copiar谩 y pegar谩 fragmentos de c贸digo con mucha m谩s frecuencia que al crear aplicaciones regulares. De vez en cuando, las pruebas pueden ser muy mon贸tonas, pero esta no es una raz贸n para descartar el c贸digo de forma inexacta y fragmentada.

Con el tiempo, la deuda t茅cnica se acumular谩 en su c贸digo de prueba, y realizar los cambios necesarios para cambios significativos en el c贸digo de la aplicaci贸n en las pruebas resultar谩 muy dif铆cil debido a la estructura.

Cuando escriba pruebas, intente seguir el principio DRY: no se repita.

Los accesorios y las funciones de prueba son una excelente manera de escribir c贸digo que es f谩cil de mantener. Adem谩s, no te olvides de la facilidad de lectura. Considere implementar herramientas de flake8 como flake8 en su c贸digo de prueba:

 $ flake8 --max-line-length=120 tests/ 

Las pruebas para detectar disminuciones de productividad entre ediciones

Hay muchas formas de comparar el c贸digo en Python. La biblioteca est谩ndar tiene un m贸dulo timeit que programa funciones varias veces y le muestra la distribuci贸n. En este ejemplo, test () se ejecutar谩 100 veces, y luego se dar谩 salida usando print ():

 def test(): # ... your code if __name__ == '__main__': import timeit print(timeit.timeit("test()", setup="from __main__ import test", number=100)) 

Si decide utilizar pytest como corredor de prueba, consulte el complemento pytest-benchmark. Proporciona un accesorio pytest llamado punto de referencia. Cualquier objeto llamado se puede pasar benchmark (), analiza el tiempo de la llamada en los resultados de pytest.

Puede instalar pytest-benchmark desde PyPl usando pip:

 $ pip install pytest-benchmark 

Luego puede agregar una prueba usando un dispositivo y pasando el objeto llamado a la ejecuci贸n:

 def test_my_function(benchmark): result = benchmark(test) 

Ejecutar pytest le dar谩 resultados de referencia:



Puede obtener m谩s informaci贸n en el sitio de documentaci贸n .

Prueba para identificar errores de seguridad

Otra prueba que debe ejecutar en su aplicaci贸n es buscar errores comunes y vulnerabilidades de seguridad.

Instalar bandit desde PyPl usando pip:

 $ pip install bandit 

Luego puede pasar el nombre de su m贸dulo de aplicaci贸n con el indicador -r y obtener informaci贸n breve:

 $ bandit -r my_sum [main] INFO profile include tests: None [main] INFO profile exclude tests: None [main] INFO cli include tests: None [main] INFO cli exclude tests: None [main] INFO running on Python 3.5.2 Run started:2018-10-08 00:35:02.669550 Test results: No issues identified. Code scanned: Total lines of code: 5 Total lines skipped (#nosec): 0 Run metrics: Total issues (by severity): Undefined: 0.0 Low: 0.0 Medium: 0.0 High: 0.0 Total issues (by confidence): Undefined: 0.0 Low: 0.0 Medium: 0.0 High: 0.0 Files skipped (0): 

Al igual que con flake8 , las bandit bandera de bandit se pueden configurar, y si desea ignorar algunas de ellas, puede agregar el siguiente fragmento al archivo setup.cfg con par谩metros:

 [bandit] exclude: /test tests: B101,B102,B301 

M谩s informaci贸n en el sitio web de GitHub .

Conclusi贸n

Python ha hecho las pruebas disponibles gracias a los comandos integrados y las bibliotecas necesarias para verificar el correcto funcionamiento de las aplicaciones. Es f谩cil comenzar a probar en Python: puede usar unittest y escribir m茅todos peque帽os y f谩ciles de mantener para probar el c贸digo.

A medida que aprenda m谩s sobre las pruebas y la expansi贸n de su aplicaci贸n, considere cambiar a uno de los marcos de prueba, como pytest, para comenzar a usar funciones m谩s avanzadas.

Gracias por leer 隆Ten un futuro inconfundible con Python!

Y para aquellos que han le铆do el art铆culo, tenemos una gran noticia m谩s. En este momento, puede obtener el curso Python Developer con un descuento de 10,000 rublos.

Primera parte
Segunda parte

Source: https://habr.com/ru/post/444204/


All Articles