Red de conocimiento informático - Problemas con los teléfonos móviles - Python-pytest

Python-pytest

Contenido

pytest es el marco de pruebas unitarias de Python. Es similar al marco unittest integrado, pero el marco pytest es más simple y más eficiente de usar.

características de pytest

Instalación

Pruebas

Preparativos antes de probar

Mi script de demostración En dicho directorio:

Error: el nombre del script pytest que crea no puede contener ., por ejemplo, 1. Comience fácilmente.py, esto provocará un error. Por supuesto, puedes escribir 1-comenzar fácilmente.py

demo1.py:

En el ejemplo anterior, cuando estamos ejecutando (al igual que el intérprete de Python ejecuta un Python normal script) Al probar el caso, el parámetro pasado en pytest.main(["-s", "demo1.py"]) debe ser una tupla o una lista (mi pytest es la versión 5.2.2). Llame a pytest.main ("-s demo1.py") y los parámetros pasados ​​están en forma de str. En cuanto a cuál usar, depende de si se informa un error:

Si Si encontramos el error anterior, significa que el parámetro necesita una forma de lista o tupla, y usamos la forma str.

El resultado de ejecución correcto del código anterior es el siguiente:

La información general es para decirnos:

pytest.main(["-s" , "demo1 .py"]) Descripción del parámetro

Además del método de escritura de funciones mencionado anteriormente, también puede escribir la clase de caso de uso:

El uso es similar a unittest El nombre de la clase debe comenzar con Prueba y el método del caso de uso también debe comenzar con prueba, y luego la ejecución es la misma.

Resultados de la ejecución:

Bueno, puedes preguntar en este momento, recuerdo que hay métodos de configuración y desmontaje en unittest, ¿no es así en pytest? ¿Por qué no lo mencionas? Espera, la respuesta es sí.

A continuación, estudiemos el uso de configuración y desmontaje en pytest.

Sabemos que en unittest, la configuración y el desmontaje se pueden ejecutar antes y después de cada caso de uso, o antes y después de que se ejecuten todos los conjuntos de casos de uso. Entonces, en pytest, existen las siguientes situaciones:

Echemos un vistazo a sus respectivos usos uno por uno.

Nivel de módulo setup_module/teardown_module

Resultado de la ejecución:

Nivel de clase setup_class/teardown_class

Resultado de la ejecución:

Setup_method/teardown_method a nivel de método en la clase

Resultado de la ejecución:

setup_function/teardown_function a nivel de función

Resultado de la ejecución:

Resumen

Hay muchas formas de ejecutar este script. Si está en el entorno PyCharm, puede hacer clic derecho o hacer clic en el botón Ejecutar para ejecutarlo, es decir, ejecutarlo en la función principal. pytest:

También puede ejecutar desde la línea de comando:

Este método no es diferente de usar el intérprete de Python para ejecutar un script de Python. También puedes ejecutarlo de la siguiente manera:

Por supuesto, hay otra forma de ejecutarlo usando un archivo de configuración. Veamos cómo usarlo.

En el directorio raíz del proyecto, podemos crear un archivo pytest.ini. En este archivo, podemos implementar configuraciones relevantes:

Luego, los elementos de este archivo de configuración ¿Qué hacen? ¿Todos quieren decir?

Primero, el archivo pytest.ini debe estar ubicado en el directorio raíz del proyecto y también debe llamarse pytest.ini.

Otros parámetros:

OK, aquí tienes un ejemplo.

En primer lugar, (el directorio detallado se refiere a la estructura de directorios al principio) en scripts/test_case_01.py:

En scripts/test_case_dir1/test_case02.py:

Luego, en diferentes directorios o archivos, hay 5 casos de uso que se ejecutarán y los resultados son dos fracasos y tres éxitos. Realicemos la verificación. Como tenemos el archivo de configuración, podemos ingresar pytest directamente en la terminal (siempre que esté en el directorio raíz del proyecto).

Se puede encontrar en los resultados de ejecución que 2 fallaron y 3 aprobaron lo cual es consistente con nuestras expectativas.

Las configuraciones posteriores relacionadas con la ejecución provienen del archivo de configuración. Si se modifican, habrá instrucciones correspondientes. El terminal se ejecuta directamente usando pytest.

Sabemos que en unittest, skip se puede usar para omitir casos de prueba, por lo que lo mismo se aplica a pytest.

Veamos cómo usarlo:

Omita el caso de uso, usamos @pytest.mark.skipif(condición, motivo):

