Search code examples
pythoncode-coveragenosetestsabccoverage.py

Excluding abstractproperties from coverage reports


I have an abstract base class along the lines of:

class MyAbstractClass(object):
    __metaclass__ = ABCMeta

    @abstractproperty
    def myproperty(self): pass

But when I run nosetests (which coverage) on my project, it complains that the property def line is untested. It can't actually be tested (AFAIK) as instantiation of the abstract class will result in an exception being raised..

Are there any workarounds to this, or do I just have to accept < 100% test coverage?

Of course, I could remove the ABCMeta usage and simply have the base class raise NotImpementedError, but I prefer the former method.


Solution

  • There's no way to exclude the abstract properties precisely as you have it, but if you make a slight change, you can. Have your abstract property raise an error:

    @abstractproperty
    def myproperty(self): 
        raise NotImplementedError
    

    Then you can instruct coverage.py to ignore lines that raise NotImplementedError. Create a .coveragerc file, and in it put:

    [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
    

    For more ideas about the kinds of lines you might want to always ignore, see: http://nedbatchelder.com/code/coverage/config.html