Acabado de hematemesis, marco de prueba automatizado de Pytest: explicación detallada de la captura de información de advertencia (superfina)


prefacio

mensaje de advertencia de captura

A partir de la versión 3.1, pytest ahora detecta automáticamente las advertencias durante la ejecución de la prueba y las muestra al final de la sesión:

# content of test_show_warnings.py
import warnings

def api_v1():
    warnings.warn(UserWarning("api v1,should use functions from v2"))
    return 1

def test_one():
    assert api_v1() == 1

Ejecutar pytest ahora produce este resultado:

$ pytest test_show_warnings.py
=========================== test session starts ============================
platform linux -- Python 3.x.y,pytest-4.x.y,py-1.x.y,pluggy-0.x.y
cachedir: $PYTHON_PREFIX/.pytest_cache
rootdir: $REGENDOC_TMPDIR
collected 1 item

test_show_warnings.py .                                             [100%]

============================= warnings summary =============================
test_show_warnings.py::test_one
  $REGENDOC_TMPDIR/test_show_warnings.py:5: UserWarning: api v1,should use functions from v2
    warnings.warn(UserWarning("api v1,should use functions from v2"))

-- Docs: https://docs.pytest.org/en/latest/warnings.html
=================== 1 passed,1 warnings in 0.12 seconds ===================

El indicador -W se puede pasar para controlar qué advertencias se mostrarán e incluso convertirlas en errores:

$ pytest -q test_show_warnings.py -W error::UserWarning
F                                                                    [100%]
================================= FAILURES =================================
_________________________________ test_one _________________________________

 def test_one():
>       assert api_v1() == 1

test_show_warnings.py:10:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

 def api_v1():
>       warnings.warn(UserWarning("api v1,should use functions from v2"))
E       UserWarning: api v1,should use functions from v2

test_show_warnings.py:5: UserWarning
1 failed in 0.12 seconds

La misma opción se puede configurar en el archivo pytest.ini usando la opción filterwarningsini. Por ejemplo, la siguiente configuración ignorará todas las advertencias del usuario, pero convertirá todas las demás advertencias en errores.

[pytest]
filterwarnings =
 error
 ignore::UserWarning

Cuando una advertencia coincide con más de una opción de la lista, se realizará la acción de la última opción coincidente.

Tanto la opción de línea de comando -W como la opción filterwarningsINI están basadas en Python

@pytest.mark.filterwarnings

Nueva función en la versión 3.2.

Puede agregar filtros de advertencia a elementos de prueba específicos utilizando @pytest.mark.filterwarnings para tener más control sobre qué advertencias deben detectarse en el nivel de prueba, clase o incluso módulo:

import warnings

def api_v1():
    warnings.warn(UserWarning("api v1,should use functions from v2"))
    return 1

@pytest.mark.filterwarnings("ignore:api v1")
def test_one():
    assert api_v1() == 1

Los filtros aplicados mediante indicadores tienen prioridad sobre los filtros pasados ​​en la línea de comando o configurados por la opción filterwarningsini.

Puede aplicar todas las pruebas de un módulo a todas las pruebas de una clase utilizando la marca filterwarnings como decorador de clase o configurando la variable pytestmark:

# turns all warnings into errors for this module
pytestmark = pytest.mark.filterwarnings("error")

Deshabilitar resumen de advertencia

Aunque no se recomienda, puede suprimir por completo los resúmenes de advertencia de la salida de la ejecución de prueba mediante la opción de línea de comando --disable-warnings.

deshabilite completamente la captura de advertencia #
Este complemento está habilitado de manera predeterminada, pero puede deshabilitarse completamente en su archivo pytest.ini:

[pytest]
addopts = -p no: advertencias

O pasar en la línea de comando. Esto puede ser útil si el conjunto de pruebas maneja las advertencias mediante un sistema externo. -pno: advertencias

Advertencias de obsolescencia y advertencias de registro en espera

