【问题标题】:How to ignore PonyORM generator expressions in nose-tests coverage如何在鼻子测试覆盖中忽略 PonyORM 生成器表达式
【发布时间】:2019-04-16 06:50:31
【问题描述】:

我正在使用nosetests --cover-erase --with-cover --cover-branches 运行我的测试用例。

我正在使用 PonyORM 删除一组对象。下面是我的代码的样子。

@db_session
def remove_all_stuff(self):
    delete(j for j in MyEntityClass if j.deleted == True)

当我计算覆盖率时,即使我执行了remove_all_jobs。 PonyORM 不执行 delete( 内部的生成器表达式。

如何忽略生成器表达式并仍然检查 delete( 是否被调用?


我发现了什么。

  1. # pragma: no cover -> 不能使用,因为我需要覆盖delete
  2. [report] exclude_lines in .coveragerc 也不适用于这种情况。

【问题讨论】:

    标签: nose coverage.py ponyorm


    【解决方案1】:

    在这种情况下,您可以使用# pragma: no branch 指令。这将忽略生成器表达式。

    @db_session
    def remove_all_stuff(self):
        delete(j for j in MyEntityClass if j.deleted == True)  # pragma: no branch
    

    如果您使用lambda 进行选择,请将其格式化为新行并使用# pragma: no cover

    为什么会这样?

    这是因为 PonyORM 不执行生成器表达式,有时不执行 lambda。它通过反编译和分析这些python表达式的抽象语法树来生成SQL。

    更多信息:How Pony (ORM) does its tricks?

    【讨论】:

      【解决方案2】:

      我在coverage.py issue about this 中添加了一些其他建议。


      如何更优雅地处理此问题的其他一些可能性:

      您可以设置 coverage.py pragma 正则表达式,以便自动对某些行进行 pragma'd:

      [report]
      partial_branches = 
          pragma: no branch
          \.select\(lambda
      

      现在任何匹配两个正则表达式中的任何一个的行都将被视为部分分支,因此即使没有注释,您的行也会被识别。

      您可以将 lambda 或生成器表达式的定义与使用它们的行分开:

      to_select = lambda p: p.nom_d_exercice.lower().startswith(chaine.lower())    # pragma: no branch
      return Praticien.select(to_select)
      

      或:

      to_delete = (j for j in MyEntityClass if j.deleted == True)  # pragma: no branch
      delete(to_delete)
      

      这会将未运行的代码隔离到它自己的行中,因此您不会冒关闭真正需要它的行上的覆盖率测量的风险。

      【讨论】:

      • 我从 github 复制了内容,所以其他人更容易看到。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多