112

時々呼び出すPython 2.7メソッドがあります

sys.exit(1)

適切な条件が満たされたときにこのコード行が呼び出されることを確認する単体テストを作成することは可能ですか?

4

4 に答える 4

185

はい。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)

 

sys.exit ドキュメント:

Python を終了します。これは、例外を発生させることによって実装されSystemExitます...外部レベルでの終了試行をインターセプトすることが可能です。

于 2013-03-28T00:30:49.900 に答える
15

これが完全な動作例です。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)
于 2013-03-28T01:10:54.750 に答える
8

あなたの質問に対する答えは、Python Unit Testing のドキュメントで "Testing for Exceptions" を検索すると見つかりました。あなたの例を使用すると、単体テストは次のようになります。

self.assertRaises(SystemExit, your_function, argument 1, argument 2)

関数のテストに必要なすべての引数を忘れずに含めてください。

于 2015-12-01T22:44:01.663 に答える
3

Pavel の優れた回答への追加のメモとして、テストしている関数で特定のステータスが提供されているかどうかを確認することもできます。たとえばyour_method()、次のものが含まれている場合sys.exit("Error")、具体的に「エラー」をテストできます。

with self.assertRaises(SystemExit) as cm:
    your_method()
    self.assertEqual(cm.exception, "Error")
于 2014-01-27T04:18:12.827 に答える