6

テストを作成したり、コードをデバッグしたりするときに、その行が実行されない場合に通知する Python の行を追加できるようにしたいと考えています。これは可能ですか?

たとえば、次のようなコードを記述できるようになりたいと考えています。

def f(x):
   if x==0:
      check_covered()
      return 1
   elif x==1:
      check_covered()
      return 2
   else:
      check_covered()
   return 3

f(1)
f(2)
print_all_missing_cases()

そして、ブランチの 1 つがカバーされていないことを出力で教えてほしいと思います。

私が試したこと

アプローチ1

次のように、デコレータを使用して関数に対してこれを行うことができます。

missing_fns = set()

def covered(h):
    missing_fns.add(h.func_name)
    def h2(*args):
        missing_fns.remove(h.func_name)
        return h(*args)
    return h2 

@covered
def f(a):
    return a+1

@covered
def g(a):
    return a+2

f(0)
for x in missing_fns:
    print x,'is never called'

しかし、フックできる関数のコンパイル中にアクティブ化されるものを見つけるのに苦労しています。

アプローチ 2

各インスタンスにインクリメント値を渡す場合 (check_covered(0)、check_covered(1)、check_covered(2) など) も非常に簡単ですが、コードをコピーまたは削除すると面倒になります。

アプローチ 3

コード カバレッジ ツールを実行してこの情報を取得することは可能ですが、可能であれば、理解できる可能性のある単純な Python コードを使用して取得したいと考えています。

4

1 に答える 1

5

モジュールの使用を強くお勧めしcoverageます。

ここに最良の結果を得る方法に関する素晴らしいチュートリアルがあります

使い方は簡単です:

$ coverage run my_program.py arg1 arg2

で結果を見るよりもcoverage report

$ coverage report -m
Name                      Stmts   Miss  Cover   Missing
-------------------------------------------------------
my_program                   20      4    80%   33-35, 39
my_other_module              56      6    89%   17-23
-------------------------------------------------------
TOTAL                        76     10    87%
于 2015-08-29T19:13:28.913 に答える