Skip to content

So ignorieren Sie generierte Dateien aus der Go-Testabdeckung

Lösung:

Sie könnten den generierten Code aus den Abdeckprofilen entfernen:

go test . -coverprofile cover.out.tmp
cat cover.out.tmp | grep -v "_generated.go" > cover.out
tool cover -func cover.out

Je nach eingesetzten Tools lässt sich dies problemlos in die Pipeline/Marke implementieren.

Die meisten Go-Tools arbeiten mit Paketen, da ein Paket selbst ein Einheit das kann in seiner Gesamtheit nützlich sein. Das Ausschließen von Dateien aus einem Paket kann das Paket leicht "brechen": Die ausgeschlossene Datei kann (entscheidenden) Paketinitialisierungscode enthalten oder sogar dazu führen, dass die restlichen Paketdateien nicht kompiliert werden.

go test ist keine Ausnahme: Es funktioniert auch auf Paketen. Es gibt keine Unterstützung aus erster Hand, um Dateien aus einem Paket auszuschließen.

Wenn Ihr Paket ohne die generierte Datei kompiliert und getestet werden kann, können Sie die Datei in einem anderen Paket generieren, und dann wird sie natürlich nicht in den (Abdeckungs-)Test Ihres Pakets aufgenommen.

Eine andere Möglichkeit, dies zu handhaben, besteht darin, es weiterhin im selben Paket/Ordner zu generieren und spezielle Build-Tags in den generierten Dateien zu verwenden, die Sie beim Ausführen des Abdeckungstests ausschließen können. Weitere Informationen zu Build-Tags finden Sie hier: Build-Einschränkungen und hier: Was ist der richtige Ansatz, um plattformspezifischen Code in Go zu kapseln?

Wenn die generierte Datei zum Kompilieren / Testen des Pakets benötigt wird, haben Sie immer noch eine Option: Verwenden Sie an intern Paket für die generierte Datei. Interne Pakete sind nur für den Paketbaum verfügbar, der auf der internal Ordner, was bedeutet, dass Sie alle Bezeichner in einem internen Paket exportieren können, stellt der Compiler sicher, dass sie nicht von "unbeabsichtigten" Parteien verwendet werden. Weitere Informationen zu internen Paketen finden Sie hier: Kann ich ein go-Paket in mehreren Quellverzeichnissen entwickeln?

Ziehen Sie auch die Option in Betracht, Tests für den generierten Code zu schreiben oder zu generieren, was ohnehin eine gute Praxis sein kann, damit Sie keine Tricks anwenden müssen, um sie von Abdeckungstests auszuschließen.

Ich verfolge die Wege, wie ich dieses Bedürfnis lösen konnte.

Durch Ausschließen von Verzeichnissen/Paketen

Da Sie zum Ausführen des Tests und Generieren des Covers die Pakete angeben, in denen der Befehl go test nach den Dateien aus diesem Paket suchen soll, werden diese automatisch ignoriert. Nach einem Beispiel

project
|_______/pkg/web/app 
|_______/pkg/web/mock -> It will be ignored.

# Command:   
$go test -failfast -tags=integration -coverprofile=coverage.out -covermode=count github.com/aerogear/mobile-security-service/pkg/web/apps

Sie kann jedoch nicht in allen Fällen angewendet werden. Im Fall von Dateien, die Mock-Routinen Ihrer Schnittstellen sind, kann es beispielsweise nicht gut funktionieren, da die Importe, die in den Dienst, Test und Mock erforderlich sind, wahrscheinlich in einem Zyklus erfolgen und in diesem nicht zulässig sind.

Durch die Verwendung von "_test" in den Namensdefinitionen

Wenn Sie Dateien ignorieren möchten, die in den Tests verwendet werden, dann machen Sie eine sinnvolle Verwendung _test am Ende des Namens. Zum Beispiel, my_service_mock_test.go. Die Dateien mit _test am Ende des Namens wird standardmäßig ignoriert.

Durch Entfernen aus der Cover-Datei wie folgt

go test . -coverprofile cover.out.tmp
cat cover.out.tmp | grep -v "_generated.go" > cover.out
tool cover -func cover.out

PS.: Ich konnte keinen Kommentar oder Tag finden, der sie ausschließen würde.

Click to rate this post!
[Total: 0 Average: 0]



Anderer Beitrag

Schreibe einen Kommentar

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