Pruebas automatizadas de Pytest: algunos complementos que debes conocer

Pytest tiene una rica arquitectura de complementos, más de 800 complementos externos y una comunidad activa, y se identifica con "pytest-*" en el proyecto PyPI.

Este artículo enumerará algunos complementos con más de 200 estrellas de github para una demostración práctica.

Dirección de la biblioteca de complementos: http://plugincompat.herokuapp.com/


1. pytest-html: utilizado para generar informes HTML

Para una prueba completa, el informe de prueba es esencial, pero los resultados de la prueba de pytest en sí son demasiado simples y pytest-html puede proporcionarle un informe claro.

Instalar:
instalación de pip -U pytest-html
Ejemplo:

# test_sample.py
import pytest
# import time

# 被测功能
def add(x, y):
    # time.sleep(1)
    return x + y

# 测试类
class TestLearning:
    data = [
        [3, 4, 7],
        [-3, 4, 1],
        [3, -4, -1],
        [-3, -4, 7],
    ]
    @pytest.mark.parametrize("data", data)
    def test_add(self, data):
        assert add(data[0], data[1]) == data[2]

correr:

E:\workspace-py\Pytest>pytest test_sample.py --html=report/index.html
========================================================================== test session starts ==========================================================================
platform win32 -- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0
rootdir: E:\workspace-py\Pytest
plugins: allure-pytest-2.8.18, cov-2.10.1, html-3.0.0, rerunfailures-9.1.1, xdist-2.1.0
collected 4 items                                                                                                                                                        

test_sample.py ...F                                                                                                                                                [100%]

=============================================================================== FAILURES ================================================================================
_____________________________________________________________________ TestLearning.test_add[data3] ______________________________________________________________________

self = <test_sample.TestLearning object at 0x00000000036B6AC8>, data = [-3, -4, 7]

    @pytest.mark.parametrize("data", data)
    def test_add(self, data):
>       assert add(data[0], data[1]) == data[2]
E       assert -7 == 7
E        +  where -7 = add(-3, -4)

test_sample.py:20: AssertionError
------------------------------------------------- generated html file: file://E:\workspace-py\Pytest\report\index.html --------------------------------------------------
======================================================================== short test summary info ========================================================================
FAILED test_sample.py::TestLearning::test_add[data3] - assert -7 == 7
====================================================================== 1 failed, 3 passed in 0.14s ======================================================================

Después de ejecutarlo, se generarán un archivo html y una carpeta de estilo css. Abra el html con un navegador para ver resultados claros de la prueba.

 

Actualizaré un complemento de informe de prueba más claro y hermoso más adelante:  allure-python


2. pytest-cov: utilizado para generar informes de cobertura

Al realizar pruebas unitarias, la cobertura del código se utiliza a menudo como indicador para medir la calidad de las pruebas, e incluso se utiliza para evaluar la finalización de las tareas de prueba.

Instalar:
instalación de pip -U pytest-cov
 correr:

E:\workspace-py\Pytest>pytest --cov=.
========================================================================== test session starts ==========================================================================
platform win32 -- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0
rootdir: E:\workspace-py\Pytest
plugins: allure-pytest-2.8.18, cov-2.10.1, html-3.0.0, rerunfailures-9.1.1, xdist-2.1.0
collected 4 items                                                                                                                                                        

test_sample.py ....                                                                                                                                                [100%]

----------- coverage: platform win32, python 3.7.3-final-0 -----------
Name             Stmts   Miss  Cover
------------------------------------
conftest.py          5      3    40%
test_sample.py       7      0   100%
------------------------------------
TOTAL               12      3    75%


=========================================================================== 4 passed in 0.06s ===========================================================================


3. pytest-xdist: realiza ejecución multiproceso y multiplataforma

Acelere la ejecución enviando la prueba a varias CPU. Puede usar -n NUMCPUS para especificar una cantidad específica de CPU, o usar -n auto para identificar automáticamente la cantidad de CPU y usarlas todas.

Instalar:
instalación de pip -U pytest-xdist
Ejemplo:

# test_sample.py
import pytest
import time

# 被测功能
def add(x, y):
    time.sleep(3)
    return x + y

# 测试类
class TestAdd:
    def test_first(self):
        assert add(3, 4) == 7

    def test_second(self):
        assert add(-3, 4) == 1

    def test_three(self):
        assert add(3, -4) == -1

    def test_four(self):
        assert add(-3, -4) == 7

 correr:
