阅读(339) (1)

unittest 信号处理

2022-08-01 11:20:56 更新

3.2 版中的新功能。

unittest 的 -c/--catch 命令行选项以及 unittest.main() 的 catchbreak 参数在测试运行期间提供了对 control-C 的更友好的处理。启用 catch break 行为后,control-C 将允许当前正在运行的测试完成,然后测试运行将结束并报告到目前为止的所有结果。第二个 control-c 将以通常的方式引发 KeyboardInterrupt。

control-c 处理信号处理程序尝试与安装自己的 signal.SIGINT 处理程序的代码或测试保持兼容。如果 unittest 处理程序被调用但不是已安装的 signal.SIGINT 处理程序,即它已被被测系统替换并委托给它,则它调用默认处理程序。这通常是替换已安装处理程序并委托给它的代码的预期行为。对于需要禁用 unittest control-c 处理的单个测试,可以使用 removeHandler() 装饰器。

框架作者有一些实用功能可以在测试框架中启用 control-c 处理功能。

unittest.installHandler()

安装 control-c 处理程序。当收到 signal.SIGINT 时(通常是响应用户按下 control-c),所有注册的结果都会调用 stop()。

unittest.registerResult(result)

注册一个 TestResult 对象以进行 control-c 处理。注册结果会存储对它的弱引用,因此它不会阻止结果被垃圾收集。

如果未启用 control-c 处理,则注册 TestResult 对象没有副作用,因此测试框架可以无条件地注册它们创建的所有结果,而与是否启用处理无关。

unittest.removeResult(result)

删除已注册的结果。一旦结果被删除,将不再在该结果对象上调用 stop() 以响应 control-c。

unittest.removeHandler(function=None)

当不带参数调用此函数时,如果已安装 control-c 处理程序,则该函数将删除它。此函数也可以用作测试装饰器,以在执行测试时临时删除处理程序:

@unittest.removeHandler
def test_signal_handling(self):
    ...