unit - ¿Puede python doctest ignorar algunas líneas de salida?
unit test en python (6)
Me gustaría escribir un doctest como este:
"""
>>> print a.string()
foo : a
bar : b
date : <I don''t care about the date output>
baz : c
"""
¿Hay alguna manera de hacer esto? Creo que tendría más sentido cambiar a unittest, pero tengo curiosidad por saber si es posible especificar un rango de salida que no debería coincidir para la prueba en doctest.
¡Gracias!
Con doctest.ELLIPSIS
, puede usar ...
para indicar "hacer coincidir cualquier cadena aquí". Puede configurar las opciones doctest
con una directiva doctest, para que esté activa solo para un caso de prueba: un ejemplo en los documentos en línea es:
>>> print range(20) # doctest:+ELLIPSIS
[0, 1, ..., 18, 19]
Si desea que una opción doctest esté activa durante todo el proceso, puede pasarla como el argumento optionflags=
a cualquier función doctest que utilice, por ejemplo, doctest.testfile
. (Puede pasar varios indicadores de opción allí usando el operador |
para bit-o ellos).
Me resultó más fácil simplemente asignar los valores de retorno innecesarios a una variable:
>>> _ = do_something()
>>> check_something()
True
Puedes escribir tuplas antes y después de tu función (hack inspirado por la respuesta de Mark Horvath):
def foo():
"""
>>> ();foo();() # doctest: +ELLIPSIS
(...)
"""
print "Hello world"
return "Hello world"
Respondiendo a preguntas sobre "cómo podemos ignorar toda la línea": sí, el hecho de que "..." también parezca una continuación, hace que sea difícil ignorar toda la salida. Puede usar "#doctest: + SKIP" si solo quiere omitir el ejemplo por completo, pero eso no funcionará si confía en sus efectos secundarios. Si realmente necesitas hacer esto, supongo que podrías hacer un parche del módulo doctest, aunque no lo recomendaría particularmente:
>>> import doctest
>>> doctest.ELLIPSIS_MARKER = ''-etc-''
>>> print 12 # doctest: +ELLIPSIS
-etc-
(Esta prueba pasa.)
O puedes suprimir temporalmente stdout y / o stderr:
>>> # Suppress stdout
>>> import sys
>>> class DevNull:
... def noop(*args, **kwargs): pass
... close = write = flush = writelines = noop
>>> sys.stdout = DevNull()
>>> # Run a test and ignore output (but we need its side effects)
>>> print 12 # NOTE: stdout is suppressed!
>>> # Restore stdout
>>> sys.stdout = sys.__stdout__
(Esta prueba también pasa.)
Sin embargo, ignorar toda la línea es un poco complicado. Aquí:
"""
>>> do_your_thing() #doctest:+ELLIPSIS
...
"""
El punto triple se interpretará como continuación de línea y causará un error de sintaxis.
Si quieres ignorar toda la línea, necesitarás algo como:
"""
>>> sys.stdout.write(''skip from here ''); do_your_thing() #doctest:+ELLIPSIS
skip from here ...
"""
¿Puedo tener una elipsis al principio de la línea en un doctest de Python? explica cómo crear un verificador de salida personalizado que utiliza una cadena adicional como puntos suspensivos. Esto le permitiría escribir lo siguiente, mientras aún se usa ''...'' en otro lugar.
def foo():
"""
>>> foo() # doctest: +ELLIPSIS
[...] world
"""
print "hello world"