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.