簡體   English   中英

單元測試是否可以斷言某個方法調用了 sys.exit()?

[英]Is it possible for a unit test to assert that a method calls sys.exit()?

我有一個有時會調用的 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)

sys.exit 文檔

退出 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 單元測試文檔搜索“異常測試”中找到了您的問題的答案。 使用您的示例,單元測試如下所示:

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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM