How to run unit tests - oomichi/try-kubernetes GitHub Wiki

kubernetes/kubernetes 配下の unit tests のローカル実行方法を記載する。

CI環境では pull-kubernetes-bazel-test ジョブが unit tests を流す。

Call:  /workspace/./test-infra/jenkins/../scenarios/kubernetes_bazel.py '--test=//... -//build/... -//vendor/...' --manual-test=//hack:verify-all --test-args=--config=unit --test-args=--build_tag_filters=-e2e,-integration --test-args=--test_tag_filters=-e2e,-integration --test-args=--flaky_test_attempts=3

https://github.com/kubernetes/community/blob/master/contributors/devel/testing.md#run-all-unit-tests に記載があった。

準備

$ wget https://dl.google.com/go/go1.11.1.linux-amd64.tar.gz
$ sudo tar -C /usr/local/ -xzf go1.11.1.linux-amd64.tar.gz
$ export PATH=$PATH:/usr/local/go/bin
$ echo "export PATH=$PATH:/usr/local/go/bin" >> $HOME/.bashrc
$ mkdir ${HOME}/go
$ echo "export GOPATH=${HOME}/go" >> ${HOME}/.bashrc
$ sudo apt-get update
$ sudo apt-get install make gcc

全 Unit Tests 実行

$ cd kubernetes
$ make test

指定実行

カバレッジ出力付き

$ make test KUBE_COVER=y WHAT=./pkg/kubectl
...
+++ [0114 22:44:47] Saving coverage output in '/tmp/k8s_coverage/4a55e0dab36e58da54f277b74e7f2598a8df8500/20190114-224447'
skipped k8s.io/kubernetes/vendor/k8s.io/code-generator/cmd/generator
skipped k8s.io/kubernetes/vendor/k8s.io/client-go/1.4/rest
ok      k8s.io/kubernetes/pkg/kubectl   5.173s  coverage: 37.1% of statements

staging 配下に対して実行しようとするとエラーになる

$ make test KUBE_COVER=y WHAT=./staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/
...
can't load package: package k8s.io/kubernetes/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation: code in directory /home/ubuntu/go/src/k8s.io/kubernetes/_output/local/go/src/k8s.io/kubernetes/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation expects import "k8s.io/apiserver/pkg/endpoints/handlers/negotiation"
...

下記のように必要なライブラリをインストールした後、go test で実行できた。

$ cd ~/go/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation
$ sudo apt-get install mercurial
$ go get bitbucket.org/ww/goautoneg
$ go get k8s.io/apimachinery
$ go get k8s.io/klog
$ go get github.com/google/gofuzz
$ go test
PASS
ok      k8s.io/apiserver/pkg/endpoints/handlers/negotiation     0.006s
$

網羅度測定も可能

$ go test -cover
PASS
coverage: 63.3% of statements
ok      k8s.io/apiserver/pkg/endpoints/handlers/negotiation     0.005s

各行の網羅度を html で出力も可能

$ go test -covermode=count -coverprofile=c.out
$ go tool cover -html=c.out -o coverage.html