私のモジュールからのエラーメッセージが有益であることを確認するために、私はassertRaises()によってキャッチされたすべてのエラーメッセージを見たいと思います。今日私は各assertRaises()のためにそれを行いますが、テストコードにはたくさんあるので非常に面倒です。Python2.7のunittestでassertRaises()がキャッチしたエラーメッセージを表示するには?
すべてのassertRaises()に対してエラーメッセージを出力するにはどうすればよいですか?私はhttp://docs.python.org/library/unittest.htmlのドキュメントをどのように解決するかを考えずに研究しました。どういうわけかassertRaises()メソッドをmonkeypatchできますか?私は、テストコードを標準的な方法で使用することが最も多いので、テストコード内のすべてのassertRaises()行を変更しないことをお勧めします。
私はこの質問はPython unittest: how do I test the argument in an Exceptions?
に関連している。これは私が今日それを行う方法であると思います。例えば:
#!/usr/bin/env python
def fail():
raise ValueError('Misspellled errrorr messageee')
とテストコード:
#!/usr/bin/env python
import unittest
import failure
class TestFailureModule(unittest.TestCase):
def testFail(self):
self.assertRaises(ValueError, failure.fail)
if __name__ == '__main__':
unittest.main()
エラーメッセージをチェックするために、私は単に例えば例外IOErrorに)(assertRaisesにエラーの種類を変更します。次に、エラーメッセージが表示されます。
E
======================================================================
ERROR: testFail (__main__.TestFailureModule)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test_failure.py", line 8, in testFail
self.assertRaises(IOError, failure.fail)
File "/usr/lib/python2.7/unittest/case.py", line 471, in assertRaises
callableObj(*args, **kwargs)
File "/home/jonas/Skrivbord/failure.py", line 4, in fail
raise ValueError('Misspellled errrorr messageee')
ValueError: Misspellled errrorr messageee
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)
ご意見はありますか? /ジョナス
編集:私はこの問題を解決するために管理ロバートRossneyからヒントを
。これは、主にスペルミスを目的としたものではなく、エラーメッセージがモジュールのユーザーにとって本当に意味のあるものであることを確認するためのものです。 unittestの通常の機能(これは私がほとんどの時間を使用する方法です)は、SHOW_ERROR_MESSAGES = Falseを設定することで実現します。
以下に示すように、単にassertRaises()メソッドをオーバーライドします。それは魅力のように機能します!
SHOW_ERROR_MESSAGES = True
class NonexistantError(Exception):
pass
class ExtendedTestCase(unittest.TestCase):
def assertRaises(self, excClass, callableObj, *args, **kwargs):
if SHOW_ERROR_MESSAGES:
excClass = NonexistantError
try:
unittest.TestCase.assertRaises(self, excClass, callableObj, *args, **kwargs)
except:
print '\n ' + repr(sys.exc_info()[1])
出力結果の割合:
testNotIntegerInput (__main__.TestCheckRegisteraddress) ...
TypeError('The registeraddress must be an integer. Given: 1.0',)
TypeError("The registeraddress must be an integer. Given: '1'",)
TypeError('The registeraddress must be an integer. Given: [1]',)
TypeError('The registeraddress must be an integer. Given: None',)
ok
testCorrectNumberOfBytes (__main__.TestCheckResponseNumberOfBytes) ... ok
testInconsistentLimits (__main__.TestCheckNumerical) ...
ValueError('The maxvalue must not be smaller than minvalue. Given: 45 and 47, respectively.',)
ValueError('The maxvalue must not be smaller than minvalue. Given: 45.0 and 47.0, respectively.',)
ok
testWrongValues (__main__.TestCheckRegisteraddress) ...
ValueError('The registeraddress is too small: -1, but minimum value is 0.',)
ValueError('The registeraddress is too large: 65536, but maximum value is 65535.',)
ok
testTooShortString (__main__.TestCheckResponseWriteData) ...
ValueError("The payload is too short: 2, but minimum value is 4. Given: '\\x00X'",)
ValueError("The payload is too short: 0, but minimum value is 4. Given: ''",)
ValueError("The writedata is too short: 1, but minimum value is 2. Given: 'X'",)
ValueError("The writedata is too short: 0, but minimum value is 2. Given: ''",)
ok
testKnownValues (__main__.TestCreateBitPattern) ... ok
testNotIntegerInput (__main__.TestCheckSlaveaddress) ...
TypeError('The slaveaddress must be an integer. Given: 1.0',)
TypeError("The slaveaddress must be an integer. Given: '1'",)
TypeError('The slaveaddress must be an integer. Given: [1]',)
TypeError('The slaveaddress must be an integer. Given: None',)
ok
なぜあなたは引数をチェックする必要がある場合assertRaisesを使い続けますか?単純に例外をキャッチし、 'try'と' except'を使ってそれを調べるのはなぜですか? –