【问题标题】:how to test if __name__=="__main__" to increase coverage如何测试 __name__=="__main__" 是否增加覆盖率
【发布时间】:2021-01-06 08:41:55
【问题描述】:

我是 pytest 和测试的新手。我有一个像下面这样的简单程序说hi.py

def foo():
   print('hello world')

def bar():
   print('hello python')

if __name__ == "__main__":
   foo()
   bar()

我可以像这样运行上面的程序

python3 hi.py

我在test_hi.py 中有几个测试用例,如下所示

import pytest

def test_foo()
   pass

def test_bar()
   pass

为了增加代码覆盖率,我还想以python3 hi.py 即如果__name__==__main__: 方式对其进行测试。我不知道如何使用来自test_hi.py 的测试用例来做到这一点。请帮忙。谢谢。

我正在使用 pytest 测试模块

python -m pytest --cov=hi.py

【问题讨论】:

  • if __name__ == "__main__": 块中的行无法通过导入访问,这就是重点。要运行它们,您必须实际运行整个程序,而不仅仅是测试。如果其中有你想要测试的逻辑,然后将其提取到一个你可以导入和练习的函数中,但在这种情况下它是微不足道的。
  • 对于使用 Click for CLI 的应用程序,您可以查看一些插件,例如 pypi.org/project/pytest-console-scriptspypi.org/project/pytest-click。如果我理解你的问题是正确的。
  • 我意识到我的问题是stackoverflow.com/questions/5850268/… 的重复,虽然我不确定该选择哪一个或者我应该免于覆盖范围
  • 您可以编写一个集成测试来执行例如runpy.run_path("hi.py", run_name="__main__") 并验证脚本的行为。然而,对于简单的主要块,使用pragma: no cover 忽略覆盖更容易。如果您有复杂的主块,则应将它们重构为单个函数 def main(): ... 并通过调用 main() 单独测试。

标签: python python-3.x unit-testing pytest code-coverage


【解决方案1】:

我的代码覆盖率理论是您必须拥有 100% 的覆盖率。除非你不能,然后你必须有 0% 的覆盖率。

您应该将源文件拆分到两个不同的文件夹中。一个文件夹被测试覆盖并达到 100%,另一个文件夹中的文件从未被测试并且覆盖率为 0%。

零覆盖文件的一个例子是:

from hi import foo, bar

if __name__ == "__main__":
   foo()
   bar()

【讨论】:

  • 谢谢,在上述情况下,我提供了一个文件进行演示。基本上我正在检查整个项目的覆盖率。如果我将它们一分为二并在项目级别进行覆盖,我仍将获得 75% 的覆盖率。
  • 我的理论是针对具有多个文件的整个项目。您将覆盖的代码移动到一个文件夹中的文件中,并将未覆盖的代码留在备用文件夹中的文件中。如果您将if __name ... 移动到不同的文件中,您可以将hi.py 100% 覆盖,就像我上面的示例一样。
  • 好的,但我想还有一个命令/标志可以将语句从覆盖标准中排除。你知道吗?这样代码就可以保持完整,覆盖率达到 100%。
  • 大多数覆盖工具都有特殊的 cmets 添加到行中以使工具忽略该行。
【解决方案2】:

好的,我为我的问题找到的一种解决方案是免除该 if 语句并实现 100% 的覆盖率。为此,我必须在 if 语句之后添加 # pragma: no cover,如下所示。

if __name__ == "__main__":      # pragma: no cover
   foo()
   bar()

注释会告诉 pytest 跳过 if 语句,当您运行以下命令时,我可以获得 100% 的覆盖率

python -m pytest --cov=project

但是,它跳过了语句,我想覆盖它而不是跳过它。

【讨论】:

    猜你喜欢
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    相关资源
    最近更新 更多