如何在代码中使用python覆盖率
How to use python coverage inside the code
我想从代码内部捕获覆盖率。我尝试了以下一个,但出现错误。参考下面 link 的报道 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')
低于错误
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.
如果将 #actual code
的所有内容包装在一个函数中,那么它将起作用。这是一个(最小的)示例:
import coverage
def test_it(x):
return x + 1
cov = coverage.Coverage()
cov.start()
test_it(123)
cov.stop()
cov.save()
cov.html_report(directory='covhtml')
但是,如果您仅通过执行一些内联语句(如 x = 123; x += 1; print(x)
)来替换 test_it(123)
,那么覆盖模块将失败。
它隐藏得很好,但文档确实解释了这种行为:
start()
Start measuring code coverage.
Coverage measurement only occurs in functions called after start() is
invoked. Statements in the same scope as start() won’t be measured.
Once you invoke start(), you must also call stop() eventually, or your
process might not shut down cleanly.
强调我自己的,这里是link:https://coverage.readthedocs.io/en/v4.5.x/api_coverage.html#coverage.Coverage.start
我想从代码内部捕获覆盖率。我尝试了以下一个,但出现错误。参考下面 link 的报道 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')
低于错误
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.
如果将 #actual code
的所有内容包装在一个函数中,那么它将起作用。这是一个(最小的)示例:
import coverage
def test_it(x):
return x + 1
cov = coverage.Coverage()
cov.start()
test_it(123)
cov.stop()
cov.save()
cov.html_report(directory='covhtml')
但是,如果您仅通过执行一些内联语句(如 x = 123; x += 1; print(x)
)来替换 test_it(123)
,那么覆盖模块将失败。
它隐藏得很好,但文档确实解释了这种行为:
start()
Start measuring code coverage.
Coverage measurement only occurs in functions called after start() is invoked. Statements in the same scope as start() won’t be measured.
Once you invoke start(), you must also call stop() eventually, or your process might not shut down cleanly.
强调我自己的,这里是link:https://coverage.readthedocs.io/en/v4.5.x/api_coverage.html#coverage.Coverage.start