Luego decórelo donde sea necesario Por encima de la función del caso de uso omitido.

El efecto es el siguiente:

El resultado de la ejecución del ejemplo anterior es relativamente detallado, porque agregamos -v a addopts en el archivo de configuración en los resultados del ejemplo anterior. no fue agregado!

Además, en este momento, la información del motivo no se puede imprimir en la consola de salida. Si es necesario imprimirlo, el -s del parámetro addopts en el archivo de configuración se puede cambiar a -rs. :

Si sabemos de antemano que la función de prueba fallará, pero no queremos omitirla directamente, queremos mostrar un mensaje.

Pytest usa pytest.mark.xfail para implementar la función de predicción de errores:

Los parámetros requeridos que deben dominarse son:

Entonces, hay varios tipos de fallas esperadas Es necesario comprender la situación:

Los resultados son los siguientes:

pytest usa x para indicar falla prevista (XFAIL).

Si se espera una falla pero la prueba real pasa exitosamente, pytest se marca con una X (XPASS).

En las dos situaciones de falla esperada, no queremos tener una falla esperada, pero la ejecución es exitosa, porque es diferente de lo que pensamos que esperaba que este caso de uso fallara, entonces Esto. El caso de uso no debería ejecutarse. Aunque lo ejecutó correctamente, es diferente de lo que pensaba. ¡Aun así falló!

Por lo tanto, necesitamos marcar los casos de uso que se espera que fallen pero que se ejecutan exitosamente como fallas de ejecución. Puede agregar lo siguiente al archivo pytest.ini:

Esto. ponga lo anterior La situación está marcada como ejecución fallida.

Como potente marco de pruebas unitarias, pytest también admite el concepto de pruebas basadas en datos DDT. Es decir, cuando se prueba una función de prueba, generalmente se pasan varios conjuntos de parámetros a la función. Por ejemplo, al probar el inicio de sesión de una cuenta, debemos simular todo tipo de contraseñas de cuenta extrañas.

Por supuesto, podemos escribir estos parámetros dentro de la función de prueba y recorrerlos.

Sin embargo, aunque hay muchos parámetros, sigue siendo una prueba. Cuando un determinado conjunto de parámetros hace que la afirmación falle, la prueba finaliza.

Al detectar excepciones, podemos garantizar que todos los parámetros del programa se ejecuten por completo, pero se requiere mucho trabajo adicional para analizar los resultados de la prueba.

En pytest, tenemos una mejor solución, que son las pruebas parametrizadas, es decir, cada conjunto de parámetros ejecuta una prueba de forma independiente. La herramienta utilizada es pytest.mark.parametrize (argnames, argvalues).

Utilizarlo es utilizarlo en forma de decorador.

Un caso de prueba con un solo parámetro

Echemos un vistazo a los resultados (la parte importante):

Puedes ver que cada número de teléfono móvil en el La lista es un caso de prueba.

Casos de prueba con múltiples parámetros

(Parte importante) Resultados:

Se puede ver que cada número de teléfono móvil y cada código de verificación se ejecutan juntos, por lo que fue ejecutado 4 veces. Entonces, si hay muchas combinaciones, la cantidad de casos de uso será aún mayor. Esperamos que el número de teléfono móvil y el código de verificación se combinen en una correspondencia uno a uno, es decir, solo se ejecute dos veces.

En el caso de varios parámetros, los nombres de varios parámetros son cadenas separadas por ,. Los valores de los parámetros se componen de listas anidadas.

El firmware (accesorio) son algunas funciones que pytest cargará y ejecutará antes (o después) de ejecutar la función de prueba, también llamado dispositivo de prueba.

Podemos utilizar el firmware para hacer cualquier cosa, siendo la más común la conexión inicial y el apagado final de la base de datos.

Pytest usa pytest.fixture() para definir el firmware. El siguiente es el firmware más simple. Debe iniciar sesión antes de acceder a la página de inicio:

Resultado:

. En el ejemplo anterior, puede pensar que esta función es similar a la configuración y desmontaje anteriores. Sin embargo, la fijación es más flexible que la configuración y desmontaje. pytest utiliza el parámetro de alcance para controlar el alcance de uso del firmware, es decir, el alcance.

Por ejemplo, para el firmware de inicio de sesión anterior, puede especificar su alcance:

Muchas veces es necesario realizar un procesamiento previo antes de realizar la prueba (como crear una nueva conexión de base de datos), y limpiar después de completar la prueba (cierre la conexión de la base de datos).

