From 81b779fef89a4079e21f0e2050b6b8ac0b9879de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Hovm=C3=B6ller?= Date: Mon, 16 Sep 2019 12:13:15 +0200 Subject: [PATCH] Avoid importing coverage for test runs that don't need it --- src/pytest_cov/engine.py | 25 ++++++++++++++++++++++--- src/pytest_cov/plugin.py | 6 +++++- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/pytest_cov/engine.py b/src/pytest_cov/engine.py index 9ef049e0..df20a42f 100644 --- a/src/pytest_cov/engine.py +++ b/src/pytest_cov/engine.py @@ -5,9 +5,6 @@ import socket import sys -import coverage -from coverage.data import CoverageData - from .embed import cleanup from .compat import StringIO, workeroutput, workerinput @@ -93,6 +90,10 @@ def summary(self, stream): if not self.cov_report: return self.cov.report(show_missing=True, ignore_errors=True, file=_NullFile) + # import coverage lazily here to avoid importing + # it for unit tests that don't need it + import coverage + # Output coverage section header. if len(self.node_descs) == 1: self.sep(stream, '-', 'coverage: %s' % ''.join(self.node_descs)) @@ -152,6 +153,10 @@ class Central(CovController): def start(self): cleanup() + # import coverage lazily here to avoid importing + # it for unit tests that don't need it + import coverage + self.cov = coverage.Coverage(source=self.cov_source, branch=self.cov_branch, config_file=self.cov_config) @@ -190,6 +195,10 @@ class DistMaster(CovController): def start(self): cleanup() + # import coverage lazily here to avoid importing + # it for unit tests that don't need it + import coverage + # Ensure coverage rc file rsynced if appropriate. if self.cov_config and os.path.exists(self.cov_config): self.config.option.rsyncdir.append(self.cov_config) @@ -236,11 +245,17 @@ def testnodedown(self, node, error): output['cov_worker_node_id'] ) + # import coverage lazily here to avoid importing + # it for unit tests that don't need it + import coverage + from coverage.data import CoverageData + cov = coverage.Coverage(source=self.cov_source, branch=self.cov_branch, data_suffix=data_suffix, config_file=self.cov_config) cov.start() + data = CoverageData() data.read_fileobj(StringIO(output['cov_worker_data'])) cov.data.update(data) @@ -272,6 +287,10 @@ class DistWorker(CovController): def start(self): cleanup() + # import coverage lazily here to avoid importing + # it for unit tests that don't need it + import coverage + # Determine whether we are collocated with master. self.is_collocated = (socket.gethostname() == workerinput(self.config)['cov_master_host'] and self.topdir == workerinput(self.config)['cov_master_topdir']) diff --git a/src/pytest_cov/plugin.py b/src/pytest_cov/plugin.py index d84a6dbc..3a9bc175 100644 --- a/src/pytest_cov/plugin.py +++ b/src/pytest_cov/plugin.py @@ -4,7 +4,6 @@ import warnings import pytest -from coverage.misc import CoverageException from . import compat from . import embed @@ -239,6 +238,11 @@ def pytest_runtestloop(self, session): self.cov_controller.finish() if not self._is_worker(session) and self._should_report(): + + # import coverage lazily here to avoid importing + # it for unit tests that don't need it + from coverage.misc import CoverageException + try: self.cov_total = self.cov_controller.summary(self.cov_report) except CoverageException as exc: