新增于3.2。
unittest的-c/--catch命令行選項(xiàng)以及unittest.main()的catchbreak參數(shù)在測試運(yùn)行期間提供了更友好的control-C處理。啟用catch中斷行為后,control-C將允許當(dāng)前正在運(yùn)行的測試完成,然后測試運(yùn)行將結(jié)束并報(bào)告所有結(jié)果。第二個(gè)control-c將以通常的方式引發(fā)KeyboardInterrupt。
control-c處理信號處理程序試圖與安裝的signal.SIGINT處理程序的代碼或測試保持兼容。如果調(diào)用unittest處理程序但不是已安裝的signal.SIGINT處理程序,換句話說它已被被測系統(tǒng)替換并委托給它,則它調(diào)用默認(rèn)處理程序。這通常是代碼替換已安裝的處理程序并委托給它的預(yù)期行為。對于需要禁用unittest的control-c處理的單個(gè)測試,可以使用removeHandler()裝飾器。
框架作者有一些實(shí)用程序函數(shù)可以在測試框架中啟用control-c處理功能。
unittest.installHandler()
安裝control-c處理程序。當(dāng)收到signal.SIGINT時(shí)(通常是響應(yīng)用戶按下control-c),所有注冊的結(jié)果都會調(diào)用stop()。
unittest.registerResult(result)
為control-c處理注冊一個(gè)TestResult對象。注冊結(jié)果會存儲對它的弱作用,因此不會阻止結(jié)果被垃圾回收。
如果未啟用control-c處理,則注冊TestResult對象沒有副作用,因此測試框架可以無條件地注冊它們創(chuàng)建的所有結(jié)果,而與是否啟用處理無關(guān)。
unittest.removeResult(result)
刪除注冊結(jié)果。刪除結(jié)果后,將不再在該結(jié)果對象上調(diào)用stop()來響應(yīng)control-c。
unittest.removeHandler(function=None)
當(dāng)不帶參數(shù)調(diào)用時(shí),如果已安裝control-c處理程序,則此函數(shù)將刪除它。此函數(shù)還可以用作測試裝飾器,以便在執(zhí)行測試時(shí)刪除處理程序:
@unittest.removeHandler
def test_signal_handling(self):
...