PyCharm + cProfile + py.test --> pstat 快照视图 + 调用图为空

Posted

技术标签:

【中文标题】PyCharm + cProfile + py.test --> pstat 快照视图 + 调用图为空【英文标题】:PyCharm + cProfile + py.test --> pstat snapshot view + call graph are empty 【发布时间】:2015-09-01 11:32:29 【问题描述】:

在 PyCharm 中,我将 py.test 设置为默认测试运行器。

我有一个简单的测试用例:

import unittest
import time

def my_function():
   time.sleep(0.42)

class MyTestCase(unittest.TestCase):

    def test_something(self):
        my_function()

现在我通过右键单击文件并选择 Profile 'py.test in test_profile.py' 来运行测试。

我在控制台中看到测试成功运行(它显示collected 1 items)。但是,显示生成的 pstat 文件的 Statistics/Call Graph 视图是空的,显示为 Nothing to show

我希望看到test_somethingmy_function 的分析信息。我做错了什么?

编辑 1: 如果我将文件名更改为test_开头的名称,删除unittest.TestCase并插入一个__main__调用my_function的方法,我终于可以在没有py的情况下运行cProfile .test 我看到了结果。

但是,我正在处理一个包含大量测试的大型项目。我想直接分析这些测试而不是编写额外的分析脚本。有没有办法调用py.test test-discovery 模块,以便我可以递归地检索项目的所有测试? (unittest 的发现是不够的,因为我们在生成器函数中产生了很多 unittest 无法识别的参数化测试)。这样我至少可以只用 1 个额外的脚本来解决问题。

【问题讨论】:

【参考方案1】:

这是一个解决方法。使用以下内容创建一个额外的 python 脚本(相应地调整到 tests-root 的路径):

import os
import pytest

if __name__ == '__main__':
    source_dir = os.path.dirname(os.path.abspath(__file__))
    test_dir = os.path.abspath(os.path.join(source_dir, "../"))
    pytest.main(test_dir, "setup.cfg")

脚本文件名不能以test_开头,否则pycharm会强制你以py.test运行它。然后右键单击该文件并使用Profile 运行它。

这对于使用Coverage 运行它也很方便。

【讨论】:

test_dir = os.path.dirname(source_dir) 应该在这里工作

以上是关于PyCharm + cProfile + py.test --> pstat 快照视图 + 调用图为空的主要内容,如果未能解决你的问题,请参考以下文章

cProfile 没有方法 runcall

从函数中调用 Python cProfile。 (或其他在 Django 中使用 cProfile 的方式)

嵌套函数内的 cProfile

python模块上的cprofile

正确使用 cProfile 的方法

如何从脚本输出 .cprofile 文件