python code-coverage nosetests abc coverage.py

python - Excluyendo propiedades abstractas de los informes de cobertura.



code-coverage nosetests (3)

Tengo una clase base abstracta a lo largo de las líneas de:

class MyAbstractClass(object): __metaclass__ = ABCMeta @abstractproperty def myproperty(self): pass

Pero cuando ejecuto pruebas de detección (qué cobertura) en mi proyecto, se queja de que la línea de definición de propiedad no está probada. En realidad, no se puede probar (AFAIK), ya que la creación de instancias de la clase abstracta generará una excepción.

¿Hay alguna solución alternativa a esto, o simplemente tengo que aceptar una cobertura de prueba de <100%?

Por supuesto, podría eliminar el uso de ABCMeta y simplemente hacer que la clase base aumente NotImpementedError , pero prefiero el método anterior.


No hay forma de excluir las propiedades abstractas exactamente como las tiene, pero si realiza un ligero cambio, puede hacerlo. Haga que su propiedad abstracta genere un error:

@abstractproperty def myproperty(self): raise NotImplementedError

Luego, puede indicar a cover.py que ignore las líneas que generan el error NotImplementedError. Cree un archivo .coveragerc, y en él ponga:

[report] exclude_lines = # Have to re-enable the standard pragma pragma: no cover # Don''t complain if tests don''t hit defensive assertion code: raise NotImplementedError

Para obtener más ideas sobre los tipos de líneas que siempre querrá ignorar, consulte: http://nedbatchelder.com/code/coverage/config.html


Para mí, la mejor solución fue lo que @Wesley mencionó en su comentario a la respuesta aceptada, específicamente reemplazando "pass" con una cadena de documentación para la propiedad abstracta, por ejemplo:

class MyAbstractClass(object): __metaclass__ = ABCMeta @abstractproperty def myproperty(self): """ this property is too abstract to understand. """


Tengo lógica de omisión personalizada en mi .coveragerc :

[report] exclude_lines = pragma: no cover @abstract

De esta manera, todos los métodos abstractos y propiedades abstractas se marcan como omitidos.