如何在代码中使用Python覆盖率

Ris*_*sal 4 python code-coverage

我想从代码内部捕获覆盖范围。我尝试了下面的一种,但出现错误。请参阅以下链接了解覆盖 API。 https://coverage.readthedocs.io/en/v4.5.x/api.html#api

import os
import pandas as pd
import sys
import requests
import xml.etree.ElementTree as ET
from xml.dom import minidom
import coverage

cov = coverage.Coverage()
cov.start()

#actual code

cov.stop()
cov.save()

cov.html_report(directory='covhtml')
Run Code Online (Sandbox Code Playgroud)

低于错误

CoverageException                         Traceback (most recent call last)
<ipython-input-15-2047badbbd57> in <module>()
     48 cov.save()
     49 
---> 50 cov.html_report(directory='covhtml')

C:\Users\\Anaconda2\lib\site-packages\coverage\control.pyc in html_report(self, morfs, directory, ignore_errors, omit, include, extra_css, title, skip_covered)
   1093             )
   1094         reporter = HtmlReporter(self, self.config)
-> 1095         return reporter.report(morfs)
   1096 
   1097     def xml_report(

C:\Users\\Anaconda2\lib\site-packages\coverage\html.pyc in report(self, morfs)
    137 
    138         # Process all the files.
--> 139         self.report_files(self.html_file, morfs, self.config.html_dir)
    140 
    141         if not self.all_files_nums:

C:\Users\\Anaconda2\lib\site-packages\coverage\report.pyc in report_files(self, report_fn, morfs, directory)
     81 
     82         if not file_reporters:
---> 83             raise CoverageException("No data to report.")
     84 
     85         self.directory = directory

CoverageException: No data to report.
Run Code Online (Sandbox Code Playgroud)

Mat*_*ith 5

如果你将你所拥有的任何东西包装#actual code在一个函数中,那么它就会起作用。这是一个(最小的)示例:

\n\n
import coverage\n\ndef test_it(x):\n    return x + 1\n\ncov = coverage.Coverage()\ncov.start()\n\ntest_it(123)\n\ncov.stop()\ncov.save()\n\ncov.html_report(directory=\'covhtml\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,如果您test_it(123)仅通过执行一些内联​​语句(例如x = 123; x += 1; print(x))来替换,那么覆盖率模块将会失败。

\n\n

它隐藏得很好,但文档确实解释了这种行为:

\n\n
\n

开始()

\n\n

开始测量代码覆盖率。

\n\n

覆盖率测量仅发生在调用 start() 后调用的函数中。与 start() 相同范围内的语句将不会被测量。

\n\n

一旦调用 start(),您最终还必须调用 stop(),否则您的进程可能无法彻底关闭。

\n
\n\n

强调我自己的,这里是链接:https://coverage.readthedocs.io/en/v4.5.x/api_coverage.html#coverage.Coverage.start

\n