Files
test/tests/coverage/coverage.py
Jacques Lucke cc01e8a74e Tools: support reference data in coverage report
This adds initial support for showing the difference between old and new coverage
data. The difference is only shown in index.html currently. This is mainly useful
when adding new tests right now, to see the impact.

To use this, rename the `coverage/analysis` folder in the build directory to
`reference`. It will automatically be used by the report script if that reference
folder exists.
2024-08-17 13:36:42 +02:00

99 lines
2.9 KiB
Python
Executable File

#!/usr/bin/env python3
# SPDX-FileCopyrightText: 2024 Blender Authors
#
# SPDX-License-Identifier: GPL-2.0-or-later
import argparse
import os
import shutil
import sys
import textwrap
import webbrowser
from coverage_report import parse, report_as_html
from coverage_report.util import print_updateable_line
from pathlib import Path
usage = textwrap.dedent(
"""\
coverage.py <command> [<args>]
Commands:
report Analyse coverage data and generate html report.
[--build-directory] Blender build directory. This will be scanned for .gcda files.
[--no-browser] Don't open the browser in the end.
reset [--build-directory] Delete .gcda files.
help Show this help.
"""
)
def main():
parser = argparse.ArgumentParser(description="Blender test coverage", usage=usage)
parser.add_argument("command", nargs="?", default="help")
args = parser.parse_args(sys.argv[1:2])
command = args.command
argv = sys.argv[2:]
if command == "report":
run_report(argv)
elif command == "reset":
run_reset(argv)
elif command == "help":
print(usage)
else:
print("Unknown command: {}".format(command))
sys.exit(1)
def run_report(argv):
parser = argparse.ArgumentParser(usage=usage)
parser.add_argument("--build-directory", type=str, default=".")
parser.add_argument("--no-browser", action="store_true", default=False)
args = parser.parse_args(argv)
build_dir = Path(args.build_directory).absolute()
if not is_blender_build_directory(build_dir):
print("Directory does not seem to be a Blender build directory.")
sys.exit(1)
coverage_dir = build_dir / "coverage"
analysis_dir = coverage_dir / "analysis"
reference_dir = coverage_dir / "reference"
report_dir = coverage_dir / "report"
parse(build_dir, analysis_dir)
report_as_html(analysis_dir, report_dir, reference_dir=reference_dir)
if not args.no_browser:
webbrowser.open("file://" + str(report_dir / "index.html"))
def run_reset(argv):
parser = argparse.ArgumentParser(usage=usage)
parser.add_argument("--build-directory", type=str, default=".")
args = parser.parse_args(argv)
build_dir = Path(args.build_directory).absolute()
if not is_blender_build_directory(build_dir):
print("Directory does not seem to be a Blender build directory.")
sys.exit(1)
print("Remove .gcda files...")
gcda_files = list(build_dir.glob("**/*.gcda"))
for i, path in enumerate(gcda_files):
print_updateable_line("[{}/{}] Remove: {}".format(i + 1, len(gcda_files), path))
os.remove(path)
print()
def is_blender_build_directory(build_dir):
return (Path(build_dir) / "CMakeCache.txt").exists()
if __name__ == '__main__':
main()