Cuando hay una gran cantidad de repeticiones de estas operaciones, la mejor práctica es utilizar firmware para automatizar todo el procesamiento previo y posterior.

Pytest usa la palabra clave de rendimiento para dividir el firmware en dos partes. El código antes de rendimiento se procesa previamente y se ejecutará antes de la prueba; el código después de rendimiento se procesa posteriormente y se ejecutará después de la prueba. se completa la prueba.

La siguiente prueba simula una consulta de base de datos y utiliza firmware para simular el cierre de la conexión de base de datos:

Resultados:

Puedes ver que hay errores antes y después de la ejecución de los dos casos de prueba. Preprocesamiento y posprocesamiento.

Hay muchos complementos que podemos usar en pytest. Presentemos algunos de los más utilizados.

Veamos primero uno importante: generar informes de casos de prueba.

Si desea generar un informe de prueba, primero debe descargarlo antes de poder utilizarlo.

Descargar

Si la descarga falla, puede usar PyCharm para descargar. No es necesario explicar cómo usar PyCharm para descargar.

Uso

En el archivo de configuración, agregue parámetros:

¡El efecto es muy bueno!

Aún no ha terminado, mira mi gran paso

El marco Allure es una herramienta de informes de pruebas en varios idiomas, flexible y liviana. No solo muestra resultados de pruebas concisos en un formato web. , pero también permite que todos los involucrados en el proceso de desarrollo extraigan la máxima información útil de las pruebas realizadas diariamente.

Desde la perspectiva de los desarrolladores (dev, desarrollador) y del personal de control de calidad (QA, Quality Assurance), el informe Allure simplifica las estadísticas de defectos comunes: las pruebas fallidas se pueden dividir en errores e interrupciones. También puede configurar registros, pasos, accesorios, archivos adjuntos, tiempos, historial de ejecución e integrar con sistemas de gestión de errores y TMS. Por lo tanto, a través de la configuración anterior, todos los desarrolladores y evaluadores responsables pueden dominar la información de prueba tanto como sea posible.

Desde la perspectiva de un administrador, Allure proporciona un "panorama general" claro de qué características están cubiertas, dónde se agrupan los defectos, cómo se ve el cronograma de ejecución y muchas otras cosas útiles. La modularidad y extensibilidad de Allure garantiza que siempre podamos ajustar algo.

Sin más, veamos cómo utilizarlo.

Descargue allure en pytest de Python

Pero dado que el informe de prueba generado por este complemento allure-pytest no es de tipo html, aún necesitamos usar la herramienta allure para "procesar " él. Entonces, todavía necesitamos descargar esta atractiva herramienta.

descarga de la herramienta allure

Antes de que la herramienta allure esté disponible, depende del entorno Java. También debemos configurar el entorno Java primero.

Ten en cuenta que si tu ordenador ya dispone de un entorno Java, no es necesario reconfigurarlo.

Después de configurar el entorno Java, descarguemos la herramienta Allure. Le he proporcionado directamente el enlace de Baidu Cloud Disk aquí. También puede descargarlo usted mismo desde otros enlaces:

Descargar y descomprimir. it Después de instalar el paquete de herramientas Allure, también debe agregar el directorio bin en el paquete Allure a las variables de entorno del sistema.

Después de terminar, abre tu terminal para probar:

Si se devuelve el número de versión, la instalación es exitosa.

Uso

Generalmente, hay varios pasos para usar allure:

Veamos la configuración de pytest.ini:

Es - -alluredir./informe/parámetros de resultado.

Ingrese pytest en la terminal para ejecutar el caso de prueba normalmente:

Una vez completada la ejecución, se generará automáticamente un directorio de informes en el directorio raíz del proyecto. :

p>

A continuación, debe utilizar la herramienta Allure para generar un informe HTML.

En este momento estamos en la terminal (si es una plataforma Windows, es cmd), la ruta es el directorio raíz del proyecto y ejecutamos el siguiente comando.

PD: Cuando ingreso allure en la terminal de pycharm, me indica que 'allure' no es un comando interno o externo, un programa operable o un archivo por lotes. Pero no hay ningún problema con la terminal de Windows.

El significado del comando se basa en los datos en el directorio reportresult (estos datos se generan después de ejecutar pytest). Cree un nuevo directorio allure_html en el directorio del informe. Index.html en este directorio es la versión final del informe HTML. Si lo ejecuta repetidamente, use --clean para borrar el informe anterior.

