Skip to content

Commit

Permalink
test: don't use subprocesses where we don't have to
Browse files Browse the repository at this point in the history
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!?
  • Loading branch information
nedbat committed Oct 13, 2021
1 parent d137a41 commit 001f653
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 56 deletions.
11 changes: 11 additions & 0 deletions tests/coveragetest.py
Expand Up @@ -78,6 +78,16 @@ def start_import_stop(self, cov, modname, modfile=None):
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:]
Expand Down Expand Up @@ -451,6 +461,7 @@ def setup_test(self):
# 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):
Expand Down
7 changes: 4 additions & 3 deletions tests/test_arcs.py
Expand Up @@ -462,16 +462,17 @@ def method(self):
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:
num_stmts = 2
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]

Expand Down
112 changes: 59 additions & 53 deletions tests/test_summary.py
Expand Up @@ -36,9 +36,10 @@ def make_mycode(self):

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
# ------------------------------------------------------------------
Expand All @@ -57,8 +58,9 @@ def test_report(self):
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
# -------------------------------
Expand All @@ -76,6 +78,7 @@ def test_report_just_one(self):
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")

Expand All @@ -95,9 +98,9 @@ def test_report_wildcard(self):
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
# -------------------------------
Expand All @@ -115,8 +118,9 @@ def test_report_omitting(self):
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
# -------------------------------
Expand Down Expand Up @@ -174,9 +178,10 @@ def branch(x):
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
# -----------------------------------------------
Expand Down Expand Up @@ -205,9 +210,10 @@ def missing(x, y):
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
# --------------------------------------------
Expand All @@ -229,9 +235,10 @@ def branch(x, y):
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
# ----------------------------------------------------------
Expand Down Expand Up @@ -260,10 +267,10 @@ def branch(x, y, z):
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',
Expand All @@ -287,6 +294,7 @@ def normal():
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")
Expand Down Expand Up @@ -327,9 +335,10 @@ def foo():
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
# --------------------------------------------------
Expand Down Expand Up @@ -366,9 +375,10 @@ def not_covered(n):
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
# --------------------------------------------------
Expand All @@ -392,9 +402,10 @@ def foo():
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
# -------------------------------------------
Expand All @@ -413,9 +424,10 @@ def foo():
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
# -----------------------------------------
Expand Down Expand Up @@ -448,9 +460,10 @@ def normal():
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
# ------------------------------------
Expand All @@ -465,13 +478,13 @@ def normal():
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
# ------------------------------------
Expand Down Expand Up @@ -509,9 +522,10 @@ def foo():
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
# ------------------------------------------------------
Expand Down Expand Up @@ -638,14 +652,6 @@ def test_report_with_chdir(self):
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", """\
Expand Down

0 comments on commit 001f653

Please sign in to comment.