首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何衡量覆盖范围(在生产系统中)?

如何衡量覆盖范围(在生产系统中)?
EN

Stack Overflow用户
提问于 2020-05-22 08:56:37
回答 3查看 462关注 0票数 5

我想测量在生产系统中执行的Python代码的覆盖率。

我要回答这个问题:

哪些行经常执行(热点),哪些行从未使用(死代码)?

当然,这绝不能减缓我的生产网站。

我是,而不是,谈论的是测试的覆盖范围。

EN

回答 3

Stack Overflow用户

发布于 2020-05-24 22:16:55

我想您不是在谈论测试套件代码覆盖率,而另一个答案所指的是测试套件代码。这的确是CI的一份工作。

如果您想知道哪些代码路径在您的生产系统中经常被击中,那么您将不得不进行一些测试/分析。这是有代价的。您不能免费添加度量值。但是,您可以以较低的成本运行它,并且通常只运行很短的时间,直到您获得数据为止。

Python可以进行全面的分析,测量每个函数的调用数等。这将给您提供最准确的数据,但可能会对性能产生相对较高的影响。

或者,您也可以进行统计分析,这基本上意味着您在计时器上对堆栈进行采样,而不是对所有内容进行检测。这可以便宜得多,即使是高采样率!当然,它的缺点是缺乏精确性。

尽管在Python中做起来非常容易,但是这个东西在这里还是有点难以回答的。不过,在这个确切的主题上有一个很好的Nylas团队的博客文章

下面的采样器是从Nylas博客上拿出来的,经过一些调整。启动它之后,它每毫秒触发一个中断,并记录当前调用堆栈:

代码语言:javascript
复制
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以查看您的程序所做的事情。这些数据可以在火焰图中绘制,这样可以很明显地查看您的程序在哪些代码路径中花费的时间最多。

票数 8
EN

Stack Overflow用户

发布于 2020-05-29 05:51:27

如果我理解得对,那么您希望了解应用程序的哪些部分最常被用户使用。

TL;DR;

如果不想手工操作,请使用python的度量框架之一。其中一些建议如下:

它通常是按功能级别进行的,实际上取决于应用程序;

  • 如果它是一个具有互联网接入的桌面应用程序: 您可以创建一个简单的db并收集调用函数的次数。为了完成它,您可以编写一个简单的函数,并在您想要跟踪的每个函数中调用它。之后,您可以定义一个异步任务来将数据上载到internet。
  • 如果它是一个web应用程序: 您可以跟踪哪些函数是从js (用户行为跟踪的首选)调用的,或者是从web调用的。从外部开始往内走是一种很好的做法。首先,检测哪些端点经常被调用(如果使用像nginx这样的代理,可以分析服务器日志来收集信息。这是最简单、最干净的方法)。在此之后,向您希望跟踪的所有其他函数插入一个记录器,并简单地分析每周或每个月的日志。

但是,您想逐行分析您的生产代码(这是一个非常糟糕的主意),您可以使用python分析器启动应用程序。Python已经有了一个:cProfile

票数 0
EN

Stack Overflow用户

发布于 2020-05-22 09:03:21

也许可以创建一个文本文件,通过您的每个程序方法,只需附加一些引用到它的文本,比如“方法一已执行”。像查看器那样彻底运行web应用程序10次,然后编写一个python程序,读取文件并计算其中的一个特定部分,甚至可能是一个模式,并将其添加到变量中并输出变量。

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

https://stackoverflow.com/questions/61951275

复制
相关文章

相似问题

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