45

次のような抽象基本クラスがあります。

class MyAbstractClass(object):
    __metaclass__ = ABCMeta

    @abstractproperty
    def myproperty(self): pass

しかし、プロジェクトでノーズテスト (カバレッジ) を実行すると、プロパティの定義行がテストされていないと不平を言います。抽象クラスのインスタンス化により例外が発生するため、実際にテストすることはできません(AFAIK)..

これに対する回避策はありますか、それとも 100% 未満のテスト カバレッジを受け入れる必要がありますか?

もちろん、ABCMeta使用法を削除して基本クラスを raiseNotImpementedErrorにすることもできますが、私は前者の方法を好みます。

4

3 に答える 3

39

抽象的なプロパティをそのまま正確に除外する方法はありませんが、わずかな変更を加えれば可能です。抽象プロパティでエラーを発生させます。

@abstractproperty
def myproperty(self): 
    raise NotImplementedError

次に、カバレッジ.py に NotImplementedError を発生させる行を無視するように指示できます。.coveragerc ファイルを作成し、その中に以下を入れます。

[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

常に無視したい行の種類について詳しくは、http: //nedbatchelder.com/code/coverage/config.htmlを参照してください。

于 2012-02-09T14:12:00.940 に答える
17

私の中にカスタムスキップロジックがあります.coveragerc

[report]
exclude_lines =
    pragma: no cover
    @abstract

このようにして、すべての抽象メソッドと抽象プロパティがスキップとしてマークされます。

于 2016-12-22T13:48:35.787 に答える