假设我有一个包含以下内容的模块:
def main():
pass
if __name__ == "__main__":
main()
我想为下半部分编写一个单元测试(我想实现100%的覆盖率)。我发现了执行import/__name__
设置机制的runpy内置模块,但是我不知道如何模拟或检查是否调用了main()函数。
这就是我目前所做的尝试:
import runpy
import mock
@mock.patch('foobar.main')
def test_main(self, main):
runpy.run_module('foobar', run_name='__main__')
main.assert_called_once_with()
您可以使用
imp
模块而不是import
语句来执行此操作。import
语句的问题是,'__main__'
的测试作为import语句的一部分运行,然后才有机会分配给runpy.__name__
。例如,您可以像这样使用
imp.load_source()
:第一个参数分配给导入模块的
__name__
。我将选择另一种替代方法,即从覆盖率报告中排除
if __name__ == '__main__'
,当然,只有在测试中已经有main()函数的测试用例时,才能这样做。至于为什么我选择排除而不是为整个脚本编写一个新的测试用例,是因为如果如我所述,您已经有了一个用于
main()
函数的测试用例,那么您为脚本添加另一个测试用例(仅用于具有100%覆盖率)将只是一个重复的测试用例。对于如何排除
if __name__ == '__main__'
,可以编写覆盖率配置文件并在节报告中添加:有关覆盖率配置文件的详细信息可以找到here。
希望这能有所帮助。
喔,我来晚了点,但我最近碰到了这个问题,我想我想出了更好的解决办法,所以。。。
我正在开发一个模块,其中包含了十几个脚本,所有脚本都以这个完全相同的副本结尾:
不可怕,当然,但也不可测试。我的解决方案是在我的一个模块中编写一个新函数:
然后将这个gem放在每个脚本文件的末尾:
从技术上讲,无论脚本是作为模块导入还是作为脚本运行,此函数都将无条件运行。但这是可以的,因为除非脚本作为脚本运行,否则函数实际上不会执行任何操作。所以代码覆盖率看到函数运行并说“是的,100%的代码覆盖率!”同时,我写了三个测试来覆盖函数本身:
责怪!现在您可以编写一个可测试的
main()
,将其作为脚本调用,具有100%的测试覆盖率,并且不需要忽略覆盖率报告中的任何代码。相关问题 更多 >
编程相关推荐