【问题标题】:Given an object, how to get a list of bound methods which are called during runtime给定一个对象,如何获取在运行时调用的绑定方法列表
【发布时间】:2016-06-22 22:37:37
【问题描述】:

问题来自这个场景:

我们已经构建了一个框架来测试我们项目的北向 api,基于 pytest。 现在我们希望通过运行我们拥有的测试脚本来获得关于测试(基本上是被调用)的 api 数量的覆盖率报告。

我们已经有一个定义良好的客户端管理器,它使每个 api 都成为一个 python 方法。 例如,假设我们有一个 api GET /user,那么我们将有一个方法 get_user 将实际请求发送到服务器。

我们现在正在使用 python-coverage(实际上是 pytest-cov,但它是同一件事),它会给我们一个代码覆盖率报告,并且基于此,我们将有一些关于调用多少 api 的概念。但是,它不够准确和清晰。

所以关键问题是,有没有办法获取在运行时调用的绑定方法列表。

我想举个例子来说明这个问题。

class Client(object):
    def __init__(self):
        pass

    def get_user(self, user):
        pass

    def post_user(self, user):
        pass

    def delete_user(self, user):
        pass

def test_get_user():
    Client().get_user("user")

def test_post_user():
    Client().post_user("user")

运行这两个测试后,我怎样才能得到一个报告说在上次运行期间调用了 get_user 和 post_user 而未调用 delete_user。

一种可能的解决方案是,因为使用coverage.py 运行测试会给我们提供有关正在执行的行号和文件的足够信息,也许我可以从那里分析我需要什么。

另一种可能的解决方案是跟踪我定义的Client 中调用了哪个方法。实际上,我在我的特殊情况下解决了我的问题,在我的情况下,所有 apis 方法都将调用一个通用方法,call_api。我在方法call_api 中使用inspect,并且我能够获取方法名称,因为说get_user 始终是call_api 的调用者。但是,此解决方案仅适用于这种特殊情况,不是通用解决方案。

我还查看了模块trace,它看起来接近我想要的,但不幸的是,您必须使用tracer(Trace instance) 来运行命令或函数。

我最终想要实现的是:

tracer = Trace(obj_to_trace)
tracer.start_trace()
# using obj_to_trace 
tracer.end_trace()
tracer.get_called_methods()

【问题讨论】:

    标签: python pytest coverage.py python-coverage


    【解决方案1】:

    我不知道你是否可以从覆盖库本身获取这些信息,但是你绝对可以通过自己处理文件来获取这些信息。

    看看AST 模块。它允许您解析覆盖报告的所有文件并为每个函数生成行范围。从那里你只需要检查哪些函数执行了任何行。

    但是...由于覆盖率需要做类似的事情,因此只修改覆盖率以报告本地函数可能会更容易。

    【讨论】:

      【解决方案2】:

      Coverage.py 没有此功能。您需要使用trace 模块,或对覆盖结果进行后处理以获取方法名称。

      【讨论】:

      • 同意,我正在深入研究 trace 和 inspect 模块。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-02
      • 2014-10-26
      • 2013-01-01
      相关资源
      最近更新 更多