From 36f36cc69168dce1faf8bbedf673816ace09a556 Mon Sep 17 00:00:00 2001 From: yanyanhu Date: Thu, 21 Jul 2016 05:31:48 -0400 Subject: [PATCH] Improve coverage test This patch adds a test tool borrowed from Rally project to enable test coverage comparison between master and proposed branch. With it, coverage test will fail if new proposed change reduces the unit test coverage. Change-Id: I0de9cf84eb82e1846aae57c35e33c8b789a629cc --- .gitignore | 1 + tools/cover.sh | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++ tox.ini | 2 +- 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100755 tools/cover.sh diff --git a/.gitignore b/.gitignore index f02af154d..afc24fe65 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ AUTHORS ChangeLog build cover +cover-master dist etc/senlin/senlin.conf.sample releasenodes/build diff --git a/tools/cover.sh b/tools/cover.sh new file mode 100755 index 000000000..d9385e2aa --- /dev/null +++ b/tools/cover.sh @@ -0,0 +1,75 @@ +#!/bin/bash +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +# This tool is borrowed from Rally project and revised to enhance Senlin +# coverage test. + +ALLOWED_EXTRA_MISSING=4 + +show_diff () { + head -1 $1 + diff -U 0 $1 $2 | sed 1,2d +} + +if ! git diff --exit-code || ! git diff --cached --exit-code +then + echo "There are uncommited changes!" + echo "Please clean git working directory and try again" + exit 1 +fi + +# Checkout master and save coverage report +git checkout HEAD^ + +baseline_report=$(mktemp -t senlin_coverageXXXXXXX) +python setup.py test --coverage --testr-args="^(?!senlin\.tests\.tempest)" +coverage report > $baseline_report +cat $baseline_report +mv cover cover-master +baseline_missing=$(awk 'END { print $3 }' $baseline_report) + +# Checkout back and save coverage report +git checkout - + +current_report=$(mktemp -t senlin_coverageXXXXXXX) +python setup.py test --coverage --testr-args="^(?!senlin\.tests\.tempest)" +coverage report > $current_report +cat $current_report +current_missing=$(awk 'END { print $3 }' $current_report) + +# Show coverage details +allowed_missing=$((baseline_missing+ALLOWED_EXTRA_MISSING)) + +echo "Allowed to introduce missing lines : ${ALLOWED_EXTRA_MISSING}" +echo "Missing lines in master : ${baseline_missing}" +echo "Missing lines in proposed change : ${current_missing}" + +if [ $allowed_missing -gt $current_missing ]; +then + if [ $baseline_missing -lt $current_missing ]; + then + show_diff $baseline_report $current_report + echo "I believe you can cover all your code with 100% coverage!" + else + echo "Thank you! You are awesome! Keep writing unit tests! :)" + fi + exit_code=0 +else + show_diff $baseline_report $current_report + echo "Please write more unit tests, we should keep our test coverage :( " + exit_code=1 +fi + +rm $baseline_report $current_report +exit $exit_code diff --git a/tox.ini b/tox.ini index 41c7f73f4..a23cacf43 100644 --- a/tox.ini +++ b/tox.ini @@ -73,7 +73,7 @@ commands = {posargs} [testenv:cover] setenv = VIRTUAL_ENV={envdir} -commands = python setup.py test --coverage --testr-args="^(?!senlin\.tests\.tempest){posargs}" +commands = {toxinidir}/tools/cover.sh {posargs} [testenv:docs] deps = -r{toxinidir}/test-requirements.txt