unittest unit test raises example assert_equal python unicode doctest

unit - ¿Cómo puede fallar un doctest de Python 2 y aún no tener diferencia en los valores en el mensaje de falla?



unit test en python (2)

Solo de forma gratuita y también porque esta posibilidad no se considera en la discusión de trabajo : tuve un problema débilmente similar. Ver

[...] Expected: <xarray.DataArray ()> array(0.0) Coordinates: d1 |S3 ''nat'' d2 |S3 ''dat'' d3 |S3 ''a'' Got: <xarray.DataArray ()> array(0.0) Coordinates: d1 |S3 ''nat'' d2 |S3 ''dat'' d3 |S3 ''a''

Por supuesto, ninguna diferencia humana visible . ¡La solución en mi caso trivial era asegurar que no hubiera espacios en blanco!

Estoy usando Python 2.7.9 en Windows.

Tengo un archivo de script python codificado en UTF-8 con los siguientes contenidos:

# coding=utf-8 def test_func(): u""" >>> test_func() u''☃'' """ return u''☃''

Me sale un curioso error cuando ejecuto el doctest:

Failed example: test_func() Expected: u''/u2603'' Got: u''/u2603''

Veo este mismo error de salida si lanzo los doctests a través del IDE que uso habitualmente (IDEA IntelliJ), o desde la línea de comandos:

> x:/my_virtualenv/Scripts/python.exe -m doctest -v hello.py

Copié las líneas en Expected y Me metí en WinMerge para descartar una diferencia sutil en los personajes que no pude detectar; me dijo que eran idénticos.

Sin embargo, si vuelvo a ejecutar la línea de comando, pero redirijo el resultado a un archivo de texto, así:

> x:/my_virtualenv/Scripts/python.exe -m doctest -v hello.py > out.txt

la prueba aún falla, pero la salida de falla resultante es un poco diferente:

Failed example: test_func() Expected: u''☃'' Got: u''/u2603''

Si pongo el literal Unicode escapado en mi doctest:

# coding=utf-8 def test_func(): u""" >>> test_func() u''☃'' """ return u''//u2603''

la prueba pasa Pero por lo que puedo decir, u''/u2603'' y u''☃'' deberías evaluar lo mismo.

Realmente tengo dos preguntas sobre el caso fallido:

  • ¿Es una de las representaciones que el doctester está dando (bajo Expected u Obtenido) incorrecto para el valor que el doctester tiene para ese caso? (es decir, x != eval(repr(x)) )
  • Si no, ¿por qué falla la prueba?

El módulo más doctest usa difflib para diferenciar entre el resultado y el resultado esperado. Como el siguiente:

>>> import difflib >>> variation = difflib.unified_diff(''x'', ''x'') >>> list(variation) [] >>> variation = difflib.unified_diff(''x'', ''y'') >>> list(variation) [''--- /n'', ''+++ /n'', ''@@ -1 +1 @@/n'', ''-x'', ''+y'']

Debajo del capó, el módulo más doctest formatea el resultado y el resultado esperado varias veces. Su problema parece ser un error de interpretación causado por las codificaciones de cadena. Lo que se imprime en la consola se ha formateado (utilizando %s ), eliminando así cualquier diferencia visible ; haciéndolos parecer idénticos.