El resultado es muy bonito:

allure open

De forma predeterminada, el informe allure requiere un servidor HTTP para abrirse. Generalmente, podemos hacerlo a través de pycharm. En otro caso, esto se hace mediante el comando de apertura que viene con allure.

Otros usos del atractivo

Por supuesto, ¡la historia aún no ha terminado! Cuando se utiliza allure para generar informes, también hay algunos parámetros que se pueden utilizar durante la etapa de redacción del caso de uso:

allure.title y allure.description

característica e historia

Como puede ver en la figura anterior, los diferentes casos de uso se dividen en diferentes funciones.

allure.severity

allure.severity se utiliza para identificar el nivel de casos de prueba o clases de prueba, que se dividen en cinco niveles: bloqueador, crítico, normal, menor y trivial. .

El nivel de gravedad predeterminado es normal, por lo que el caso de uso 5 anterior no necesita agregar un decorador.

allure.dynamic

Anteriormente, el orden de ejecución de los casos de uso era de arriba a abajo:

Al igual que el orden de ejecución del ejemplo anterior es 3 1 2 .

Ahora, veamos cómo podemos controlar manualmente el orden de ejecución de múltiples casos de uso, que también dependen de un complemento.

Descargar

Uso

La forma de controlar manualmente el orden de ejecución de los casos de uso es agregar un decorador a cada caso de uso:

Entonces, ahora el orden de ejecución es 2 1 3 y se ejecuta de acuerdo con el orden especificado por orden.

Si alguien intenta pasar un 0 o un número negativo, entonces su relación de clasificación debería ser así:

Reintentar en caso de error significa especificar que un caso de uso se puede volver a ejecutar si falla.

Descargar

Usar

Debes configurar en el archivo pytest.ini:

Agregar un nuevo campo addopts (otros originales permanecen sin cambios) --reruns=3 campo, de modo que si el caso de uso no se ejecuta, se ejecutará nuevamente y se intentará 3 veces.

Veamos el ejemplo:

Resultado:

También podemos ver los resultados del reintento del informe de caso de uso:

Demostrado arriba Esta es una situación en la que el caso de uso falla y luego se vuelve a ejecutar varias veces sin éxito.

A continuación, veamos otra situación, es decir, el caso de uso no se ejecuta y pasa dentro del número de reejecuciones, entonces las reejecuciones restantes no se ejecutarán.

El módulo aleatorio nos ayuda a demostrar que ocurre un error durante una determinada ejecución, y cuando se vuelve a ejecutar, se producirá un éxito. Mira los resultados:

Puedes ver. , el caso de uso 02 tuvo éxito una vez que se volvió a ejecutar y las dos ejecuciones restantes finalizaron.

La ejecución de casos de prueba uno por uno definitivamente será muy lenta. Veamos cómo ejecutar casos de prueba al mismo tiempo. Por supuesto, esto requiere los complementos correspondientes.

Descargar

Usar

Agregar en el archivo de configuración:

Este es -n=auto:

La configuración de concurrencia se puede escribir en el archivo de configuración y luego se pueden usar otros scripts de casos de uso de ejecución normal.

La otra es especificarlo en la terminal. Veamos primero el ejemplo:

Resultado:

pytest-sugar cambia la apariencia predeterminada de pytest, agrega una barra de progreso e inmediatamente. muestra prueba de falla. No requiere configuración, simplemente descargue el complemento, ejecute sus pruebas con pytest y disfrute de resultados más bonitos y útiles.

Descargar

Otros casos de uso se pueden ejecutar como de costumbre.

pytest-cov agrega soporte de cobertura a pytest para mostrar qué líneas de código se han probado y cuáles no. También incluirá la cobertura de prueba del proyecto.

Descargar

Usar

En el archivo de configuración:

Es decir, configurar --cov=./scripts, para que Se contará la cobertura de prueba de todos los scripts que cumplan con las reglas en todos los directorios de scripts.

Si se ejecuta, simplemente ejecútelo como de costumbre.

Resultado:

Más referencia de complementos: /p/50317866

A veces, después de configurar pytest-html y los complementos allure en pytest.ini, se informa un error después de la ejecución:

Si ocurre este error, verifique si los dos módulos pytest-html y allure-pytest existen en el intérprete que configuró. Si está utilizando pycharm ide, además de verificar la configuración del intérprete en la configuración, también debe asegurarse de que la configuración del editor para ejecutar el script sea coherente con la configuración en la configuración.