给定一个对象,如何获取在运行时调用的绑定方法列表

时间:2016-06-22 22:37:38

标签: python pytest coverage.py python-coverage

问题来自这种情况:

我们已经构建了一个框架来测试我们项目的北向apis,基于pytest。 现在我们希望通过运行我们的测试脚本来获得有关测试了多少api(基本上称为)的覆盖率报告。

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

我们现在正在使用python-coverage(实际上是pytest-cov,但它是同一个东西),它将为我们提供代码覆盖率的报告,并基于此,我们将有一些关于有多少的概念apis被称为。但是,它不够准确和清晰。

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

我想举例说明这个问题。

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_userpost_user已被调用,而delete_user在上次运行期间未被调用。

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

另一种可能的解决方案是跟踪我定义的Client中调用的方法。实际上我在我的特殊情况下解决了我的问题,在我的情况下,所有apis方法都会调用一个常用方法call_api。我在方法inspect中使用call_api,我可以获取方法名称,因为说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()

2 个答案:

答案 0 :(得分:0)

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

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

但是......由于覆盖范围需要做类似的事情,因此可能更容易修改覆盖范围以报告本地功能。

答案 1 :(得分:0)

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