E:\workspace-py\Pytest>pytest test_sample.py
========================================================================== test session starts ==========================================================================
platform win32 -- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0
rootdir: E:\workspace-py\Pytest
plugins: allure-pytest-2.8.18, cov-2.10.1, html-3.0.0, rerunfailures-9.1.1, xdist-2.1.0
collected 4 items                                                                                                                                                        

test_sample.py ....                                                                                                                                                [100%]

========================================================================== 4 passed in 12.05s ===========================================================================

E:\workspace-py\Pytest>pytest test_sample.py -n auto
========================================================================== test session starts ==========================================================================
platform win32 -- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0
rootdir: E:\workspace-py\Pytest
plugins: allure-pytest-2.8.18, assume-2.3.3, cov-2.10.1, forked-1.3.0, html-3.0.0, rerunfailures-9.1.1, xdist-2.1.0
gw0 [4] / gw1 [4] / gw2 [4] / gw3 [4]
....                                                                                                                                                               [100%]
=========================================================================== 4 passed in 5.35s ===========================================================================

E:\workspace-py\Pytest>pytest test_sample.py -n 2
========================================================================== test session starts ==========================================================================
platform win32 -- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0
rootdir: E:\workspace-py\Pytest
plugins: allure-pytest-2.8.18, assume-2.3.3, cov-2.10.1, forked-1.3.0, html-3.0.0, rerunfailures-9.1.1, xdist-2.1.0
gw0 [4] / gw1 [4]
....                                                                                                                                                               [100%]
=========================================================================== 4 passed in 7.65s ===========================================================================

 
 

Lo anterior se realiza sin concurrencia múltiple, habilitando 4 CPU y habilitando 2 CPU. A juzgar por los resultados que consumen mucho tiempo de ejecución, es obvio que la concurrencia múltiple puede reducir en gran medida el tiempo de ejecución de sus casos de prueba.


4. pytest-rerunfailures: implementa la repetición de casos de prueba fallidos

 Es posible que tengamos algunas fallas indirectas durante la prueba, como fluctuaciones de la red en la prueba de interfaz, retrasos en la actualización de complementos individuales en la prueba web, etc. Volver a ejecutar en este momento puede ayudarnos a eliminar estas fallas.

 Instalar:
instalación de pip -U pytest-rerunfailures
correr:
E:\workspace-py\Pytest>pytest test_sample.py --reruns 3
========================================================================== test session starts ==========================================================================
platform win32 -- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0
rootdir: E:\workspace-py\Pytest
plugins: allure-pytest-2.8.18, cov-2.10.1, html-3.0.0, rerunfailures-9.1.1, xdist-2.1.0
collected 4 items                                                                                                                                                        

test_sample.py ...R                                                                                                                                                [100%]R
 [100%]R [100%]F [100%]

=============================================================================== FAILURES ================================================================================
___________________________________________________________________________ TestAdd.test_four ___________________________________________________________________________

self = <test_sample.TestAdd object at 0x00000000045FBF98>

    def test_four(self):
>       assert add(-3, -4) == 7
E       assert -7 == 7
E        +  where -7 = add(-3, -4)

test_sample.py:22: AssertionError
======================================================================== short test summary info ========================================================================
FAILED test_sample.py::TestAdd::test_four - assert -7 == 7
================================================================= 1 failed, 3 passed, 3 rerun in 0.20s ==================================================================

 
 

Si desea configurar el intervalo de reintento , puede usar el parámetro --rerun-delay para especificar la duración del retraso (en segundos); 

Si desea volver a ejecutar un error específico , puede usar el parámetro --only-rerun para especificar una coincidencia de expresión regular, y puede usarlo varias veces para que coincida varias veces.

pytest --reruns 5 --reruns-delay 1 --solo-reejecutar AssertionError --solo-reejecutar ValueError

Si solo desea marcar una única prueba para su repetición automática cuando falla, puede agregar pytest.mark.flaky() y especificar el número de reintentos y el intervalo de retraso.

@pytest.mark.flaky(reruns=5, reruns_delay=2) 
def test_example(): 
    importar 
    afirmación aleatoria random.choice([Verdadero, Falso])


5. pytest-randomly: implementa una prueba de clasificación aleatoria

Grandes cantidades de aleatoriedad en sus pruebas hacen que sea más fácil encontrar fallas ocultas en las pruebas mismas y brindan más cobertura para su sistema.

Instalar:
instalación de pip -U pytest-aleatoriamente
correr:

