Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中对单元测试进行时间配置?_Python_Unit Testing_Memory Profiling_Line Profiler - Fatal编程技术网

如何在Python中对单元测试进行时间配置?

如何在Python中对单元测试进行时间配置?,python,unit-testing,memory-profiling,line-profiler,Python,Unit Testing,Memory Profiling,Line Profiler,我有一个测试套件和它正在测试的代码。如果我将from memory\u profiler import profile放在适当文件的顶部,用@profile装饰我想要分析的函数,并用python TestThing.py以标准方式运行,我会得到很好的逐行结果 但是line_profiler不是以这种方式出现在包中的,我能够用它分析任何内容的唯一方法是使用kernprof-l-v thing.py。如果我在单元测试中使用它,那么所有测试都不会运行(这并不奇怪,真的),也不会生成任何结果。如何以类似

我有一个测试套件和它正在测试的代码。如果我将
from memory\u profiler import profile
放在适当文件的顶部,用
@profile
装饰我想要分析的函数,并用
python TestThing.py
以标准方式运行,我会得到很好的逐行结果

但是line_profiler不是以这种方式出现在包中的,我能够用它分析任何内容的唯一方法是使用
kernprof-l-v thing.py
。如果我在单元测试中使用它,那么所有测试都不会运行(这并不奇怪,真的),也不会生成任何结果。如何以类似于内存分析器的方式对测试及其使用的代码进行时间分析

当然,您可以:

结果存储在foo.lprof中

或者,您可以包装一个内存分析器(如decorator),调用后打印结果:

def profile_and_show(func):
    profiler = line_profiler.LineProfiler(func)
    def _(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        finally:
            lstats = profiler.get_stats()
            line_profiler.show_text(lstats.timings, lstats.unit)
    return _
请查收

您只需要用要分析的函数修饰(标记)一个或多个测试,并在最后获得逐行报告


PS:我是这个插件的作者,非常感谢您的反馈。

对这个插件的修改正在起作用:导入line_profiler,然后为类声明一个静态profiler=line_profiler.LineProfiler。然后用@profiler装饰函数。然后在这些函数的末尾调用ClassName.profiler.dump_stats('method.lprof')。然后使用python-m line_profiler method.lprof阅读它们。但这不是傻瓜吗?我不想在代码中添加太多以后必须删除的行。有没有更干净的方法?哪个部分不干净?对于memory_profiler,我不需要实例化对象,也不需要担心在运行分析函数后调用其dump_stats方法。我可以使用这种时间分析方法,但这比它需要做的工作要多。@pvlkmrv你可以总结一下,我在上面写了一个例子。
def profile_and_show(func):
    profiler = line_profiler.LineProfiler(func)
    def _(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        finally:
            lstats = profiler.get_stats()
            line_profiler.show_text(lstats.timings, lstats.unit)
    return _