2010-09-06 10 views
7

Comencé a integrar doctests en mis módulos. (¡Hurra!) Estos tienden a ser archivos que comenzaron como scripts, y ahora hay algunas funciones con aplicaciones CLI en el __name__=='__main__', por lo que no quiero poner la ejecución de las pruebas allí. Intenté nosetests --with-doctest, pero obtuve muchas fallas que no quiero ver, porque durante el descubrimiento de prueba esto importa módulos que no contienen doctests pero sí requieren importar cosas que no tengo instaladas en este sistema, o deberían ejecutarse dentro de instalaciones especiales de pitón. ¿Hay alguna forma de que pueda ejecutar solo todos mis doctests?Ejecutar todos mis doctests para todos los módulos de Python en una carpeta sin ver los fallos debido a las malas importaciones

He considerado una tecla de acceso rápido en vim para ejecutar "import doctest; doctest.testfile (currentFilename)" para ejecutar mis doctests en el módulo actual, y otra secuencia de comandos que ejecuta todas las pruebas, ¿qué hacen otros usuarios de doctest? ¿O debería usar algo que no sea doctest?

Respuesta

3

Creo que nose es el camino. Usted debe ya sea excluir los módulos problemáticos explícitamente -e o coger las importaciones que faltan en su código con construcciones como esta:

try: 
    import simplejson as json 
except ImportError: 
    import json 

Actualización:

Otra opción es proporcionar reemplazos simulados para los módulos que faltan. Digamos que su código tiene algo como esto:

import myfunkymodule 

y que está tratando de ejecutar sus pruebas en un sistema en el que myfunkymodule falta. Puede crear un archivo mock_modules/myfunkymodule.py con implementaciones simuladas de las cosas que necesita de él (quizás usando MiniMock, que recomiendo encarecidamente si está usando doctest). A continuación, puede ejecutar nose así:

$ PYTHONPATH=path_to/mock_modules nosetests --with-doctest 
+1

Tengo problemas para usar -e para excluir incluso la búsqueda de los doctests, en ciertos módulos, que es cuando se encuentran los enunciados de importación. ¿Cómo se usa normalmente? La expresión regular para excluir las pruebas aparentemente no puede ser simplemente el nombre del módulo. – Thomas

+1

Es cierto, '-e' no ayudará en su caso. Aún así, 'nosetests' es el camino para el descubrimiento de pruebas en python AFAIK. Debería ir por el enfoque 'try/except ImportError', o bien proporcionar implementaciones simuladas para sus módulos faltantes en algún lugar de su' PYTHONPATH' (ver mi última edición). –

+0

Gracias, investigaré esto. Puede terminar pirateando un script que greps para el prompt interactivo '>>>' dentro de una docstring, y simplemente ejecuta 'doctest.testfile (file)' en esos módulos en su lugar. Pero para una solución de prueba más completa, lo que sugiere suena mejor. – Thomas

6

También puede crear unittests que ajuste deseadas módulos de prueba unitaria, es una característica navive de prueba unitaria: http://docs.python.org/2/library/doctest.html#unittest-api.

import unittest 
import doctest 
import my_module_with_doctests 

def load_tests(loader, tests, ignore): 
    tests.addTests(doctest.DocTestSuite(my_module_with_doctests)) 
    return tests 
+0

También puede pasar una cadena en lugar de un módulo, es decir. 'doctest.DocTestSuite (" my_module_with_doctests ")' –

Cuestiones relacionadas