问题来自这种情况:
我们已经建立了一个框架来测试我们项目的北向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
. 我使用inspect
in 方法call_api
,并且我能够获取方法名称,因为 sayget_user
始终是call_api
. 但是,此解决方案仅适用于这种特殊情况,不是通用解决方案。
我还查看了 module trace
,它看起来很接近我想要的,但不幸的是,你必须使用它tracer(Trace instance)
来运行命令或函数。
我最终想要实现的是:
tracer = Trace(obj_to_trace)
tracer.start_trace()
# using obj_to_trace
tracer.end_trace()
tracer.get_called_methods()