From e9e4e3cf653721e5683fb703514675256cc990d9 Mon Sep 17 00:00:00 2001 From: Christine Lytwynec Date: Tue, 30 Jun 2015 14:18:28 -0400 Subject: [PATCH] use 1 coveragerc file to generate 1 coverage report per build --- .coveragerc | 46 ++++++++++++++++++++ cms/.coveragerc | 22 ---------- common/lib/calc/.coveragerc | 15 ------- common/lib/capa/.coveragerc | 14 ------- common/lib/xmodule/.coveragerc | 17 -------- lms/.coveragerc | 21 ---------- pavelib/tests.py | 56 ++++++++++--------------- pavelib/utils/envs.py | 3 ++ pavelib/utils/test/suites/nose_suite.py | 4 +- scripts/jenkins-report.sh | 5 +-- test_root/.jenkins-coveragerc | 8 ---- 11 files changed, 75 insertions(+), 136 deletions(-) create mode 100644 .coveragerc delete mode 100644 cms/.coveragerc delete mode 100644 common/lib/calc/.coveragerc delete mode 100644 common/lib/capa/.coveragerc delete mode 100644 common/lib/xmodule/.coveragerc delete mode 100644 lms/.coveragerc delete mode 100644 test_root/.jenkins-coveragerc diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000000..b1064ee89b --- /dev/null +++ b/.coveragerc @@ -0,0 +1,46 @@ +# .coveragerc for edx-platform +[run] +data_file = reports/.coverage +source = + cms + common/djangoapps + common/lib/calc + common/lib/capa + common/lib/xmodule + lms + openedx/core/djangoapps + pavelib + +omit = + cms/envs/* + cms/manage.py + cms/djangoapps/*/migrations/* + cms/djangoapps/*/features/* + lms/envs/* + lms/djangoapps/*/migrations/* + lms/djangoapps/*/features/* + common/djangoapps/terrain/* + common/djangoapps/*/migrations/* + openedx/core/djangoapps/*/migrations/* + +[report] +ignore_errors = True + +exclude_lines = + pragma: no cover + raise NotImplementedError + +[html] +title = edx-platform Python Test Coverage Report +directory = reports/cover + +[xml] +output = reports/coverage.xml + +[paths] +jenkins_source = + /home/jenkins/workspace/edx-platform-unit-coverage + /home/jenkins/workspace/edx-platform-test-subset + +devstack_source = + /edx/app/edxapp/edx-platform diff --git a/cms/.coveragerc b/cms/.coveragerc deleted file mode 100644 index 34fdb69dee..0000000000 --- a/cms/.coveragerc +++ /dev/null @@ -1,22 +0,0 @@ -# .coveragerc for cms -[run] -data_file = reports/cms/.coverage -source = cms,common/djangoapps,openedx/core/djangoapps -omit = - cms/envs/* - cms/manage.py - common/djangoapps/terrain/* - common/djangoapps/*/migrations/* - openedx/core/djangoapps/*/migrations/* - cms/djangoapps/*/migrations/* - cms/djangoapps/*/features/* - -[report] -ignore_errors = True - -[html] -title = CMS Python Test Coverage Report -directory = reports/cms/cover - -[xml] -output = reports/cms/coverage.xml diff --git a/common/lib/calc/.coveragerc b/common/lib/calc/.coveragerc deleted file mode 100644 index 352ddf399e..0000000000 --- a/common/lib/calc/.coveragerc +++ /dev/null @@ -1,15 +0,0 @@ -# .coveragerc for common/lib/calc -[run] -data_file = reports/common/lib/calc/.coverage -source = common/lib/calc -branch = true - -[report] -ignore_errors = True - -[html] -title = Calc Python Test Coverage Report -directory = reports/common/lib/calc/cover - -[xml] -output = reports/common/lib/calc/coverage.xml diff --git a/common/lib/capa/.coveragerc b/common/lib/capa/.coveragerc deleted file mode 100644 index 149a4c860a..0000000000 --- a/common/lib/capa/.coveragerc +++ /dev/null @@ -1,14 +0,0 @@ -# .coveragerc for common/lib/capa -[run] -data_file = reports/common/lib/capa/.coverage -source = common/lib/capa - -[report] -ignore_errors = True - -[html] -title = Capa Python Test Coverage Report -directory = reports/common/lib/capa/cover - -[xml] -output = reports/common/lib/capa/coverage.xml diff --git a/common/lib/xmodule/.coveragerc b/common/lib/xmodule/.coveragerc deleted file mode 100644 index 5bd4aa4f65..0000000000 --- a/common/lib/xmodule/.coveragerc +++ /dev/null @@ -1,17 +0,0 @@ -# .coveragerc for common/lib/xmodule -[run] -data_file = reports/common/lib/xmodule/.coverage -source = common/lib/xmodule - -[report] -ignore_errors = True -exclude_lines = - pragma: no cover - raise NotImplementedError - -[html] -title = XModule Python Test Coverage Report -directory = reports/common/lib/xmodule/cover - -[xml] -output = reports/common/lib/xmodule/coverage.xml diff --git a/lms/.coveragerc b/lms/.coveragerc deleted file mode 100644 index 1f09e53cee..0000000000 --- a/lms/.coveragerc +++ /dev/null @@ -1,21 +0,0 @@ -# .coveragerc for lms -[run] -data_file = reports/lms/.coverage -source = lms,common/djangoapps,openedx/core/djangoapps -omit = - lms/envs/* - common/djangoapps/terrain/* - common/djangoapps/*/migrations/* - openedx/core/djangoapps/*/migrations/* - lms/djangoapps/*/migrations/* - lms/djangoapps/*/features/* - -[report] -ignore_errors = True - -[html] -title = LMS Python Test Coverage Report -directory = reports/lms/cover - -[xml] -output = reports/lms/coverage.xml diff --git a/pavelib/tests.py b/pavelib/tests.py index 2f7a1b7723..36a188476b 100644 --- a/pavelib/tests.py +++ b/pavelib/tests.py @@ -196,44 +196,33 @@ def coverage(options): """ compare_branch = getattr(options, 'compare_branch', 'origin/master') - for directory in Env.LIB_TEST_DIRS + ['cms', 'lms']: - report_dir = Env.REPORT_DIR / directory + report_dir = Env.REPORT_DIR + rcfile = Env.PYTHON_COVERAGERC - if (report_dir / '.coverage').isfile(): - # Generate the coverage.py HTML report - sh("coverage html --rcfile={dir}/.coveragerc".format(dir=directory)) + if not (report_dir / '.coverage').isfile(): + # This may be that the coverage files were generated using -p, + # try to combine them to the one file that we need. + sh("coverage combine --rcfile={}".format(rcfile)) - # Generate the coverage.py XML report - sh("coverage xml -o {report_dir}/coverage.xml --rcfile={dir}/.coveragerc".format( - report_dir=report_dir, - dir=directory - )) + if not os.path.getsize(report_dir / '.coverage') > 50: + # Check if the .coverage data file is larger than the base file, + # because coverage combine will always at least make the "empty" data + # file even when there isn't any data to be combined. + err_msg = colorize( + 'red', + "No coverage info found. Run `paver test` before running " + "`paver coverage`.\n" + ) + sys.stderr.write(err_msg) + return + # Generate the coverage.py XML report + sh("coverage xml --rcfile={}".format(rcfile)) + # Generate the coverage.py HTML report + sh("coverage html --rcfile={}".format(rcfile)) call_task('diff_coverage', options=dict(options)) -@no_help -@task -@needs('pavelib.prereqs.install_prereqs') -def combine_jenkins_coverage(): - """ - Combine coverage reports from jenkins build flow. - """ - coveragerc = Env.REPO_ROOT / 'test_root' / '.jenkins-coveragerc' - - for directory in Env.LIB_TEST_DIRS + ['cms', 'lms']: - report_dir = Env.REPORT_DIR / directory - - # Only try to combine the coverage if we've run the tests. - if report_dir.isdir(): - sh( - "cd {} && coverage combine --rcfile={}".format( - report_dir, - coveragerc, - ) - ) - - @task @needs('pavelib.prereqs.install_prereqs') @cmdopts([ @@ -255,7 +244,8 @@ def diff_coverage(options): if not xml_reports: err_msg = colorize( 'red', - "No coverage info found. Run `paver test` before running `paver coverage`.\n" + "No coverage info found. Run `paver test` before running " + "`paver coverage`.\n" ) sys.stderr.write(err_msg) else: diff --git a/pavelib/utils/envs.py b/pavelib/utils/envs.py index dd3b272208..728597e224 100644 --- a/pavelib/utils/envs.py +++ b/pavelib/utils/envs.py @@ -22,6 +22,9 @@ class Env(object): REPORT_DIR = REPO_ROOT / 'reports' METRICS_DIR = REPORT_DIR / 'metrics' + # Python unittest dirs + PYTHON_COVERAGERC = REPO_ROOT / ".coveragerc" + # Bok_choy dirs BOK_CHOY_DIR = REPO_ROOT / "common" / "test" / "acceptance" BOK_CHOY_LOG_DIR = REPO_ROOT / "test_root" / "log" diff --git a/pavelib/utils/test/suites/nose_suite.py b/pavelib/utils/test/suites/nose_suite.py index d43f6f3205..901a8efa57 100644 --- a/pavelib/utils/test/suites/nose_suite.py +++ b/pavelib/utils/test/suites/nose_suite.py @@ -63,10 +63,10 @@ class NoseTestSuite(TestSuite): cmd0 = "`which {}`".format(cmd0) cmd = ( - "python -m coverage run {cov_args} --rcfile={root}/.coveragerc " + "python -m coverage run {cov_args} --rcfile={rcfile} " "{cmd0} {cmd_rest}".format( cov_args=self.cov_args, - root=self.root, + rcfile=Env.PYTHON_COVERAGERC, cmd0=cmd0, cmd_rest=cmd_rest, ) diff --git a/scripts/jenkins-report.sh b/scripts/jenkins-report.sh index d34dff171b..42b5d82c26 100755 --- a/scripts/jenkins-report.sh +++ b/scripts/jenkins-report.sh @@ -1,11 +1,8 @@ #!/usr/bin/env bash source scripts/jenkins-common.sh -# Combine the data files that were generated using -p -paver combine_jenkins_coverage - # Get the diff coverage and html reports for unit tests -NO_PREREQ_INSTALL=true paver coverage +paver coverage # Get coverage reports for bok choy # paver bokchoy_coverage diff --git a/test_root/.jenkins-coveragerc b/test_root/.jenkins-coveragerc deleted file mode 100644 index d70de8af6f..0000000000 --- a/test_root/.jenkins-coveragerc +++ /dev/null @@ -1,8 +0,0 @@ -[paths] -build_jenkins_source = - /home/jenkins/workspace/edx-platform-unit-coverage - /home/jenkins/workspace/edx-platform-test-subset - -test_jenkins_source = - /home/jenkins/workspace/test-edx-platform-unit-coverage - /home/jenkins/workspace/*test-edx-platform-test-subset