0

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_linesin.coveragerc也不适用于这种情况。
4

2 回答 2

1

我在coverage.py 问题中添加了一些其他建议。


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

您可以设置 coverage.py pragma 正则表达式,以便自动编译某些行:

[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)

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

于 2018-11-29T14:57:00.643 回答
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 不执行生成器表达式,有时也不执行 lambdas。它通过反编译和分析这些python表达式的抽象语法树来生成SQL。

更多信息:Pony (ORM) 如何使用它的技巧?

于 2018-11-13T12:36:29.073 回答