web-dev-qa-db-fra.com

Comment ignorer les fichiers générés à partir de la couverture du test Go

J'ai un fichier généré dans mon package avec DO NOT EDIT en haut. J'exécute des tests pour mon package avec go test -coverprofile=cover.out <package>. Cela crée un profil de couverture et affiche le pourcentage de couverture totale. Mais il inclut également les fichiers générés lors du calcul de la couverture. Existe-t-il un moyen d'ignorer les fichiers générés dans le calcul de la couverture?

14
Rohanil

La plupart des outils Go fonctionnent sur des packages, car un package lui-même forme une unité qui peut être utile dans son intégralité. L'exclusion de fichiers d'un package peut facilement "casser" le package: le fichier exclu peut contenir le code d'initialisation (crucial) du package ou peut même provoquer la compilation des fichiers de package restants.

go test ne fait pas exception: il fonctionne également sur les packages. Il n'y a pas de support direct pour exclure des fichiers d'un package.

Si votre package peut être compilé et testé sans le fichier généré, vous pouvez choisir de générer le fichier dans un package différent, puis il ne sera pas inclus naturellement dans le test (couverture) de votre package.

Une autre façon de gérer cela serait de toujours le générer dans le même package/dossier et d'utiliser des balises de construction spéciales dans les fichiers générés, que vous pouvez exclure lors de l'exécution du test de couverture. Vous pouvez en savoir plus sur les balises de build ici: Build Constraints , et ici: Quelle est la bonne approche pour encapsuler le code spécifique à la plate-forme dans Go?

Si le fichier généré est nécessaire pour compiler/tester le package, alors vous avez toujours une option: utilisez un package internal pour le fichier généré. Les packages internes ne sont disponibles que dans l'arborescence de packages enracinée dans le dossier internal, ce qui signifie que vous pouvez exporter tous les identifiants dans un package interne, le compilateur garantit qu'ils ne seront pas utilisés par des parties "non intentionnelles". Vous pouvez en savoir plus sur les packages internes ici: Puis-je développer un package go dans plusieurs répertoires source?

Considérez également l'option d'écrire ou de générer un test pour le code généré, ce qui peut être une bonne pratique de toute façon, de sorte que vous n'auriez pas à utiliser des astuces pour les exclure des tests de couverture.

5
icza

Vous pouvez retirer le code généré des profils de couverture:

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

Selon les outils utilisés, cela peut être implémenté facilement dans le pipeline/make.

9
Christian

En suivant les moyens que j'ai pu résoudre ce besoin.

En excluant les dirs/paquets

Étant donné que pour exécuter le test et générer la couverture, vous spécifierez les packages dans lesquels la commande go test devrait rechercher les fichiers de ce package seront automatiquement ignorés. Suivre un exemple

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

Cependant, il ne peut pas être appliqué dans tous les cas. Par exemple, dans le cas où les fichiers sont des routines factices de vos interfaces, cela peut ne pas fonctionner très bien car les importations qui sont requises dans le service, test et simulation seront probablement dans un cycle et dans ce cas non autorisées.

En utilisant "_test" dans les définitions de nom

Si vous souhaitez ignorer les fichiers qui sont utilisés dans les tests, utilisez alors le sens _test à la fin du nom. Par exemple, my_service_mock_test.go. Les fichiers avec _test à la fin du nom sera ignoré par défaut.

En supprimant du fichier de couverture comme suit

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

PS: Je n'ai pas trouvé de commentaire ou de tag qui les exclurait.

1
Camila Macedo