【问题标题】:How to coverage dynamic python code (compiled with `compile()`)如何覆盖动态 Python 代码(使用 `compile()` 编译)
【发布时间】:2021-03-25 12:27:11
【问题描述】:

有没有办法进行动态覆盖?例如假设这个 pytest 代码:

src = '''
def virtual_func(a):
  if a < 5 :
    return 'LESS THAN FIVE'
  else :
    return 'MORE THAN FIVE'
'''
    
obj = compile(src, 'my_file_name.py', 'exec') 



def test_dyncov():
  g = dict()
  exec(obj, g, g)
  assert 'LESS THAN FIVE' == g['virtual_func'](3)

我怎样才能获得 my_file_name.py 的覆盖率报告?

注意:这是一个最小的测试用例示例。在现实生活中,它将用于覆盖模板引擎生成的 python 模板。顺便说一句,在现实生活中的代码中,模板几乎像一个模块一样被加载,它得到一个虚拟模块名和一个虚拟文件名(但所有内容都保留在内存中)。如果可能的话,我想知道如何使用虚拟文件名(例如'my_file_name.py')获取报告

【问题讨论】:

    标签: python pytest code-coverage


    【解决方案1】:

    Coverage.py 支持可以做到这一点的插件:https://coverage.readthedocs.io/en/coverage-5.5/api_plugin.html

    写的不多,所以写一个可能有点困难,但可以做到。这是您自己的模板引擎,还是公共的?

    【讨论】:

    • 我自己的,公开的:github.com/hl037/skbs
    • 我发现 exec 中所有内容的条目都添加到了 .coverage 中。但是,文件名会以当前目录为前缀。因此,我怀疑它没有被报告,因为 Coverage.py 无法检索源,这确实可以使用插件修复
    • 你能用你看到的文件名的例子来更新这个问题吗?
    猜你喜欢
    • 2019-07-14
    • 1970-01-01
    • 2011-06-10
    • 2019-05-20
    • 2019-03-30
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    相关资源
    最近更新 更多