part 2 :add coverage report in Jenkins for Yardstick 37/1537/8
authorkubi <jean.gaoliang@huawei.com>
Mon, 14 Sep 2015 06:50:50 +0000 (02:50 -0400)
committerkubi <jean.gaoliang@huawei.com>
Wed, 28 Oct 2015 03:21:26 +0000 (11:21 +0800)
this part is focus on script on run coverage test,not only show missing lines
but also show diff between your patch and master,
actually,it produce a html for coverage,but now ,it just on your local machine
extra missing lines is 10-lines,final target is 4-lines

JIRA:YARDSTICK-108

Change-Id: I550dff51d6f89562447e12127646155325e38a4a
Signed-off-by: kubi <jean.gaoliang@huawei.com>
.gitignore
ci/cover.sh [new file with mode: 0644]
run_tests.sh
setup.py

index dcaa10f..5614ae8 100644 (file)
@@ -23,4 +23,5 @@ setuptools*zip
 dist/
 pep8.log
 test.log
-
+.testrepository/
+cover/
diff --git a/ci/cover.sh b/ci/cover.sh
new file mode 100644 (file)
index 0000000..51b009d
--- /dev/null
@@ -0,0 +1,66 @@
+##############################################################################
+# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+# make coverage report
+##############################################################################
+
+show_diff () {
+    head -1 $1
+    diff -U 0 $1 $2 | sed 1,2d
+}
+
+
+run_coverage_test() {
+
+    ALLOWED_EXTRA_MISSING=10
+
+
+    # Stash uncommitted changes, checkout master and save coverage report
+    uncommited=$(git status --porcelain | grep -v "^??")
+    [[ -n $uncommited ]] && git stash > /dev/null
+    git checkout HEAD^
+
+    baseline_report=$(mktemp -t yardstick_coverageXXXXXXX)
+    find . -type f -name "*.pyc" -delete && python setup.py testr --coverage --testr-args="$*"
+    coverage report > $baseline_report
+    baseline_missing=$(awk 'END { print $3 }' $baseline_report)
+
+    # Checkout back and unstash uncommitted changes (if any)
+    git checkout -
+    [[ -n $uncommited ]] && git stash pop > /dev/null
+
+    # Generate and save coverage report
+    current_report=$(mktemp -t yardstick_coverageXXXXXXX)
+    find . -type f -name "*.pyc" -delete && python setup.py testr --coverage --testr-args="$*"
+    coverage report > $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
+    else
+        show_diff $baseline_report $current_report
+        echo "Please write more unit tests, we should keep our test coverage :( "
+        rm $baseline_report $current_report
+        exit 1
+    fi
+
+    rm $baseline_report $current_report
+}
index b4ddc94..d1567af 100755 (executable)
@@ -53,6 +53,11 @@ run_tests() {
     fi
 }
 
+run_coverage() {
+    source ci/cover.sh
+    run_coverage_test
+}
+
 run_functional_test() {
 
     mkdir -p .testrepository
@@ -62,8 +67,14 @@ run_functional_test() {
     EXIT_CODE=$?
     subunit-stats < .testrepository/subunit.log
 
-    exit $EXIT_CODE
+    if [ $EXIT_CODE -ne 0 ]; then
+        exit 1
+    else
+        echo "OK"
+    fi
 }
+
 run_flake8
 run_tests
+run_coverage
 run_functional_test
index a6848ec..b8a6fe9 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -16,6 +16,7 @@ setup(
     },
     url="https://www.opnfv.org",
     install_requires=["backport_ipaddress",  # remove with python3
+                      "coverage>=3.6",
                       "flake8",
                       "Jinja2>=2.6",
                       "PyYAML>=3.10",
@@ -28,7 +29,8 @@ setup(
                       "mock>=1.0.1",  # remove with python3
                       "paramiko",
                       "six",
-                      "testrepository>=0.0.18"
+                      "testrepository>=0.0.18",
+                      "testtools>=1.4.0"
                       ],
     extras_require={
         'plot': ["matplotlib>=1.4.2"]