当前位置: 首页 > 面试题库 >

如何测试或模拟“如果__name__ =='__main__'”内容

夏侯瑞
2023-03-14
问题内容

说我有一个包含以下内容的模块:

def main():
    pass

if __name__ == "__main__":
    main()

我想为下半部分编写一个单元测试(我想实现100%的覆盖率)。我发现执行导入/设置机制的内置的 runpy
模块__name__,但无法弄清楚如何模拟或检查 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()

问题答案:

我将选择另一种替代方法,将其if __name__ == '__main__'从覆盖率报告中排除,当然,只有在测试中已经具有main()函数的测试用例的情况下,您才能这样做。

至于为什么我选择排除而不是为整个脚本编写新的测试用例,是因为如果按照我说的那样,您已经为您的main()函数准备了一个测试用例,那么您为脚本添加了另一个测试用例(仅适用于100%的覆盖率)将只是重复项。

有关如何排除的信息,if __name__ == '__main__'您可以编写coverage配置文件并添加到部分报告中:

[report]

exclude_lines =
    if __name__ == .__main__.:

可以在此处找到有关coverage配置文件的更多信息。

希望这会有所帮助。



 类似资料:
  • 问题内容: 问题答案: 每当Python解释器读取源文件时,它就会做两件事: 它设置了一些特殊变量,例如,然后 它执行文件中找到的所有代码。 让我们看看它是如何工作的,以及它与你有关我们在Python脚本中经常看到的检查问题的关系。 代码样例 让我们使用稍微不同的代码示例来探索导入和脚本的工作方式。假设以下文件位于。 特殊变量 当Python交互程序读取源文件时,它首先定义了一些特殊变量。在这种情

  • 问题内容: 我想检查是否包含我的模块或直接运行我的模块。如何在node.js中执行此操作? 问题答案: 文档描述了另一种方法,这可能是首选方法: 直接从Node运行文件时,将require.main设置为其模块。 要利用此优势,请检查该模块是否为主要模块,如果是,请调用您的主要代码: 编辑:如果您在浏览器中使用此代码,由于未定义“要求”,您将得到“参考错误”。为防止这种情况,请使用:

  • 问题内容: 我有一个Java命令行程序。我想创建JUnit测试用例以进行模拟。因为当我的程序运行时,它将进入while循环并等待用户输入。如何在JUnit中模拟呢? 问题答案: 从技术上讲,可以进行切换,但是总的来说,不直接在代码中调用它,而是添加一层间接层,这样输入源就可以从应用程序的某个位置进行控制,这样会更健壮。确切地讲,这是实现的详细信息-依赖项注入的建议很好,但是你不一定需要引入第三方框

  • 问题内容: 我涉足clojure,尝试确定与该通用python习语等效的clojure(和/或Lisp)有点麻烦。 习惯用法是,在python模块的底部经常有一些测试代码,然后是运行该代码的语句,例如: 这对于简单的临时测试很有用。通常,通过编写可以使用此模块,在这种情况下,从不调用它,但是在代码段的最后,也可以通过直接从命令行键入内容来运行该模块。 Clojure(和/或普通Lisp)中是否有一

  • 问题内容: 我刚开始使用Node,现在正在编写一些单元测试。对于前几个函数,我可以正常运行,但是现在我碰到了一个包含其中的函数。我的函数的简化版本如下所示: 我尝试使用基本节点断言测试库进行测试: 由于执行此操作的时间(以及结果)总是不同的,因此它将始终失败。 在Python中,我可以设置模拟类和对象。有没有一种方法可以在Node中解决此问题而无需将moment.utc()作为函数的参数? 问题答

  • 我发现可以使用以下方法模拟和: 它工作得很好,但当我尝试运行集成测试时,授权服务器仍然需要启动并运行。否则,Quarkus无法连接到它。 我试图禁用OIDC扩展(),但是代码当然不能编译(endpoint不能识别依赖项)。 那么,在运行集成测试时,哪一种方法是跳过OIDC连接的最佳方法呢? 最好的,