From fbd11a1a23af4eb7d6b120e87155b1b61b8e6d4c Mon Sep 17 00:00:00 2001 From: Jeff Grafton Date: Fri, 20 Feb 2015 16:43:31 -0800 Subject: [PATCH] Renable code coverage collection in unit tests, including on Travis. When code coverage is not being collected, just issue a single 'go test' command, as is already done. Go will internally parallize execution. When code coverage is being collected, it is necessary to issue separate 'go test' commands for each package, since Go does not support collecting coverage across packages. Using xargs -P will parallelize these invocations, however, speeding up test execution. The number of simultaneous processes to use can be specified with KUBE_COVERPROCS. Update Travis config to pass along the number of CPUs to use for running tests. --- .travis.yml | 3 +- hack/benchmark-go.sh | 2 +- hack/test-go.sh | 87 +++++++++++++++++++++++++++++--------------- 3 files changed, 60 insertions(+), 32 deletions(-) diff --git a/.travis.yml b/.travis.yml index b1c42b58fc07d..23971f603b0d7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,7 @@ go: install: - if ! go get code.google.com/p/go.tools/cmd/cover; then go get golang.org/x/tools/cmd/cover; fi + - go get github.com/mattn/goveralls - ./hack/travis/install-etcd.sh - ./hack/verify-gofmt.sh - ./hack/verify-boilerplate.sh @@ -14,7 +15,7 @@ install: - ./hack/build-go.sh script: - - KUBE_RACE="-race" KUBE_COVER="-cover -covermode=atomic" KUBE_TIMEOUT='-timeout 60s' ./hack/test-go.sh "" -p=4 + - KUBE_RACE="-race" KUBE_COVER="y" KUBE_GOVERALLS_BIN="$HOME/gopath/bin/goveralls" KUBE_TIMEOUT='-timeout 60s' KUBE_COVERPROCS=8 ./hack/test-go.sh -- -p=2 - PATH=$HOME/gopath/bin:./third_party/etcd:$PATH ./hack/test-cmd.sh - PATH=$HOME/gopath/bin:./third_party/etcd:$PATH ./hack/verify-gendocs.sh - PATH=$HOME/gopath/bin:./third_party/etcd:$PATH ./hack/test-integration.sh diff --git a/hack/benchmark-go.sh b/hack/benchmark-go.sh index 3753f6b6bc5ce..50a7e729bb197 100755 --- a/hack/benchmark-go.sh +++ b/hack/benchmark-go.sh @@ -20,4 +20,4 @@ set -o pipefail KUBE_ROOT=$(dirname "${BASH_SOURCE}")/.. -KUBE_COVER=" " KUBE_RACE=" " "${KUBE_ROOT}/hack/test-go.sh" "" -test.run="^X" -benchtime=1s -bench=. -benchmem +KUBE_COVER="" KUBE_RACE=" " "${KUBE_ROOT}/hack/test-go.sh" -- -test.run="^X" -benchtime=1s -bench=. -benchmem diff --git a/hack/test-go.sh b/hack/test-go.sh index de5c569371463..68c44d9dd6647 100755 --- a/hack/test-go.sh +++ b/hack/test-go.sh @@ -34,20 +34,22 @@ kube::test::find_dirs() { -o -wholename './target' \ -o -wholename '*/third_party/*' \ -o -wholename '*/Godeps/*' \ - -o -wholename '*/contrib/podex/*' \ + -o -wholename '*/contrib/podex/*' \ \) -prune \ \) -name '*_test.go' -print0 | xargs -0n1 dirname | sed 's|^\./||' | sort -u ) } -kube::test::find_pkgs() { - kube::test::find_dirs | xargs -n1 printf "${KUBE_GO_PACKAGE}/%s\n" -} - # -covermode=atomic becomes default with -race in Go >=1.3 KUBE_TIMEOUT=${KUBE_TIMEOUT:--timeout 120s} -KUBE_COVER=${KUBE_COVER:-} # use KUBE_COVER="-cover -covermode=atomic" for full coverage +KUBE_COVER=${KUBE_COVER:-n} # set to 'y' to enable coverage collection +KUBE_COVERMODE=${KUBE_COVERMODE:-atomic} +# How many 'go test' instances to run simultaneously when running tests in +# coverage mode. +KUBE_COVERPROCS=${KUBE_COVERPROCS:-4} KUBE_RACE=${KUBE_RACE:-} # use KUBE_RACE="-race" to enable race testing +# Set to the goveralls binary path to report coverage results to Coveralls.io. +KUBE_GOVERALLS_BIN=${KUBE_GOVERALLS_BIN:-} kube::test::usage() { kube::log::usage_from_stdin <"${combined_cover_profile}" + +coverage_html_file="${cover_report_dir}/combined-coverage.html" +go tool cover -html="${combined_cover_profile}" -o="${coverage_html_file}" +kube::log::status "Combined coverage report: ${coverage_html_file}" + +if [[ -x "${KUBE_GOVERALLS_BIN}" ]]; then + ${KUBE_GOVERALLS_BIN} -coverprofile="${combined_cover_profile}" || true fi - -kube::test::find_pkgs | xargs go test "${goflags[@]:+${goflags[@]}}" \ - ${KUBE_RACE} \ - ${KUBE_TIMEOUT} \ - ${KUBE_COVER}