Python: usando doctests para las clases

¿Es posible usar el concepto doctest de Python para las clases, no solo para las funciones?

Si es así, ¿dónde debo colocar los documentos de prueba, en la cadena de documentos de la clase o en la cadena de documentos 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 por adelantado,

Adán

Le falta el código para ejecutar las pruebas en la parte inferior del archivo:

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

En cuanto a dónde poner las pruebas:

  • Si está probando la clase como un todo, los pondría en la cadena de documentación de la clase.
  • Si está probando el constructor, los pondría en la cadena de documentación del constructor.
  • Si está probando un método (como parece ser en este caso), realmente lo pondría en la cadena de documentación de ese método.

En lugar de crear una instancia del objeto en cada método, puede usar el argumento extraglobs :

 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()}) 

El módulo doctest busca cualquier cadena de documentos 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 la cadena de documentos de la clase o en el constructor, creo que eso depende de lo que está documentando exactamente.

Si la cadena de documentos proporciona una descripción general de la clase y cómo usarla, entonces creo que es mejor ponerla en la clase.

Si la cadena de documentación trata específicamente sobre cómo crear instancias de la clase, debe ir en el método __init__ .

Recuerde que la intención de doctests es principalmente tener un código de ejemplo autovalidante en la documentación, por lo que, en mi humilde opinión, el aspecto de la documentación debería tener prioridad sobre el aspecto de la prueba.

Editar:

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

Necesitas agregar esto al final del archivo:

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

Alternativamente, si está utilizando Python 2.6 o posterior, ejecútelo con:

 python -m doctest -v test.py 

Creo que la documentación del módulo doctest no explica cómo manejar esto, y debería hacerlo mejor al explicar qué hacer.

Un patrón que descubrí para probar métodos de clase que no necesitan datos de instancia, pero que pueden necesitar acceso a datos de clase, es pasar el objeto Clase en lugar de una instancia.

 class Test: """ >>> Test.multiply_by_3(Test,2) 6 """ def __init__(self, number): self._number=number _THREE = 3 def multiply_by_3(self, x): return x*self._THREE if __name__ == "__main__": import doctest doctest.testmod()