perri.to: Un méli-mélo de choses

Tester en go, avec go check

  2015-08-28


Avertissement : ceci est principalement destiné à servir de ma propre autodocumentation.

Tester en go est assez simple, comme vous pouvez le voir dans la documentation Une structure de base, un paquet simple :

Un fichier nommé sample.go

package sample

func sampleFunction(sampleSlice []string) {
    sampleSlice = append(sampleSlice, "called")
}

En ce qui concerne go, ceci est un paquet et si vous faites go build dessus, il compilera. Ajouter des tests à ce paquet est aussi simple qu’ajouter un fichier se terminant par _test.go Tout ce qui porte le nom mentionné ci-dessus sera interprété comme un fichier de test et donc compilé uniquement au moment des tests. À toutes fins pratiques, pendant les tests, votre fichier sera considéré comme faisant partie du paquet dont le nom est déclaré dans la section package du _test.go. Malheureusement, c’est là que s’arrête l’aide que go nous apporte pour faire des tests ; si vous lisez la documentation, vous trouverez qu’il n’existe pas d’outillage intégré pour des choses comme les assertions et les suites.

Pour pallier cette lacune, nous pouvons utiliser go check Go check ajoute la possibilité d’avoir des suites, des assertions et un ensemble de checks utiles.

La façon de brancher go check sur notre base de tests existante est simple :

Nous utilisons d’abord le concept ajouté de suites, qui se présentent sous la forme de structs tels que :

package sample

import (
    gc "gopkg.in/check.v1"
)

type aTestSuite struct {}

func (a *aTestSuite) TestingSomething(c *gc.C) {
    c.Assert(1, gc.Equals, 1)
}

Une suite est un struct et ses tests sont toutes ses méthodes dont le nom porte le préfixe Test ; en plus, nous avons des bonus comme les Fixtures et d’autres choses très pratiques (je vous encourage à lire le reste de la page).

Pour faire tourner une de ces suites, vous devez suivre deux étapes simples. 1 - enregistrer la suite en appelant : check.Suite() avec un pointeur vers une instance de votre suite. 2 - appeler le runner check.TestingT à l’intérieur d’une fonction préfixée par Test, ce qui nous garantit qu’elle sera exécutée par le test runner. Un conseil : n’appelez TestingT qu’une seule fois par binaire, quel que soit le paquet, sinon tout votre ensemble de suites tournera de nombreuses fois avec de possibles résultats inattendus.

Un exemple terminé ressemblerait à :

package sample

import (
    "testing"

    gc "gopkg.in/check.v1"
)

func TestAll (t *testing.T) { // This could have any Test* name
    gc.TestingT(t)
}
type aTestSuite struct {}

var _ := gc.Suite(&aTestSuite{})

func (a *aTestSuite) TestingSomething(c *gc.C) {
    c.Assert(1, gc.Equals, 1)
}