如何在代码中使用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