summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2021-10-13 06:47:57 -0400
committerNed Batchelder <ned@nedbatchelder.com>2021-10-13 07:46:16 -0400
commit001f6532f8a8bf05f1cf6f2b5574ba091550a77d (patch)
tree4beb1d4bf18483b4f95d245c5f410a9d23bb0c61
parentd137a41da2f1a7010a1bd4305962670af2f7dae1 (diff)
downloadpython-coveragepy-git-001f6532f8a8bf05f1cf6f2b5574ba091550a77d.tar.gz
test: don't use subprocesses where we don't have to
When running tests with `-n 0`, this shaves 4 seconds off the run time. When running the complete test suite with xdist, it takes 2 seconds longer!?
-rw-r--r--tests/coveragetest.py11
-rw-r--r--tests/test_arcs.py7
-rw-r--r--tests/test_summary.py112
3 files changed, 74 insertions, 56 deletions
diff --git a/tests/coveragetest.py b/tests/coveragetest.py
index aae4df08..aad71134 100644
--- a/tests/coveragetest.py
+++ b/tests/coveragetest.py
@@ -78,6 +78,16 @@ class CoverageTest(
cov.stop()
return mod
+ def get_report(self, cov, squeeze=True, **kwargs):
+ """Get the report from `cov`, and canonicalize it."""
+ repout = io.StringIO()
+ kwargs.setdefault("show_missing", False)
+ cov.report(file=repout, **kwargs)
+ report = repout.getvalue().replace('\\', '/')
+ if squeeze:
+ report = re.sub(r" +", " ", report)
+ return report
+
def get_module_name(self):
"""Return a random module name to use for this test run."""
self.last_module_name = 'coverage_test_' + str(random.random())[2:]
@@ -451,6 +461,7 @@ class UsingModulesMixin:
# Parent class saves and restores sys.path, we can just modify it.
sys.path.append(nice_file(TESTS_DIR, "modules"))
sys.path.append(nice_file(TESTS_DIR, "moremodules"))
+ sys.path.append(nice_file(TESTS_DIR, "zipmods.zip"))
def command_line(args):
diff --git a/tests/test_arcs.py b/tests/test_arcs.py
index 6cdc908e..1284badc 100644
--- a/tests/test_arcs.py
+++ b/tests/test_arcs.py
@@ -462,8 +462,9 @@ class LoopArcTest(CoverageTest):
while True:
return 1
""")
- out = self.run_command("coverage run --branch --source=. main.py")
- assert out == 'done\n'
+ cov = coverage.Coverage(source=["."], branch=True)
+ self.start_import_stop(cov, "main")
+ assert self.stdout() == 'done\n'
if env.PYBEHAVIOR.keep_constant_test:
num_stmts = 3
elif env.PYBEHAVIOR.nix_while_true:
@@ -471,7 +472,7 @@ class LoopArcTest(CoverageTest):
else:
num_stmts = 3
expected = "zero.py {n} {n} 0 0 0% 1-3".format(n=num_stmts)
- report = self.report_from_command("coverage report -m")
+ report = self.get_report(cov, show_missing=True)
squeezed = self.squeezed_lines(report)
assert expected in squeezed[3]
diff --git a/tests/test_summary.py b/tests/test_summary.py
index fc67e8a9..03660542 100644
--- a/tests/test_summary.py
+++ b/tests/test_summary.py
@@ -36,9 +36,10 @@ class SummaryTest(UsingModulesMixin, CoverageTest):
def test_report(self):
self.make_mycode()
- out = self.run_command("coverage run mycode.py")
- assert out == 'done\n'
- report = self.report_from_command("coverage report")
+ cov = coverage.Coverage()
+ self.start_import_stop(cov, "mycode")
+ assert self.stdout() == 'done\n'
+ report = self.get_report(cov)
# Name Stmts Miss Cover
# ------------------------------------------------------------------
@@ -57,8 +58,9 @@ class SummaryTest(UsingModulesMixin, CoverageTest):
def test_report_just_one(self):
# Try reporting just one module
self.make_mycode()
- self.run_command("coverage run mycode.py")
- report = self.report_from_command("coverage report mycode.py")
+ cov = coverage.Coverage()
+ self.start_import_stop(cov, "mycode")
+ report = self.get_report(cov, morfs=["mycode.py"])
# Name Stmts Miss Cover
# -------------------------------
@@ -76,6 +78,7 @@ class SummaryTest(UsingModulesMixin, CoverageTest):
def test_report_wildcard(self):
# Try reporting using wildcards to get the modules.
self.make_mycode()
+ # Wildcard is handled by shell or cmdline.py, so use real commands
self.run_command("coverage run mycode.py")
report = self.report_from_command("coverage report my*.py")
@@ -95,9 +98,9 @@ class SummaryTest(UsingModulesMixin, CoverageTest):
def test_report_omitting(self):
# Try reporting while omitting some modules
self.make_mycode()
- self.run_command("coverage run mycode.py")
- omit = f'{TESTS_DIR}/*,*/site-packages/*'
- report = self.report_from_command(f"coverage report --omit '{omit}'")
+ cov = coverage.Coverage()
+ self.start_import_stop(cov, "mycode")
+ report = self.get_report(cov, omit=[f"{TESTS_DIR}/*", "*/site-packages/*"])
# Name Stmts Miss Cover
# -------------------------------
@@ -115,8 +118,9 @@ class SummaryTest(UsingModulesMixin, CoverageTest):
def test_report_including(self):
# Try reporting while including some modules
self.make_mycode()
- self.run_command("coverage run mycode.py")
- report = self.report_from_command("coverage report --include=mycode*")
+ cov = coverage.Coverage()
+ self.start_import_stop(cov, "mycode")
+ report = self.get_report(cov, include=["mycode*"])
# Name Stmts Miss Cover
# -------------------------------
@@ -174,9 +178,10 @@ class SummaryTest(UsingModulesMixin, CoverageTest):
return x
branch(1)
""")
- out = self.run_command("coverage run --source=. --branch mybranch.py")
- assert out == 'x\n'
- report = self.report_from_command("coverage report")
+ cov = coverage.Coverage(source=["."], branch=True)
+ self.start_import_stop(cov, "mybranch")
+ assert self.stdout() == 'x\n'
+ report = self.get_report(cov)
# Name Stmts Miss Branch BrPart Cover
# -----------------------------------------------
@@ -205,9 +210,10 @@ class SummaryTest(UsingModulesMixin, CoverageTest):
return x
missing(0, 1)
""")
- out = self.run_command("coverage run --source=. mymissing.py")
- assert out == 'y\nz\n'
- report = self.report_from_command("coverage report --show-missing")
+ cov = coverage.Coverage(source=["."])
+ self.start_import_stop(cov, "mymissing")
+ assert self.stdout() == 'y\nz\n'
+ report = self.get_report(cov, show_missing=True)
# Name Stmts Miss Cover Missing
# --------------------------------------------
@@ -229,9 +235,10 @@ class SummaryTest(UsingModulesMixin, CoverageTest):
print("y")
branch(1, 1)
""")
- out = self.run_command("coverage run --branch mybranch.py")
- assert out == 'x\ny\n'
- report = self.report_from_command("coverage report --show-missing")
+ cov = coverage.Coverage(branch=True)
+ self.start_import_stop(cov, "mybranch")
+ assert self.stdout() == 'x\ny\n'
+ report = self.get_report(cov, show_missing=True)
# Name Stmts Miss Branch BrPart Cover Missing
# ----------------------------------------------------------
@@ -260,10 +267,10 @@ class SummaryTest(UsingModulesMixin, CoverageTest):
return x
branch(1, 1, 0)
""")
- out = self.run_command("coverage run --branch main.py")
- assert out == 'x\ny\n'
- report = self.report_from_command("coverage report --show-missing")
- report_lines = report.splitlines()
+ cov = coverage.Coverage(branch=True)
+ self.start_import_stop(cov, "main")
+ assert self.stdout() == 'x\ny\n'
+ report_lines = self.get_report(cov, squeeze=False, show_missing=True).splitlines()
expected = [
'Name Stmts Miss Branch BrPart Cover Missing',
@@ -287,6 +294,7 @@ class SummaryTest(UsingModulesMixin, CoverageTest):
def not_covered():
print("n")
""")
+ # --fail-under is handled by cmdline.py, use real commands.
out = self.run_command("coverage run main.py")
assert out == "z\n"
report = self.report_from_command("coverage report --skip-covered --fail-under=70")
@@ -327,9 +335,10 @@ class SummaryTest(UsingModulesMixin, CoverageTest):
pass
foo()
""")
- out = self.run_command("coverage run --branch main.py")
- assert out == "n\nz\n"
- report = self.report_from_command("coverage report --skip-covered")
+ cov = coverage.Coverage(branch=True)
+ self.start_import_stop(cov, "main")
+ assert self.stdout() == "n\nz\n"
+ report = self.get_report(cov, skip_covered=True)
# Name Stmts Miss Branch BrPart Cover
# --------------------------------------------------
@@ -366,9 +375,10 @@ class SummaryTest(UsingModulesMixin, CoverageTest):
def does_not_appear_in_this_film(ni):
print("Ni!")
""")
- out = self.run_command("coverage run --branch main.py")
- assert out == "n\nz\n"
- report = self.report_from_command("coverage report --skip-covered")
+ cov = coverage.Coverage(branch=True)
+ self.start_import_stop(cov, "main")
+ assert self.stdout() == "n\nz\n"
+ report = self.get_report(cov, skip_covered=True)
# Name Stmts Miss Branch BrPart Cover
# --------------------------------------------------
@@ -392,9 +402,10 @@ class SummaryTest(UsingModulesMixin, CoverageTest):
pass
foo()
""")
- out = self.run_command("coverage run --source=. --branch main.py")
- assert out == ""
- report = self.report_from_command("coverage report --skip-covered")
+ cov = coverage.Coverage(source=["."], branch=True)
+ self.start_import_stop(cov, "main")
+ assert self.stdout() == ""
+ report = self.get_report(cov, skip_covered=True)
# Name Stmts Miss Branch BrPart Cover
# -------------------------------------------
@@ -413,9 +424,10 @@ class SummaryTest(UsingModulesMixin, CoverageTest):
pass
foo()
""")
- out = self.run_command("coverage run --source=. --branch long_______________filename.py")
- assert out == ""
- report = self.report_from_command("coverage report --skip-covered")
+ cov = coverage.Coverage(source=["."], branch=True)
+ self.start_import_stop(cov, "long_______________filename")
+ assert self.stdout() == ""
+ report = self.get_report(cov, squeeze=False, skip_covered=True)
# Name Stmts Miss Branch BrPart Cover
# -----------------------------------------
@@ -448,9 +460,10 @@ class SummaryTest(UsingModulesMixin, CoverageTest):
normal()
""")
self.make_file("submodule/__init__.py", "")
- out = self.run_command("coverage run main.py")
- assert out == "z\n"
- report = self.report_from_command("coverage report --skip-empty")
+ cov = coverage.Coverage()
+ self.start_import_stop(cov, "main")
+ assert self.stdout() == "z\n"
+ report = self.get_report(cov, skip_empty=True)
# Name Stmts Miss Cover
# ------------------------------------
@@ -465,13 +478,13 @@ class SummaryTest(UsingModulesMixin, CoverageTest):
assert squeezed[2] == "main.py 4 0 100%"
assert squeezed[4] == "TOTAL 4 0 100%"
assert squeezed[6] == "1 empty file skipped."
- assert self.last_command_status == 0
def test_report_skip_empty_no_data(self):
self.make_file("__init__.py", "")
- out = self.run_command("coverage run __init__.py")
- assert out == ""
- report = self.report_from_command("coverage report --skip-empty")
+ cov = coverage.Coverage()
+ self.start_import_stop(cov, "__init__")
+ assert self.stdout() == ""
+ report = self.get_report(cov, skip_empty=True)
# Name Stmts Miss Cover
# ------------------------------------
@@ -509,9 +522,10 @@ class SummaryTest(UsingModulesMixin, CoverageTest):
pass
foo()
""")
- out = self.run_command("coverage run --branch main.py")
- assert out == "n\nz\n"
- report = self.report_from_command("coverage report")
+ cov = coverage.Coverage(branch=True)
+ self.start_import_stop(cov, "main")
+ assert self.stdout() == "n\nz\n"
+ report = self.get_report(cov)
# Name Stmts Miss Branch BrPart Cover
# ------------------------------------------------------
@@ -638,14 +652,6 @@ class SummaryTest(UsingModulesMixin, CoverageTest):
report = self.report_from_command("coverage report")
assert self.last_line_squeezed(report) == "TOTAL 5 0 100%"
- def get_report(self, cov):
- """Get the report from `cov`, and canonicalize it."""
- repout = io.StringIO()
- cov.report(file=repout, show_missing=False)
- report = repout.getvalue().replace('\\', '/')
- report = re.sub(r" +", " ", report)
- return report
-
def test_bug_156_file_not_run_should_be_zero(self):
# https://github.com/nedbat/coveragepy/issues/156
self.make_file("mybranch.py", """\