テストを作成したり、コードをデバッグしたりするときに、その行が実行されない場合に通知する 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 コードを使用して取得したいと考えています。