2016-04-18 20 views
0

testIdProperyで2番目のアサートを実行したいのですが、最初のアサーションが成功するかどうかは関係ありません。最初のアサートの前後にtry/exceptブロックを置かずにこれを行うにはどうすればよいですか?アサートに失敗した後、ユニットテストを続行するにはどうすればよいですか?

class BlockTests(unittest.TestCase): 
    def setUp(self): 
     self.city1 = City(1, "New York") 
     self.city2 = City(2, "Boston") 

    def tearDown(self): 
     self.city1 = None 

    def testIdProperty(self): 
     self.assertEqual(2, self.city1.id_city, "Assertion Error!") #This assert might fail 
     self.assertEqual(2, self.city2.id_city, "Assertion Error!") #Execute this anyway 

    def testIdGetter(self): 
     self.assertEqual(1, self.city1.get_id_city(), "Error!") 

現在、最初のアサートが失敗した場合、テストケースは直ちに失敗を報告し、2番目のアサートは決して実行されません。

+0

あなたがself.city1.id_city' '気にしませんが、そのテストケースでのみ' self.city2.id_city'、なぜあなたが行 'self.assertEqual(2を削除しない場合は 、 self.city1.id_city、 "アサーションエラー!") '? – falsetru

+0

ここに入力する前にいくつかの行を削除しています...今修正! – Sn0pY

+0

OPに、なぜ失敗したアサーションを渡したいのですか?もしそうなら、なぜあなたはアサーションが必要なのでしょうか? – TimeString

答えて

0

Cityidプロパティをテストしようとしているようです。あなたがこのテストを実行すると

def testIdProperty(self): 
    self.assertEqual(1, self.city1.id_city, "Fail if City1 does not have id 1") 
    self.assertEqual(2, self.city2.id_city, "Fail if City2 does not have id 2") 

今では渡す必要があります:あなたがやったことに似て - だから、あなたはsetUpで定義された2つのインスタンスが正しい値が設定されているテストすることができます。コードを破棄してこれら2つのアサートのいずれかが失敗した場合は、テストを実行して修正するときにそれを見たいと思うでしょう。

しかし、何らかの理由でこれらはあなたが戻って、後でテストを仕上げに来るまで、あなたはこのようにそのテストをスキップすることができ、一時的に失敗することをアサートしたくない場合は:

@unittest.skip("skip this test im not done writing it yet!") 
def testIdProperty(self): 
    self.assertEqual(1, self.city1.id_city, "Fail if City1 does not have id 1") 
    self.assertEqual(2, self.city2.id_city, "Fail if City2 does not have id 2") 

EDIT :エラーを抑止したい場合はOK、必要なすべての場所でtry/exceptを実行しないでください。それはあなたのテストクラス外の一般的な関数を記述すると良いでしょう:

def silent_assert(func, *args, **kwargs): 
    try: 
     func(*args, **kwargs) 
    except Exception as exc: 
     print exc.message 

そして、それは、コードを実行し、唯一それが失敗した場合は黙って、エラーを出力しますので、これはあなたのアサートを呼び出します:

def testIdProperty(self): 
    silent_assert(self.assertEqual, 1, self.city1.id_city, "City1 does not have id 1") 
    silent_assert(self.assertEqual, 2, self.city2.id_city, "City2 does not have id 2") 

ますそれに関するアサーションを呼び出すことができ、それぞれが受け入れる任意の数の引数を渡すことができます。このようなエラーを隠すことが良い考えであるかどうかは分かりませんが、私はそれをする必要はありませんでしたが、それは私だけです、誰もが組織的なスタイルを持っています!

+0

私はすべてのアサートをスキップしたくない、私は1つのアサートだけをスキップしたい(誰が失敗したのか) – Sn0pY

+0

アサートに失敗した場合のコメントはどうですか?例えば'#self.assert ...'あなたが知りません/何が起こったか見ることができるので、なぜそれを実行しない場合は? – fips

+0

私は次のようなことをする必要があります: 'try: self.assertEqual(2、self.city1.id_city、City1にID 1がないと失敗します!) を除く print(" Assert Fail ") self .assertEqual(2、self.city2.id_city、City2にid 2がないと失敗! ") – Sn0pY

0

はどうですか?

def testIdProperty(self): 
    with self.assertRaises(SomeError): 
     self.assertEqual(2, self.city1.id_city, "Assertion Error!") 
    self.assertEqual(2, self.city2.id_city, "Assertion Error!") 
+0

SomeErrorとはどういう意味ですか? – Sn0pY

+0

その行を上げると予想されるエラーに置き換えてください。 (これを 'Exception'で置き換えることもできますが、これは悪い習慣です。バグを隠すことができ、道に入り込むことができます)。 –

関連する問題