Cómo escribir y utilizar doctest para escribir código de prueba en docstrings en Python.

Negocio

Python viene con un módulo doctest estándar que comprueba el contenido de un docstring, facilitando la escritura de ejemplos de entrada y salida en el docstring y facilitando la comprensión de la documentación.

La siguiente información se proporciona aquí.

  • Un ejemplo sencillo de pruebas con doctest
    • Si no hay ningún error
    • Si hay un error
  • Controlar los resultados de la salida mediante opciones y argumentos
    • -vOpción
    • verboseargumento (por ejemplo, función, programa, programa)
  • Ejecute el módulo doctest desde la línea de comandos
  • Escribir pruebas en un archivo de texto externo
    • Cómo escribir un archivo de texto
    • Llamada desde el archivo py
    • Ejecutar directamente un archivo de texto

Un ejemplo sencillo de pruebas con doctest

Un docstring es una cadena encerrada en uno de los siguientes elementos: (1) el nombre de la función a probar, (2) el nombre de la función a probar, y (3) el valor de salida esperado en el modo interactivo de Python.

  • """
  • '''

Si no hay ningún error

Asegúrese de que el código es correcto en el contenido de la función y del docstring.

def add(a, b):
    '''
    >>> add(1, 2)
    3
    >>> add(5, 10)
    15
    '''

    return a + b


if __name__ == '__main__':
    import doctest
    doctest.testmod()

Ejecuta este archivo.

$ python3 doctest_example.py

Si no hay errores, no se emitirá nada.

if __name__ == '__main__'Esto significa «ejecutar el procesamiento posterior sólo cuando se ejecuta el archivo de script correspondiente desde la línea de comandos».

Si hay un error

Si crea y ejecuta el siguiente código erróneo, se producirá un error.

def add(a, b):
    '''
    >>> add(1, 2)
    3
    >>> add(5, 10)
    10
    '''

    return a * b


if __name__ == '__main__':
    import doctest
    doctest.testmod()
$ python3 doctest_example_error.py
**********************************************************************
File "doctest_example_error.py", line 3, in __main__.add
Failed example:
    add(1, 2)
Expected:
    3
Got:
    2
**********************************************************************
File "doctest_example_error.py", line 5, in __main__.add
Failed example:
    add(5, 10)
Expected:
    10
Got:
    50
**********************************************************************
1 items had failures:
   2 of   2 in __main__.add
***Test Failed*** 2 failures.

Se muestra de la siguiente manera.

Valores de salida esperados escritos en doctest.Expected
Valor de salida realGot

Controlar los resultados de la salida mediante opciones y argumentos

-vOpción

Si desea que se muestren los resultados de salida incluso cuando no hay errores, ejecute el comando con la opción -v en la línea de comandos.

$ python3 doctest_example.py -v
Trying:
    add(1, 2)
Expecting:
    3
ok
Trying:
    add(5, 10)
Expecting:
    15
ok
1 items had no tests:
    __main__
1 items passed all tests:
   2 tests in __main__.add
2 tests in 2 items.
2 passed and 0 failed.
Test passed.

verboseargumento (por ejemplo, función, programa, programa)

Si desea mostrar siempre los resultados de salida, especifique el argumento verbose=True en doctest.testmod() en el archivo py.

if __name__ == '__main__':
    import doctest
    doctest.testmod(verbose=True)

Los resultados de salida se mostrarán siempre sin la opción -v en tiempo de ejecución.

$ python3 doctest_example_verbose.py
Trying:
    add(1, 2)
Expecting:
    3
ok
Trying:
    add(5, 10)
Expecting:
    15
ok
1 items had no tests:
    __main__
1 items passed all tests:
   2 tests in __main__.add
2 tests in 2 items.
2 passed and 0 failed.
Test passed.

Ejecute el módulo doctest desde la línea de comandos

if __name__ == '__main__'Si quieres hacer algo más en él, puedes ejecutar el módulo doctest directamente desde la línea de comandos sin llamar a doctest.testmod() en el archivo py.

Por ejemplo, en los siguientes casos

def add(a, b):
    '''
    >>> add(1, 2)
    3
    >>> add(5, 10)
    15
    '''

    return a + b


if __name__ == '__main__':
    import sys
    result = add(int(sys.argv[1]), int(sys.argv[2]))
    print(result)

Puede recibir argumentos de la línea de comandos y ejecutar el proceso como de costumbre.

$ python3 doctest_example_without_import.py 3 4
7

Si ejecuta doctest como un script con la opción -m, la prueba se ejecutará contra la función en la que está escrito doctest. Si quiere mostrar los resultados de salida, añada -v como antes.

$ python3 -m doctest doctest_example_without_import.py

$ python3 -m doctest -v doctest_example_without_import.py
Trying:
    add(1, 2)
Expecting:
    3
ok
Trying:
    add(5, 10)
Expecting:
    15
ok
1 items had no tests:
    doctest_example_without_import
1 items passed all tests:
   2 tests in doctest_example_without_import.add
2 tests in 2 items.
2 passed and 0 failed.
Test passed.

Escribir pruebas en un archivo de texto externo

También puede escribir el código de prueba en un archivo de texto externo en lugar de en el docstring.

Cómo escribir un archivo de texto

Escribir en formato de modo interactivo de Python, como se describe en el docstring. Es necesario importar las funciones a utilizar.

Si quieres poner el archivo de texto en el mismo directorio que el archivo .py a probar, sólo tienes que importarlo de la siguiente manera.

>>> from doctest_example import add
>>> add(1, 2)
3
>>> add(5, 10)
15

Llamada desde el archivo py

Llama a doctest.testfile() en otro archivo .py para probarlo.

Especifica la ruta del archivo de texto donde se escribe el código de prueba como argumento de doctest.testfile().

import doctest
doctest.testfile('doctest_text.txt')

Ejecuta este archivo py.

$ python3 doctest_example_testfile.py -v
Trying:
    from doctest_example import add
Expecting nothing
ok
Trying:
    add(1, 2)
Expecting:
    3
ok
Trying:
    add(5, 10)
Expecting:
    15
ok
1 items passed all tests:
   3 tests in doctest_text.txt
3 tests in 1 items.
3 passed and 0 failed.
Test passed.

Ejecutar directamente un archivo de texto

Incluso si no tienes el archivo py, puedes leer el archivo de texto directamente desde la línea de comandos y ejecutar las pruebas.

Ejecute el comando Python con la opción -m para ejecutar doctest como un script. Puede especificar la ruta del archivo de texto como argumento de la línea de comandos.

$ python3 -m doctest -v doctest_text.txt
Trying:
    from doctest_example import add
Expecting nothing
ok
Trying:
    add(1, 2)
Expecting:
    3
ok
Trying:
    add(5, 10)
Expecting:
    15
ok
1 items passed all tests:
   3 tests in doctest_text.txt
3 tests in 1 items.
3 passed and 0 failed.
Test passed.
Copied title and URL