如何在鼻子测试覆盖率中忽略PonyORM生成器表达式

时间:2018-11-13 12:26:16

标签: nose coverage.py ponyorm

我正在使用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中的
  3. .coveragerc在这种情况下也不起作用。

2 个答案:

答案 0 :(得分:1)

我已经向coverage.py issue about this添加了一些其他建议。


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

您可以设置coverage.py pragma regex,以便某些行自动进行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)

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

答案 1 :(得分:0)

在这种情况下,您可以使用# 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?