<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Bitácora de Vuelo (Publicaciones sobre logassert)</title><link>http://blog.taniquetil.com.ar/</link><description></description><atom:link href="http://blog.taniquetil.com.ar/categories/logassert.xml" rel="self" type="application/rss+xml"></atom:link><language>es</language><copyright>Contents © 2023 &lt;a href="mailto:facundo@taniquetil.com.ar"&gt;Facundo Batista&lt;/a&gt; CC BY-NC-SA</copyright><lastBuildDate>Mon, 29 May 2023 18:51:50 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Liberé logassert 5</title><link>http://blog.taniquetil.com.ar/posts/0814/</link><dc:creator>Facundo Batista</dc:creator><description>&lt;p&gt;Estoy feliz de traerles una nueva versión de &lt;code class="docutils literal"&gt;logassert&lt;/code&gt;, un mecanismo simple para verificar en los tests de un programa en Python que los logs se realizaron correctamente.&lt;/p&gt;
&lt;p&gt;Porque todes sabemos que tenemos que chequear los logs de nuestros programas, ¿cierto? Con &lt;cite&gt;logassert&lt;/cite&gt; esto es muy fácil.&lt;/p&gt;
&lt;p&gt;Esta nueva versión trae la funcionalidad de poder usar &lt;code class="docutils literal"&gt;logassert&lt;/code&gt; como un &lt;em&gt;fixture&lt;/em&gt; de &lt;em&gt;pytest&lt;/em&gt;, con semánticas totalmente renovadas (para las estructuras de "unittest clásico", &lt;code class="docutils literal"&gt;logassert&lt;/code&gt; casi no cambió, por compatibilidad).&lt;/p&gt;
&lt;p&gt;Entonces, para pytest todo lo que se necesita es declarar &lt;code class="docutils literal"&gt;logs&lt;/code&gt; en los argumentos del test (funciona como cualquier otro fixture), y luego chequear (usando &lt;code class="docutils literal"&gt;assert&lt;/code&gt;, como es normal con &lt;em&gt;pytest&lt;/em&gt;) si una linea específica está en los logs para un nivel específico.&lt;/p&gt;
&lt;p&gt;Miren este ejemplo, con varias lineas logueadas, y un control específico:&lt;/p&gt;
&lt;pre class="literal-block"&gt;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&lt;/pre&gt;
&lt;p&gt;Vean como el mensaje de falla es muy útil:&lt;/p&gt;
&lt;pre class="literal-block"&gt;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'&lt;/pre&gt;
&lt;p&gt;Puede instalar &lt;code class="docutils literal"&gt;logassert&lt;/code&gt; &lt;a class="reference external" href="https://pypi.org/project/logassert/"&gt;desde PyPI&lt;/a&gt;. El proyecto está &lt;a class="reference external" href="https://github.com/facundobatista/logassert"&gt;en Github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;¿Les interesa más detalle de como funciona?&lt;/p&gt;
&lt;p&gt;Como les dije arriba, pueden incluir el fixture &lt;code class="docutils literal"&gt;logs&lt;/code&gt; y después directamente usar &lt;code class="docutils literal"&gt;assert&lt;/code&gt;. Ejemplo:&lt;/p&gt;
&lt;pre class="literal-block"&gt;def test_bleh(logs)
    (...)
    assert "The meaning of life is 42" in logs.debug&lt;/pre&gt;
&lt;p&gt;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):&lt;/p&gt;
&lt;pre class="literal-block"&gt;assert "The meaning of life is \d+" in logs.debug&lt;/pre&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;pre class="literal-block"&gt;assert "^The meaning of life is \d+$" in logs.debug&lt;/pre&gt;
&lt;p&gt;De forma similar, también pueden verificar que esté al principio o al final de la linea logueada.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTA&lt;/strong&gt;: el mensaje verificado es el final, luego de que el system de &lt;code class="docutils literal"&gt;logging&lt;/code&gt; reemplazó todos los parámetros indicados en la cadena indicada.&lt;/p&gt;
&lt;p&gt;Si quieren verificar que un texto fue logueado sin importar en qué nivel, sólo hagan:&lt;/p&gt;
&lt;pre class="literal-block"&gt;assert "The meaning of life is 42" in logs.any_level&lt;/pre&gt;
&lt;p&gt;Para verificar que un texto NO fue logueado, sólo usen la sintáxis de Python! Por ejemplo:&lt;/p&gt;
&lt;pre class="literal-block"&gt;assert "A problem happened" not in logs.error&lt;/pre&gt;
&lt;p&gt;Si no les gusta las expresiones regulares, importen &lt;code class="docutils literal"&gt;Exact&lt;/code&gt; de &lt;code class="docutils literal"&gt;logassert&lt;/code&gt; y envuelvan la cadena con eso. Por ejemplo, en este caso el &lt;code class="docutils literal"&gt;..&lt;/code&gt; significa "dos puntos", no hace nada a nivel expresión regular:&lt;/p&gt;
&lt;pre class="literal-block"&gt;assert Exact("The meaning of life is ..") in logs.any_level&lt;/pre&gt;
&lt;p&gt;Para pedir ayuda, si tienen alguna pregunta, o encuentran algún detalle, por favor &lt;a class="reference external" href="https://github.com/facundobatista/logassert/issues/new"&gt;abran un ticket&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;¡Gracias por vuestro tiempo!&lt;/p&gt;</description><category>logassert</category><category>logs</category><category>Python</category><category>software</category><category>tests</category><guid>http://blog.taniquetil.com.ar/posts/0814/</guid><pubDate>Sat, 08 Aug 2020 20:57:00 GMT</pubDate></item></channel></rss>