Liberé logassert 5

Estoy feliz de traerles una nueva versión de logassert, un mecanismo simple para verificar en los tests de un programa en Python que los logs se realizaron correctamente.

Porque todes sabemos que tenemos que chequear los logs de nuestros programas, ¿cierto? Con logassert esto es muy fácil.

Esta nueva versión trae la funcionalidad de poder usar logassert como un fixture de pytest, con semánticas totalmente renovadas (para las estructuras de “unittest clásico”, logassert casi no cambió, por compatibilidad).

Entonces, para pytest todo lo que se necesita es declarar logs en los argumentos del test (funciona como cualquier otro fixture), y luego chequear (usando assert, como es normal con pytest) si una linea específica está en los logs para un nivel específico.

Miren este ejemplo, con varias lineas logueadas, y un control específico:

    logger.info("Starting system")
    places = ['/tmp/', '~/temp']
    logger.debug("Checking for config XYZ in all these places %s", places)
    logger.warning("bad config XYZ")

    assert "bad config XYZ" in logs.debug

Vean como el mensaje de falla es muy útil:

assert for regex 'bad config XYZ' check in DEBUG, failed; logged lines:
       INFO      'Starting system'
       DEBUG     "Checking for config XYZ in all these places ['/tmp/', '~/temp']"
       WARNING   'bad config XYZ'

Puede instalar logassert desde PyPI. El proyecto está en Github.

¿Les interesa más detalle de como funciona?

Como les dije arriba, pueden incluir el fixture logs y después directamente usar assert. Ejemplo:

def test_bleh(logs)
    (...)
    assert "The meaning of life is 42" in logs.debug

En verdad, la linea que escriben es una expresión regular, entonces pueden hacer (en caso de que sepan exactamente cual es el significado de la vida):

    assert "The meaning of life is \d+" in logs.debug

La cadena indicada se busca dentro de las lineas logueadas, no tiene que ser exactamente la linea completa. Si quieren eso, indíquenlo como en cualquier expresión regular:

    assert "^The meaning of life is \d+$" in logs.debug

De forma similar, también pueden verificar que esté al principio o al final de la linea logueada.

NOTA: el mensaje verificado es el final, luego de que el system de logging reemplazó todos los parámetros indicados en la cadena indicada.

Si quieren verificar que un texto fue logueado sin importar en qué nivel, sólo hagan:

    assert "The meaning of life is 42" in logs.any_level

Para verificar que un texto NO fue logueado, sólo usen la sintáxis de Python! Por ejemplo:

    assert "A problem happened" not in logs.error

Si no les gusta las expresiones regulares, importen Exact de logassert y envuelvan la cadena con eso. Por ejemplo, en este caso el .. significa “dos puntos”, no hace nada a nivel expresión regular:

    assert Exact("The meaning of life is ..") in logs.any_level

Para pedir ayuda, si tienen alguna pregunta, o encuentran algún detalle, por favor abran un ticket.

¡Gracias por vuestro tiempo!

1 me gusta

Buenísimo!!

Voy a empezar a usarlo en el trabajo :slight_smile:

1 me gusta

¡Buen aporte! Oof, logassert me habría venido útil hace unos meses atrás, para los próximos tests será :smile:.

1 me gusta

Buenísimo el quickstart guide, @facundo!

Porque todes sabemos que tenemos que chequear los logs de nuestros programas, ¿cierto?

Tengo sentimientos encontrados con eso: a veces lo uso porq realmente quiero chequear que cierto mensaje se emite (pensando en mi yo futuro mirando kibana).

Otras veces encuentro (o escribo yo mismo) test cases donde se validan cosas que mucho mejor hubieran sido testeadas con mock o directamente no testeadas.

Si tenés ganas / tiempo podés compartir qué tipo de uso le das a este recurso?