Como escribir e usar doctest para escribir código de proba en docstrings en Python.

Negocios

Python inclúe un módulo doctest estándar que proba o contido dunha docstring, facilitando a escritura de exemplos de entrada e saída na docstring e facilitando a comprensión da documentación.

A seguinte información ofrécese aquí.

  • Un exemplo sinxelo de proba con doctest
    • Se non hai erro
    • Se hai un erro
  • Controle os resultados de saída mediante opcións e argumentos
    • -vOpción
    • verboseargumento (por exemplo, función, programa, programa)
  • Execute o módulo doctest desde a liña de comandos
  • Redacción de probas nun ficheiro de texto externo
    • Como escribir un ficheiro de texto
    • Chamado desde o ficheiro py
    • Executar directamente un ficheiro de texto

Un exemplo sinxelo de proba con doctest

Unha docstring é unha cadea encerrada nun dos seguintes: (1) o nome da función que se vai probar, (2) o nome da función que se vai probar e (3) o valor de saída esperado no modo interactivo de Python.

  • """
  • ''

Se non hai erro

Asegúrese de que o código é correcto na función e no contido da cadea de documentos.

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

    return a + b


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

Executar este ficheiro.

$ python3 doctest_example.py

Se non hai erros, non se sairá nada.

if __name__ == '__main__'Isto significa “executar o procesamento posterior só cando se executa o ficheiro de script correspondente desde a liña de comandos.

Se hai un erro

Se crea e executa o seguinte código incorrecto, aparecerá un erro.

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.

Móstrase do seguinte xeito.

Valores de saída esperados escritos en doctest.Expected
Valor de saída realGot

Controle os resultados de saída mediante opcións e argumentos

-vOpción

Se quere que se mostren os resultados de saída aínda que non haxa erros, execute o comando coa opción -v na liña 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 exemplo, función, programa, programa)

Se queres mostrar sempre os resultados de saída, especifique o argumento verbose=True en doctest.testmod() no ficheiro py.

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

Os resultados de saída sempre se mostrarán sen a opción -v no tempo de execució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.

Execute o módulo doctest desde a liña de comandos

if __name__ == '__main__'Se queres facer outra cousa nel, podes executar o módulo doctest directamente desde a liña de comandos sen chamar a doctest.testmod() no ficheiro py.

Por exemplo, nos seguintes 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)

Pode recibir argumentos da liña de comandos e executar o proceso como é habitual.

$ python3 doctest_example_without_import.py 3 4
7

Se executa doctest como un script coa opción -m, a proba executarase contra a función na que se escribe doctest. Se queres mostrar os resultados de saída, engade -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.

Redacción de probas nun ficheiro de texto externo

Tamén pode escribir o código de proba nun ficheiro de texto externo en lugar de na cadea de documentos.

Como escribir un ficheiro de texto

Escriba en formato de modo interactivo Python, como se describe en docstring. É necesario importar as funcións a utilizar.

Se queres poñer o ficheiro de texto no mesmo directorio que o ficheiro .py a probar, só tes que importalo como segue.

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

Chamado desde o ficheiro py

Chame a doctest.testfile() noutro ficheiro .py para probalo.

Especifique a ruta do ficheiro de texto onde se escribe o código de proba como argumento de doctest.testfile().

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

Executar este ficheiro 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.

Executar directamente un ficheiro de texto

Aínda que non teña o ficheiro py, pode ler o ficheiro de texto directamente desde a liña de comandos e executar as probas.

Executa o comando Python coa opción -m para executar doctest como un script. Podes especificar a ruta do ficheiro de texto como argumento da liña 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.