tijdens het werken aan een project met behulp van de Operator-sdk vond ik dat test coverage vrij laag was. De reden was dat van veel gegenereerde deepcopy-bestanden in de repo te wijten aan de Operator-sdk.
eerst gebruik ik de volgende repo om kleuren toe te voegen aan mijn tests voor leesbaarheid
go get -u github.com/rakyll/gotest
ik test de Pkg-map die ik heb getest met het volgende commando
gotest -v -covermode=count -coverprofile=coverage.out ./pkg/...
dit voert de test uit en voert de testdekking uit naar een bestanddekking.u kunt de dekking lokaal controleren met behulp van de html-vlag
go tool cover -html=coverage.out
of u kunt de func-vlag gebruiken die u het percentage van de dekking van de functies in de cli geeft
go tool cover -func=coverage.out
het verfijnen van de dekking
omdat ik nooit van plan was om de gegenereerde bestanden te testen besloot ik om te zien of ik ze uit ons codeverslag kon verwijderen. In eerste instantie keek ik naar de go test-run vlag in het volgende formaat.
gotest ./packagedirectory -run=testname
ik vond dat het te veel onderhoud zou hebben om bij te werken. Ik probeerde het te gebruiken met regex om te proberen en druk op alle testen, maar vond dat met een hebzuchtige regex expressie als -run=^Test.+
ik zou alle testen, maar ook alle bestanden te raken, dus ik was terug waar ik begon.
omdat in de volgende map pkg / API ‘ s de gegenereerde deepcopy-bestanden zich bevonden. Ik verplaatste de bestanden die ik testte naar een van pkg / API ‘ s naar een subpakket genaamd types en filterde mijn tests door directory in plaats daarvan. Dus mijn testcommando zag eruit als
gotest -v -covermode=count -coverprofile=coverage.out ./pkg/controller/... ./pkg/providers/... ./pkg/resources/... ./pkg/apis/integreatly/v1alpha1/types/...
dit voert de tests uit in de bovenstaande mappen en werkt de dekking bij.uit met alleen de bestanden in deze map. Dit verhoogde mijn totale dekking met ongeveer 14%
CI / CD en overalls
we gebruikten Travis voor CI / CD en setup overalls met de volgende configuratie in .travis.yml
.
language: gosudo: requireddist: bionicgo: - 1.13.xenv: - GO111MODULE=onaddons: apt: update: true packages: - "python3" - "python3-pip" - "python3-setuptools"git: depth: 1stages: - name: test - name: push if: fork = false - name: manifest if: fork = false AND tag IS presentbefore_install: - go get github.com/mattn/goverallsjobs: include: - stage: test script: - go get github.com/mattn/goveralls - go get -u github.com/rakyll/gotest - gotest -v -covermode=count -coverprofile=coverage.out ./pkg/controller/... ./pkg/providers/... ./pkg/resources/... ./pkg/apis/integreatly/v1alpha1/types/... - $GOPATH/bin/goveralls -coverprofile=coverage.out -service=travis-ci -repotoken=$COVERALLS_TOKEN
voor meer informatie over het opzetten van -repotoken=$COVERALLS_TOKEN
zie de goveralls repo https://github.com/mattn/goveralls en https://docs.coveralls.io/go
met deze setup kunnen we dan onze dekking controleren als onderdeel van het PR , dit vervangt geen schrijftests maar elimineert gegenereerde bestanden uit het verslag van de dekking.
Myblog