-2

我有一个名为 my_module 的模块,其结构如下。

.
└── my_module
    ├── main.py
    └── test.py

在这里,我使用 python -m my_module.test 来运行测试,因为它使用相对导入。

那么如何在模块上运行 line_profiler、memory_profiler 呢?(可以是pytest)

以下是我尝试过的

第一种方法

python -m cProfile -m my_module.test   # works -> but I want line_profiler

第二种方法

import line_profiler
import unittest

profiler = line_profiler.LineProfiler()

class PageTester(unittest.TestCase):
  @profiler
  def test_abc(self):
    print(1)

if __name__ == "__main__"
  unittest.main(module='page.test')
  profiler.print_stats()           # doesn't print anything
4

1 回答 1

1

您可以line_profiler使用unittest.TestCase. 只需移动print_statstotearDownClassTestCase

import unittest
import line_profiler

profiler = line_profiler.LineProfiler()

class PageTester(unittest.TestCase):
  @profiler
  def test_abc(self):
      print("abc")
      #profiler.print_stats() 
  
  @profiler
  def test_def(self):
      self.test_abc()

  @classmethod
  def tearDownClass(cls):  
     profiler.print_stats() 
      
if __name__ == "__main__":
  unittest.main(module='page.test')

输出是预期的:

abc
abc
Timer unit: 1e-06 s

Total time: 1.3e-05 s
File: /root/page/test.py
Function: test_abc at line 10

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    10                                             @profiler
    11                                             def test_abc(self):
    12         2         13.0      6.5    100.0        print("abc")

Total time: 9e-06 s
File: /root/page/test.py
Function: test_def at line 15

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    15                                             @profiler
    16                                             def test_def(self):
    17         1          9.0      9.0    100.0        self.test_abc()
于 2021-01-25T16:20:04.787 回答