2016-05-26 13 views
9

問題:ここ複数の例外とコードカバレッジユニットテストパイソン

は、検査下にあるコードの人工的な例である:ここ

from datetime import datetime 

def f(s): 
    try: 
     date = s.split(":")[1] 
     return datetime.strptime(date, "%Y%m%d") 
    except (ValueError, IndexError) as e: 
     # some code here 
     raise 

私は現在持っている一連のテストです。

from datetime import datetime 
import unittest 

from test_module import f 

class MyTestCase(unittest.TestCase): 
    def test_valid_date(self): 
     self.assertEqual(f("1:20130101"), datetime(2013, 1, 1)) 

    def test_invalid_date(self): 
     self.assertRaises(ValueError, f, "1:invalid") 

--branchフラグでカバレッジを実行した場合、私はの100%の行を取得します。分岐カバレッジは: - スローされた例外が存在しない、と提起ValueError例外があるとき

$ coverage run --branch -m unittest test 
.. 
---------------------------------------------------------------------- 
Ran 2 tests in 0.003s 

OK 
$ coverage report 
Name   Stmts Miss Branch BrPart Cover 
-------------------------------------------- 
test_module.py  7  0  0  0 100% 
-------------------------------------------- 
TOTAL    7  0  0  0 100% 

はしかし、テストは現在、唯一の2例を調べることに注意してください。

質問:IndexErrorが発生したとき、私はケースをテストしていないことを報告するcoverageための方法が

ありますか?

+0

IndexErrorとは異なるブロックを使用できます。私は、カバレッジは実行された行を数えていると思います。 –

答えて

8

Coverage.pyは実行された実行パス(ステートメントまたはブランチ)のみを測定できます。どのような例外タイプが発生したかなど、どのような値が使用されたかを追跡する手段はありません。私はそれを見たよう

は、あなたのオプションは次のとおりです。

  1. 別々の例外条項。あなたが示したコードでは、2つの例外が別々の行で生成される可能性がありますが、おそらく実際のコードでは分離できません。

  2. 2つの例外を気にする必要はありません。このコードのテストでは、さまざまなエッジケースを実行するように設計されたさまざまな入力を検討する可能性があります。 Coverage.pyは、それらのすべてを区別したり、十分なケースを書いたことを確認したりするのに役立ちません。他の基準を使用して、十分なテストケースを作成したかどうかを判断してください。

+0

よろしくお願いいたします。 PyConでのあなたの話をお待ちしています! – alecxe

1

2つの例外を除いて、2つの別の例外を試すことができます。その場合、回線カバレッジは、1つの条件をテストしていないことを示します。

from datetime import datetime 

def f(s): 
    try: 
     date = s.split(":")[1] 
     return datetime.strptime(date, "%Y%m%d") 
    except ValueError as e: 
     # some code here 
     raise 
    except IndexError as e: 
     # some code 
     raise 

コードを繰り返したくない場合は、その機能を使用することができます。

+0

これは間違いなく選択肢ですが、カバレッジ(または他のパッケージ)がテスト中のコードを変更せずにテストされていない実行パスを判断するなら、私の好奇心にはまだ疑問があります。ありがとう! – alecxe

関連する問題