Skip to content

Commit b2afd32

Browse files
author
qdewaghe
committed
Implement generate_report_on_test_rate
`generate_report_on_test_rate` allow limiting how often `_generate_report` is run.
1 parent 9935a4e commit b2afd32

File tree

3 files changed

+38
-5
lines changed

3 files changed

+38
-5
lines changed

docs/user_guide.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,14 @@ ini-value:
2121
[pytest]
2222
generate_report_on_test = True
2323
24+
If you have many tests report streaming may slow down pytest. You can limit how often
25+
tests generate the report using ``generate_report_on_test_rate`` ini-value:
26+
27+
.. code-block:: ini
28+
29+
[pytest]
30+
generate_report_on_test_rate = 1.0
31+
2432
Creating a self-contained report
2533
--------------------------------
2634

src/pytest_html/basereport.py

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ def __init__(self, report_path, config, report_data, template, css):
3535
self._report = report_data
3636
self._report.title = self._report_path.name
3737
self._suite_start_time = time.time()
38+
self._last_generated_time = None
3839

3940
@property
4041
def css(self):
@@ -49,14 +50,31 @@ def _asset_filename(self, test_id, extra_index, test_index, file_extension):
4950
file_extension,
5051
)[-self._max_asset_filename_length :]
5152

53+
def _should_generate_report_on_test(self):
54+
if not self._config.getini("generate_report_on_test"):
55+
return False
56+
57+
if self._last_generated_time is None:
58+
return True
59+
60+
seconds = self._config.getini("generate_report_on_test_rate")
61+
62+
if seconds == 0.0:
63+
return True
64+
65+
return (
66+
datetime.datetime.now() - self._last_generated_time
67+
>= datetime.timedelta(seconds=seconds)
68+
)
69+
5270
def _generate_report(self, self_contained=False):
53-
generated = datetime.datetime.now()
71+
self._last_generated_time = datetime.datetime.now()
5472
test_data = self._report.data
5573
test_data = json.dumps(test_data)
5674
rendered_report = self._template.render(
5775
title=self._report.title,
58-
date=generated.strftime("%d-%b-%Y"),
59-
time=generated.strftime("%H:%M:%S"),
76+
date=self._last_generated_time.strftime("%d-%b-%Y"),
77+
time=self._last_generated_time.strftime("%H:%M:%S"),
6078
version=__version__,
6179
styles=self.css,
6280
run_count=self._run_count(),
@@ -175,7 +193,7 @@ def pytest_sessionstart(self, session):
175193
self._report.table_header = _fix_py(headers)
176194

177195
self._report.running_state = "started"
178-
if self._config.getini("generate_report_on_test"):
196+
if self._should_generate_report_on_test():
179197
self._generate_report()
180198

181199
@pytest.hookimpl(trylast=True)
@@ -256,7 +274,7 @@ def pytest_runtest_logreport(self, report):
256274
dur = test_duration if when == "call" else each.duration
257275
self._process_report(each, dur, processed_extras)
258276

259-
if self._config.getini("generate_report_on_test"):
277+
if self._should_generate_report_on_test():
260278
self._generate_report()
261279

262280
def _process_report(self, report, duration, processed_extras):

src/pytest_html/plugin.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,13 @@ def pytest_addoption(parser):
7979
help="the HTML report will be generated after each test "
8080
"instead of at the end of the run.",
8181
)
82+
parser.addini(
83+
"generate_report_on_test_rate",
84+
type="float",
85+
default=0.0,
86+
help="limit how often the report can be generated "
87+
"expects a value in seconds",
88+
)
8289

8390

8491
def pytest_configure(config):

0 commit comments

Comments
 (0)