E:\workspace-py\Pytest>pytest test_sample.py
========================================================================== test session starts ==========================================================================
platform win32 -- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0
Using --randomly-seed=3687888105
rootdir: E:\workspace-py\Pytest
plugins: allure-pytest-2.8.18, cov-2.10.1, html-3.0.0, randomly-3.5.0, rerunfailures-9.1.1, xdist-2.1.0
collected 4 items                                                                                                                                                        

test_sample.py F...                                                                                                                                                [100%]

=============================================================================== FAILURES ================================================================================
___________________________________________________________________________ TestAdd.test_four ___________________________________________________________________________

self = <test_sample.TestAdd object at 0x000000000567AD68>

    def test_four(self):
>       assert add(-3, -4) == 7
E       assert -7 == 7
E        +  where -7 = add(-3, -4)

test_sample.py:22: AssertionError
======================================================================== short test summary info ========================================================================
FAILED test_sample.py::TestAdd::test_four - assert -7 == 7
====================================================================== 1 failed, 3 passed in 0.13s ======================================================================

E:\workspace-py\Pytest>pytest test_sample.py
========================================================================== test session starts ==========================================================================
platform win32 -- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0
Using --randomly-seed=3064422675
rootdir: E:\workspace-py\Pytest
plugins: allure-pytest-2.8.18, assume-2.3.3, cov-2.10.1, forked-1.3.0, html-3.0.0, randomly-3.5.0, rerunfailures-9.1.1, xdist-2.1.0
collected 4 items                                                                                                                                                        

test_sample.py ...F                                                                                                                                                [100%]

=============================================================================== FAILURES ================================================================================
___________________________________________________________________________ TestAdd.test_four ___________________________________________________________________________

self = <test_sample.TestAdd object at 0x00000000145EA940>

    def test_four(self):
>       assert add(-3, -4) == 7
E       assert -7 == 7
E        +  where -7 = add(-3, -4)

test_sample.py:22: AssertionError
======================================================================== short test summary info ========================================================================
FAILED test_sample.py::TestAdd::test_four - assert -7 == 7
====================================================================== 1 failed, 3 passed in 0.12s ======================================================================

Esta función está habilitada de forma predeterminada, pero se puede deshabilitar mediante una bandera (si no necesita este módulo, se recomienda no instalarlo).

pytest -p no: aleatoriamente

Si desea especificar un orden aleatorio , puede especificarlo mediante el parámetro --randomly-send, o puede usar el último valor para especificar que se utiliza el último orden en ejecución.

pytest --randomly-seed=4321
pytest --randomly-seed=último


6. Otros complementos activos

También hay algunas otras funciones que son más activas, algunas que están especialmente personalizadas para marcos individuales y para ser compatibles con otros marcos de prueba. No las demostraré aquí por el momento. Simplemente las enumeraré:

pytest-django : para probar aplicaciones Django (marco web Python).

pytest-flask : para probar aplicaciones Flask (marco web Python).

pytest-splinter : Compatible con la herramienta de prueba automatizada web Splinter.

pytest-selenium : compatible con la herramienta de prueba de automatización web Selenium.

pytest-testinfra : prueba el estado real de los servidores configurados por herramientas de administración como Salt, Ansible, Puppet, Chef, etc.

pytest-mock : proporciona un firmware simulado para crear objetos virtuales para implementar dependencias individuales en las pruebas.

pytest-factoryboy : se utiliza junto con la herramienta factoryboy para generar una variedad de datos.

pytest-qt : proporciona pruebas de escritura para aplicaciones PyQt5 y PySide2.

pytest-asyncio : para probar código asincrónico usando pytest.

pytest-bdd : implementa un subconjunto del lenguaje Gherkin para permitir pruebas automatizadas de requisitos del proyecto y facilitar el desarrollo basado en el comportamiento.

pytest-watch : proporciona un conjunto de herramientas CLI rápidas para pytest.

pytest-testmon : puede seleccionar y volver a ejecutar automáticamente pruebas afectadas solo por cambios recientes.

pytest-assume : se utiliza para permitir múltiples fallas por prueba.

pytest-ordering : funcionalidad de pedido para casos de prueba.

pytest-sugar : muestra fallas y errores inmediatamente con una barra de progreso.

pytest-dev / pytest-repeat : Se pueden ejecutar pruebas únicas o múltiples repetidamente (un número especificable de veces).

Este puede ser el tutorial del marco de prueba automatizado de pytest más detallado para Bilibili, ¡con 100 horas completas de práctica real! ! !

Supongo que te gusta

Origin blog.csdn.net/ada4656/article/details/135116552
Recomendado
Clasificación