web-dev-qa-db-fra.com

Comment tester une fonction non exportée (privée) dans go (golang)?

J'étais intéressé par la création d'un test unitaire pour les "fonctions (privées) non exportées" dans go. Cependant, il est très difficile de créer des tests unitaires dans le package de test car je dois les rendre "publics". Ce qui en fin de compte, défait le fait qu'ils soient privés. Le fait est que ces fonctions d'aide aident à se modulariser et maintenant qu'elles sont modulaires, il serait agréable de pouvoir créer des tests unitaires pour elles sans les mettre à la disposition de tout le monde sauf le package de test, Nice ce ne sont pas des fonctions auxquelles il faut accéder ou utilisé par quiconque, sauf la suite de tests ou le package lui-même.

Aucune suggestion? Est-il possible de niquement exporter vers son propre package et 1 package supplémentaire ou quelque chose de ce genre en cours?

40
Charlie Parker

créer un fichier de test dans le package

library_test.go

package mypkg

func TestPrivateStruct(t *testing.T){
  pf := private{ "Private Field" }
  ....
}

library.go

package mypkg

type private struct {
  privateField string
}

go test mypkg -v exécutera vos tests avec votre structure privée

44
fabrizioM

Tout d'abord, vous pouvez avoir les deux types de tests au même emplacement que votre package en utilisant le nom du package pour les tests internes (par exemple mypkg ) et en utilisant le même nom du package avec "_test" ajouté pour les tests "externes" (par exemple mypkg_test ). Les deux types de tests doivent être dans des fichiers dont le nom se termine par "_test.go".

MAIS, tout l'intérêt des tests unitaires est de tester "l'interface externe" (c'est-à-dire les fonctions publiques) de votre package. C'est-à-dire que les tests unitaires doivent toujours être des tests de "boîte blanche" (voir Test de boîte blanche ). De cette façon, vous pouvez refactoriser votre code et vos tests ne se casseront pas.

Bien sûr, vous souhaitez parfois vérifier la cohérence interne, ce qui n'est pas possible via "l'interface externe". Pour cela, j'ai trouvé des affirmations inestimables. Une autre possibilité serait d'ajouter des fonctions publiques de "diagnostic" avec des noms qui indiquent qu'elles ne sont pas destinées à un usage normal.

6