De manera predeterminada, pytest mostrará advertencias de DeprecationWarning y PendingDeprecationWarning del código de usuario y bibliotecas de terceros, como se sugiere en [PEP-0565. Esto ayuda a los usuarios a mantener su código moderno y evitar roturas mientras elimina de manera efectiva las advertencias obsoletas.

A veces, es útil ocultar ciertas advertencias de obsolescencia que ocurren en código que está fuera de su control (por ejemplo, bibliotecas de terceros), en cuyo caso puede usar opciones de filtro de advertencia (ini o banderas) para ignorar estas advertencias.

Por ejemplo:

[pytest]
filterwarnings =
 ignore:.*U.*mode is deprecated:DeprecationWarning

Esto ignorará todos los tipos de advertencias cuyo mensaje DeprecationWarning comience con una coincidencia con la expresión regular. ".*U.*modo está en desuso"

Nota:
Si configura advertencias a nivel de intérprete, usando la variable de entorno [PYTHONWARNINGS o la opción de línea de comando -W, pytest no configurará ningún filtro de forma predeterminada.

Además, pytest no sigue la recomendación PEP-0506 para restablecer todos los filtros de advertencia, ya que podría romper los conjuntos de pruebas que configuran los filtros de advertencia llamando a warnings.simplefilter (consulte el problema [#2430 para ver un ejemplo de eso).

Asegúrese de que su código active advertencias de obsolescencia

También puede llamar al ayudante global para verificar si una determinada llamada de función activa una advertencia de depreciación o una advertencia de depreciación pendiente:

También puede llamar al ayudante global para verificar si una determinada llamada de función activa una advertencia de depreciación o una advertencia de depreciación pendiente:

import pytest

def test_global():
    pytest.deprecated_call(myfunction,17)

De forma predeterminada, DeprecationWarning y PendingDeprecationWarning no se detectan al usar pytest.warns o recwarn porque el filtro de advertencia predeterminado de Python los oculta. Si desea registrarlos en su propio código, use el siguiente comando advertencias.simplefilter('siempre'):

import warnings
import pytest

def test_deprecation(recwarn):
    warnings.simplefilter("always")
    warnings.warn("deprecated",DeprecationWarning)
    assert len(recwarn) == 1
    assert recwarn.pop(DeprecationWarning)

También puede usarlo como administrador de contexto:

def test_global():
    with pytest.deprecated_call():
        myobject.deprecated_method()

Afirmar una advertencia con la función de advertencia

Puede verificar si su código genera una advertencia específica con pytest.warns , que funciona como [ raises:

import warnings
import pytest

def test_warning():
    with pytest.warns(UserWarning):
        warnings.warn("my warning",UserWarning)

La prueba fallará si no se generan advertencias relevantes. match afirma que la excepción coincide con el texto o un argumento de palabra clave de expresión regular:

>>> with warns(UserWarning,match='must be 0 or None'):
...    warnings.warn("value must be 0 or None",UserWarning)

>>> with warns(UserWarning,match=r'must be \d+/pre>):
...    warnings.warn("value must be 42",UserWarning)

>>> with warns(UserWarning,match=r'must be \d+/pre>):
...    warnings.warn("this is not here",UserWarning)
Traceback (most recent call last):
  ...
Failed: DID NOT WARN. No warnings of type ...UserWarning... was emitted...

También puede llamar a la función pytest.warns o cadena de código:

pytest.warns(expected_warning,func,*args,**kwargs)
pytest.warns(expected_warning,"func(*args,**kwargs)")

La función también devuelve una lista de todas las advertencias generadas (como objetos warnings.WarningMessage), y puede consultar para obtener información adicional:

with pytest.warns(RuntimeWarning) as record:
    warnings.warn("another warning",RuntimeWarning)

# check that only one warning was raised
assert len(record) == 1
# check that the message matches
assert record[0].message.args[0] == "another warning"

mensaje de error personalizado

El registro de advertencias brinda la oportunidad de generar mensajes de falla de prueba personalizados cuando no se emiten advertencias o se cumplen otras condiciones.

def test():
    with pytest.warns(Warning) as record:
        f()
        if not record:
            pytest.fail("Expected a warning!")

Si no se emite la advertencia f al llamar a f, se evaluará como . A continuación, puede realizar llamadas con mensajes de error personalizados. notrecord Truepytest.fail

Advertencias internas de pytest

pytest puede generar sus propias advertencias en algunos casos, como el uso inapropiado o funciones obsoletas.

Por ejemplo, pytest advertirá si encuentra una clase que coincida con python_classes pero también defina un constructor __init__, ya que esto evita que se cree una instancia de la clase:

# content of test_pytest_warnings.py
class Test:
    def __init__(self):
        pass

    def test_foo(self):
        assert 1 == 1
El siguiente es el diagrama de sistema de arquitectura de conocimiento de aprendizaje de ingeniero de prueba de software más completo en 2023 que compilé

1. De la entrada al dominio de la programación en Python

Por favor agregue una descripción de la imagen

2. Proyecto de automatización de interfaz de combate real.

Por favor agregue una descripción de la imagen

3. Combate real del proyecto de automatización web

Por favor agregue una descripción de la imagen

4. Combate real del proyecto de automatización de aplicaciones

Por favor agregue una descripción de la imagen

5. Hoja de vida de los fabricantes de primer nivel

Por favor agregue una descripción de la imagen

6. Probar y desarrollar el sistema DevOps

Por favor agregue una descripción de la imagen

7. Herramientas de prueba automatizadas de uso común

Por favor agregue una descripción de la imagen

Ocho, prueba de rendimiento JMeter

Por favor agregue una descripción de la imagen

9. Resumen (pequeña sorpresa al final)

Aprovecha cada oportunidad, atrévete a correr riesgos, persigue tus sueños persistentemente, incluso si el camino por delante es accidentado, debes avanzar con valentía. Cree en tus propias habilidades, supérate a ti mismo y sigue esforzándote, comenzarás tu propia vida brillante.

No tengas miedo al fracaso, porque el fracaso es el preludio del éxito. Solo esforzándote constantemente puedes crear tu propia brillantez. Cree en tus propias capacidades, persevera y persigue tus sueños, encontrarás infinitas posibilidades y logros.

La vida es demasiado corta, no pierda un tiempo precioso en arrepentimientos y vacilaciones, persiga valientemente sus sueños y persista en la lucha. Solo trabajando duro puede crear su propia vida brillante y hacer que cada día esté lleno de significado y logros.

Supongo que te gusta

Origin blog.csdn.net/m0_70102063/article/details/131853901
Recomendado
Clasificación