2010-04-25 26 views
33

¿Es posible utilizar el concepto doctest de Python para las clases, no solo para las funciones?Python: utilizando doctests para las clases

En caso afirmativo, ¿dónde debo colocar los doctests - en el docstring de la clase, o en el docstring del constructor?

Para aclarar, estoy buscando algo como:

class Test: 
    """ 
    >>> a=Test(5) 
    >>> a.multiply_by_2() 
    10 
    """ 
    def __init__(self, number): 
     self._number=number 

    def multiply_by_2(self): 
     return self._number*2 

Gracias de antemano,

Adam

+5

Como nota al margen, siempre heredan de 'object' más que nada para que estés usando * nuevo clases de estilo *. –

+9

Excepto en python 3, donde solo hay clases de estilo nuevo, y 'object' está implícito sin padres declarados. – Daenyth

Respuesta

23

Te estás perdiendo el código para de hecho correr la prueba unitaria en la parte inferior del archivo:

class Test: 
    <snip> 

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

en cuanto a dónde colocar los exámenes:

  • Si está probando la clase como un todo, los pondría en la clase 'docstring'.
  • Si está probando el constructor, los pondría en la carpeta docs del constructor.
  • Si está probando un método (como parece ser en este caso), realmente lo pondría en la carpeta de documentos de ese método.
+1

+1 ¡Gracias! Sin embargo, documentar un método parece un poco tedioso, porque me obliga a inicializar un objeto para cada doctest. –

+4

@ Adam: si necesita pruebas más sofisticadas, use el módulo unittest. doctest está destinado principalmente para probar la documentación, no para probar el código. –

5

El módulo doctest busca cualquier cadenas de documentación en un archivo y ejecuta cualquier código incrustado en él, así que sí, es posible usar doctest para las clases.

En cuanto a si es mejor poner los doctests en el docstring de la clase o el constructor, creo que eso depende de lo que esté documentando exactamente.

Si el docstring da una descripción general de la clase y cómo usarla, entonces creo que es mejor ponerlo en la clase.

Si la docstring es específicamente sobre cómo crear instancias de la clase, entonces debe ir en el método __init__.

Recuerde que la intención de doctests es principalmente tener auto-validación de código de ejemplo en la documentación, por lo que en mi humilde opinión el aspecto de la documentación debe tener prioridad sobre el aspecto de prueba.

Editar:

En el ejemplo anterior no hay ningún código para ejecutar el doctest - corriendo python test.py -v ejecutará el código Python principal, que simplemente define la clase.

es necesario agregar esto al final del archivo:

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

alternativa Si está utilizando Python 2.6 o posterior ejecutarlo con:

python -m doctest -v test.py 
+0

Gracias, pero ¿por qué no está funcionando mi ejemplo? Intenté 'python test.py -v', y no obtuve nada –

+1

@Adam Si lo que publicaste es el archivo' test.py' completo, no hiciste 'if __name__ ==" __main__ ": import doctest; doctest.testmod() '; si usaste eso, ninguna salida significa ningún error. :) – badp

+0

no si agregó -v –

47

En lugar de instanciar el objeto en cada método, se podría hacer algo como esto:

class Test: 
    def multiply_by_2(self): 
     """ 
     >>> t.multiply_by_2() 
     10 
     """ 
     return self._number*2 

if __name__ == "__main__": 
    import doctest 
    doctest.testmod(extraglobs={'t': Test()}) 
+3

No sabía acerca de la palabra clave extraglobs. ¡Gracias! Es enormemente útil. –

Cuestiones relacionadas