Während der Arbeit an einem Projekt mit dem Operator-sdk stellte ich fest, dass die Testabdeckung ziemlich niedrig war. Der Grund dafür war, dass aufgrund des Operator-SDK viele generierte Deepcopy-Dateien im Repo vorhanden waren.

Zuerst verwende ich das folgende Repo, um meinen Tests Farben für die Lesbarkeit hinzuzufügen

go get -u github.com/rakyll/gotest

 farbtests
Ich teste das pkg-Verzeichnis, das ich mit dem folgenden Befehl getestet habe

gotest -v -covermode=count -coverprofile=coverage.out ./pkg/...

Dadurch wird der Test ausgeführt und die Testabdeckung in eine Dateiabdeckung ausgegeben.out Sie können die Abdeckung lokal mit dem HTML-Flag überprüfen

go tool cover -html=coverage.out


Oder Sie können das func Flag verwenden, mit dem Sie die prozentuale Abdeckung der Funktionen in der CLI erhalten

go tool cover -func=coverage.out

Verfeinerung der Abdeckung

Da ich die generierten Dateien nie testen würde, entschied ich mich zu sehen, ob ich sie aus unserem Codeabdeckungsbericht entfernen könnte. Zuerst habe ich mir das go test -run Flag im folgenden Format angesehen.

gotest ./packagedirectory -run=testname

Ich fand, es hätte zu viel Wartung zu aktualisieren. Ich habe versucht, es mit Regex zu verwenden, um zu versuchen, alle Tests zu treffen, aber festgestellt, dass ich mit einem gierigen Regex-Ausdruck wie -run=^Test.+ alle Tests, aber auch alle Dateien treffen würde, damit ich wieder dort war, wo ich angefangen habe.

Da sich im folgenden Verzeichnis pkg/apis die generierten Deepcopy-Dateien befanden. Ich habe die Dateien, die ich getestet habe, von pkg / apis in ein Unterpaket namens types verschoben und meine Tests stattdessen nach Verzeichnis gefiltert. Mein Testbefehl sah also so aus

gotest -v -covermode=count -coverprofile=coverage.out ./pkg/controller/... ./pkg/providers/... ./pkg/resources/... ./pkg/apis/integreatly/v1alpha1/types/...

Dadurch werden die Tests in den oben aufgeführten Verzeichnissen ausgeführt und die Abdeckung aktualisiert.nur mit den Dateien in diesem Verzeichnis. Dies erhöhte meine Gesamtabdeckung um etwa 14%

CI / CD und Overalls

Wir verwendeten Travis für CI / CD und richteten Overalls mit der folgenden Konfiguration in .travis.yml ein.

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

Weitere Informationen zum Einrichten von -repotoken=$COVERALLS_TOKEN
Finden Sie im Goveralls Repo https://github.com/mattn/goveralls und https://docs.coveralls.io/go

Mit diesem Setup können wir dann unsere Abdeckung als Teil der PR überprüfen.

Mein Blog

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.