時々呼び出すPython 2.7メソッドがあります
sys.exit(1)
適切な条件が満たされたときにこのコード行が呼び出されることを確認する単体テストを作成することは可能ですか?
時々呼び出すPython 2.7メソッドがあります
sys.exit(1)
適切な条件が満たされたときにこのコード行が呼び出されることを確認する単体テストを作成することは可能ですか?
はい。sys.exit
が発生SystemExit
するので、次の方法で確認できますassertRaises
。
with self.assertRaises(SystemExit):
your_method()
のインスタンスにSystemExit
は、提案された終了ステータスに設定された属性code
があり、によって返されるコンテキスト マネージャーにassertRaises
は、キャッチされた例外インスタンスが として含まれexception
ているため、終了ステータスの確認は簡単です。
with self.assertRaises(SystemExit) as cm:
your_method()
self.assertEqual(cm.exception.code, 1)
Python を終了します。これは、例外を発生させることによって実装され
SystemExit
ます...外部レベルでの終了試行をインターセプトすることが可能です。
これが完全な動作例です。Pavel の優れた回答にもかかわらず、これを理解するのに時間がかかったので、参考になることを願ってここに含めます。
import unittest
from glf.logtype.grinder.mapping_reader import MapReader
INCOMPLETE_MAPPING_FILE="test/data/incomplete.http.mapping"
class TestMapReader(unittest.TestCase):
def test_get_tx_names_incomplete_mapping_file(self):
map_reader = MapReader()
with self.assertRaises(SystemExit) as cm:
tx_names = map_reader.get_tx_names(INCOMPLETE_MAPPING_FILE)
self.assertEqual(cm.exception.code, 1)
あなたの質問に対する答えは、Python Unit Testing のドキュメントで "Testing for Exceptions" を検索すると見つかりました。あなたの例を使用すると、単体テストは次のようになります。
self.assertRaises(SystemExit, your_function, argument 1, argument 2)
関数のテストに必要なすべての引数を忘れずに含めてください。
Pavel の優れた回答への追加のメモとして、テストしている関数で特定のステータスが提供されているかどうかを確認することもできます。たとえばyour_method()
、次のものが含まれている場合sys.exit("Error")
、具体的に「エラー」をテストできます。
with self.assertRaises(SystemExit) as cm:
your_method()
self.assertEqual(cm.exception, "Error")