首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >给定一个对象,如何获取在运行时调用的绑定方法的列表

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

Stack Overflow用户
提问于 2016-06-23 06:37:38
回答 2查看 58关注 0票数 2

这个问题来自于这个场景:

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

我们已经有了一个定义良好的客户端管理器,它将每个api都作为一个python方法。例如,假设我们有一个GET /user接口,然后我们将有一个向服务器发送实际请求的方法get_user

我们现在使用的是python-coverage (实际上是pytest-cov,但这是一回事),它会给我们一个代码覆盖率的报告,并在此基础上,我们会有一些关于调用了多少apis的概念。然而,它还不够准确和清晰。

所以关键的问题是,是否有一种方法可以获得运行时调用的绑定方法的列表。

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

代码语言:javascript
复制
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。我在方法call_api中使用inspect,并且我能够获得方法名,因为假设get_user总是call_api的调用者。但是,此解决方案仅适用于此特殊情况,而不是一般解决方案。

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

我最终想要实现的是:

代码语言:javascript
复制
tracer = Trace(obj_to_trace)
tracer.start_trace()
# using obj_to_trace 
tracer.end_trace()
tracer.get_called_methods()
EN

回答 2

Stack Overflow用户

发布于 2016-06-23 07:02:20

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2016-06-23 18:32:31

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37979365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档