我想测量在生产系统中执行的Python代码的覆盖率。
我要回答这个问题:
哪些行经常执行(热点),哪些行从未使用(死代码)?
当然,这绝不能减缓我的生产网站。
我是,而不是,谈论的是测试的覆盖范围。
发布于 2020-05-24 22:16:55
我想您不是在谈论测试套件代码覆盖率,而另一个答案所指的是测试套件代码。这的确是CI的一份工作。
如果您想知道哪些代码路径在您的生产系统中经常被击中,那么您将不得不进行一些测试/分析。这是有代价的。您不能免费添加度量值。但是,您可以以较低的成本运行它,并且通常只运行很短的时间,直到您获得数据为止。
Python可以进行全面的分析,测量每个函数的调用数等。这将给您提供最准确的数据,但可能会对性能产生相对较高的影响。
或者,您也可以进行统计分析,这基本上意味着您在计时器上对堆栈进行采样,而不是对所有内容进行检测。这可以便宜得多,即使是高采样率!当然,它的缺点是缺乏精确性。
尽管在Python中做起来非常容易,但是这个东西在这里还是有点难以回答的。不过,在这个确切的主题上有一个很好的Nylas团队的博客文章。
下面的采样器是从Nylas博客上拿出来的,经过一些调整。启动它之后,它每毫秒触发一个中断,并记录当前调用堆栈:
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以查看您的程序所做的事情。这些数据可以在火焰图中绘制,这样可以很明显地查看您的程序在哪些代码路径中花费的时间最多。
发布于 2020-05-29 05:51:27
如果我理解得对,那么您希望了解应用程序的哪些部分最常被用户使用。
TL;DR;
如果不想手工操作,请使用python的度量框架之一。其中一些建议如下:
它通常是按功能级别进行的,实际上取决于应用程序;
但是,您想逐行分析您的生产代码(这是一个非常糟糕的主意),您可以使用python分析器启动应用程序。Python已经有了一个:cProfile。
发布于 2020-05-22 09:03:21
也许可以创建一个文本文件,通过您的每个程序方法,只需附加一些引用到它的文本,比如“方法一已执行”。像查看器那样彻底运行web应用程序10次,然后编写一个python程序,读取文件并计算其中的一个特定部分,甚至可能是一个模式,并将其添加到变量中并输出变量。
https://stackoverflow.com/questions/61951275
复制相似问题