Skip to content

Commit 301c76e

Browse files
committed
imrpove
Signed-off-by: Bernat Gabor <[email protected]>
1 parent 288a650 commit 301c76e

File tree

4 files changed

+48
-36
lines changed

4 files changed

+48
-36
lines changed

src/pytest_print/__init__.py

Lines changed: 28 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -30,52 +30,49 @@ def pytest_addoption(parser):
3030
@pytest.fixture(name="printer", scope="function")
3131
def printer(request):
3232
"""pytest plugin to print test progress steps in verbose mode"""
33-
return _provide_printer(request)
33+
return create_printer(request)
3434

3535

3636
@pytest.fixture(scope="session", name="printer_session")
3737
def printer_session(request):
38-
return _provide_printer(request)
38+
return create_printer(request)
3939

4040

41-
class State(object):
42-
def __init__(self, print_relative_time):
43-
self.first_call = True
44-
self.start_datetime = datetime.now() if print_relative_time else None
45-
self.print_relative_time = print_relative_time
41+
def create_printer(request):
42+
if request.config.getoption("pytest_print_on") or request.config.getoption("verbose") > 0:
43+
terminal_reporter = request.config.pluginmanager.getplugin("terminalreporter")
44+
if terminal_reporter is not None:
45+
state = State(request.config.getoption("pytest_print_relative_time"), terminal_reporter)
46+
return state.print
4647

47-
@property
48-
def elapsed(self):
49-
if self.start_datetime is None:
50-
return None
51-
return (datetime.now() - self.start_datetime).total_seconds()
48+
return no_op
5249

53-
__slots__ = ("first_call", "start_datetime", "print_relative_time")
5450

51+
# noinspection PyUnusedLocal
52+
def no_op(msg):
53+
"""Do nothing"""
5554

56-
def _provide_printer(request):
57-
if request.config.getoption("pytest_print_on") and request.config.getoption("verbose") > 0:
58-
terminal_reporter = request.config.pluginmanager.getplugin("terminalreporter")
59-
if terminal_reporter is not None:
60-
state = State(request.config.getoption("pytest_print_relative_time"))
61-
62-
def _print(msg):
63-
if state.first_call: # in case of the first call we don't have a new empty line, print it
64-
state.first_call = False
65-
terminal_reporter.write("\n")
6655

67-
terminal_reporter.write("\t")
56+
class State(object):
57+
def __init__(self, print_relative, reporter):
58+
self._reporter = reporter
59+
self._start = datetime.now() if print_relative else None
60+
self._print_relative = print_relative
6861

69-
if state.print_relative_time:
70-
terminal_reporter.write(str(state.elapsed))
71-
terminal_reporter.write("\t")
62+
@property
63+
def elapsed(self):
64+
if self._start is None:
65+
return None
66+
return (datetime.now() - self._start).total_seconds()
7267

73-
terminal_reporter.write(msg)
74-
terminal_reporter.write("\n")
68+
def print(self, msg):
69+
msg = "\t{}{}".format("{}\t".format(self.elapsed) if self._print_relative else "", msg)
70+
self._reporter.write_line(msg)
7571

76-
return _print
72+
def __repr__(self):
73+
return "{}(print_relative={}, reporter={!r})".format(type(self).__name__, self._print_relative, self._reporter)
7774

78-
return lambda *args: None
75+
__slots__ = ("_start", "_print_relative", "_reporter")
7976

8077

8178
__all__ = ("__version__",)

tests/example.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from time import sleep
22

3+
import pytest
4+
35

46
def create_virtual_environment():
57
sleep(0.001)
@@ -13,7 +15,18 @@ def parallel_requests():
1315
sleep(0.001)
1416

1517

16-
def test_server_parallel_requests(printer, tmpdir):
18+
@pytest.fixture(scope="session")
19+
def expensive_setup(printer_session):
20+
printer_session("attempt global peace")
21+
yield
22+
printer_session("teardown global peace")
23+
24+
25+
def test_global_peace(printer_session, expensive_setup):
26+
printer_session("here we have global peace")
27+
28+
29+
def test_server_parallel_requests(printer, tmpdir, expensive_setup):
1730
printer("create virtual environment")
1831
create_virtual_environment()
1932

tests/test_print.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ def test_progress_no_v(progress_report_example):
2727

2828

2929
def test_progress_v_no_relative(progress_report_example):
30-
result_verbose = progress_report_example.runpytest("-v")
30+
result_verbose = progress_report_example.runpytest("-v", "--print")
3131
result_verbose.assert_outcomes(passed=1)
3232

3333
report_lines = [
34-
"test_progress_v_no_relative.py::test_server_parallel_requests ",
34+
"test_example.py::test_server_parallel_requests ",
3535
"\tcreate virtual environment",
3636
"\tstart server from virtual env",
3737
"\tdo the parallel request test",
@@ -42,9 +42,11 @@ def test_progress_v_no_relative(progress_report_example):
4242

4343
def test_progress_v_relative(progress_report_example):
4444
result_verbose_relative = progress_report_example.runpytest("--print", "-v", "--print-relative-time")
45+
out = "\n".join(result_verbose_relative.outlines)
4546
result_verbose_relative.assert_outcomes(passed=1)
4647

4748
marker = "test_example.py::test_server_parallel_requests "
49+
assert marker in result_verbose_relative.outlines, out
4850
from_index = result_verbose_relative.outlines.index(marker)
4951
output = (i.split("\t") for i in result_verbose_relative.outlines[from_index + 1 : from_index + 4])
5052
out = sorted([(float(relative), msg) for _, relative, msg in output])
@@ -53,7 +55,7 @@ def test_progress_v_relative(progress_report_example):
5355
"create virtual environment",
5456
"start server from virtual env",
5557
"do the parallel request test",
56-
]
58+
], out
5759

5860

5961
def test_progress_no_v_but_with_print_request(progress_report_example):

tox.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ commands =
3030
coverage report
3131

3232
[pytest]
33-
addopts = -ra --showlocals --runpytest=subprocess
33+
addopts = -ra --showlocals
3434
rsyncdirs = tests tox
3535
looponfailroots = tox tests
3636
testpaths = tests

0 commit comments

Comments
 (0)