我希望测量在生产系统中执行的Python代码的覆盖率。
我想要得到这个问题的答案:
哪些代码行经常被执行(热点)和哪些代码行从未被使用(死代码)?
当然,这不能拖慢我的生产站点。
我并不是在谈论测试覆盖率。
import collections
import signal
class Sampler(object):
def __init__(self, interval=0.001):
self.stack_counts = collections.defaultdict(int)
self.interval = interval
def start(self):
signal.signal(signal.VTALRM, self._sample)
signal.setitimer(signal.ITIMER_VIRTUAL, self.interval, 0)
def _sample(self, signum, frame):
stack = []
while frame is not None:
formatted_frame = '{}({})'.format(
frame.f_code.co_name,
frame.f_globals.get('__name__'))
stack.append(formatted_frame)
frame = frame.f_back
formatted_stack = ';'.join(reversed(stack))
self.stack_counts[formatted_stack] += 1
signal.setitimer(signal.ITIMER_VIRTUAL, self.interval, 0)
stack_counts
以了解程序的运行情况。这些数据可以绘制成 火焰图,从而更容易地看出程序在哪些代码路径上花费了最多的时间。如果我理解正确,您想了解用户最常使用应用程序的哪些部分。
TL;DR;
如果您不想手动完成,可以使用Python的度量框架之一。以下是其中一些:
通常情况下,这是通过函数级别完成的,实际上取决于应用程序;
如果是具有互联网访问权限的桌面应用程序:
您可以创建一个简单的数据库并收集调用您的函数的次数。为此,您可以编写一个简单的函数,并在要跟踪的每个函数内部调用它。之后,您可以定义一个异步任务将数据上传到互联网。
如果是Web应用程序:
您可以跟踪从js(大多数情况下首选用户行为跟踪)或Web API调用的函数。从外部开始向内部前进是一个好习惯。首先检测哪些端点经常被调用(如果您使用像nginx这样的代理,可以分析服务器日志以收集信息。这是最简单和最清洁的方法)。之后,在您想要跟踪的每个其他函数中插入记录器,然后每周或每月分析您的日志即可。
但是,如果您想逐行分析生产代码(这是一个非常糟糕的想法),您可以使用Python分析器启动应用程序。Python已经有一个:cProfile。