golang test répertoire temp
J'ai une fonction simple qui analyse un fichier de configuration JSON. Je veux écrire un test qui utilise une partie de l'échantillon statique des fichiers de configuration et d'analyse, ou crée les échantillons pendant le test et tente de les analyser.
Ce n'est pas tout à fait nécessaire à la question, mais voici le code de base:
//config.go
//...(package,imports)...
//Overall settings - corresponds to main.conf
type MainSettings struct {
//stuff
}
//Load main.conf from the specified file path
func LoadMainSettings(path string) (*MainSettings, error) {
b, err := ioutil.ReadFile(path)
if err != nil { return nil, err }
r := &MainSettings{}
err = json.Unmarshal(b, r)
if err != nil { return nil, err }
return r, nil
}
et le test:
//config_test.go
func TestLoadMainSettings(t *testing.T) {
//possibly generate some example config files,
//or use static samples packaged with the source
s, err := LoadMainSettings("conf/main.conf") //<-- what should this path be??
if err != nil { panic(err) }
//more sanity checking...
}
Cela dit, mes questions spécifiques:
- Est-il un bon endroit pour la statique des actifs (comme l'exemple de fichiers de configuration) qui ne sont applicables qu'aux tests?
- Au cours de l'exécution d'un test est-il bon (cross platform, obtient nettoyé avec un 'go " propre") emplacement pour écrire des fichiers temporaires?
(Note: j'ai exécuté la plupart de mes trucs sur Linux pour la mise en scène et de la production et de Mac locales de la dev - donc, à l'aide de /tmp/temp dir pour les tests fonctionne pour moi dans la pratique. Mais je me demandais si il ya une meilleure façon...)
EDIT: Fini par l'utilisation de cette approche pour le test:
f, err := ioutil.TempFile("", "testmainconf")
if err != nil { panic(err) }
defer syscall.Unlink(f.Name())
ioutil.WriteFile(f.Name(), []byte("{...sample config data...}"), 0644)
s, err := LoadMainSettings(f.Name())
Mais la suggestion d'autres de faire LoadMainSettings accepter une io.Reader
au lieu d'un string
est aussi une bonne idée.
io.Reader
directement? Si oui, alors votre cas de test n'aurez pas besoin de dépendre du système de fichiers, vos tests peuvent utiliser strings.NewReader
à donner le contenu de test dans le test lui-même.Hm - c'est une idée intéressante... un peu plus lourd pour l'appelant, mais sinon, oui, cela fonctionne dans ce cas.
Il ne devrait pas être plus difficile pour l'appelant. Un fichier est un
io.Reader
déjà.Vrai - mais une chaîne de caractères n'est pas, mais je reçois votre point de vue. Je suis d'accord c'est une bonne idée.
juste pour mémoire, si l'aide d'une fonction avec un paramètre path est plus pratique, on peut écrire une fonction publique avec un paramètre de chemin, et de faire appel à un privé func de l'intérieur avec un ar.Lecteur (avec le fichier ouvert). Puis test interne uniquement la touche func. L'autre est juste un wrapper, il n'est de compilateur "testé".
OriginalL'auteur Brad Peabody | 2013-09-29
Vous devez vous connecter pour publier un commentaire.
Juste pour comparer vs ce que vous avez avec
ioutil.TempDir
, voici à quoi ressemble avecio.Reader
:Plus précisément, nous avons changer l'argument à partir d'un
path
chaînesrc
io.Reader
exemple, et on remplace laioutil.ReadFile
avec unioutil.ReadAll
.Le cas de test que vous avez écrit, puis finit par être un peu plus court, précisément parce que nous pouvons nous passer avec les opérations sur les fichiers:
une autre chose: je suppose que je suis en comparant cela à mon expérience avec Java où vous avez généralement un répertoire de sortie créé dans le cadre du test JUnit suite de l'exécution et, souvent, elle ne contient pas seulement les résultats des tests, mais un temp dir où test articles connexes peut aller. Et vous savez que, lorsque le "propre" est exécuté sur le construire, il va tous s'en aller. Rend les choses simples. Me demandais juste s'il était le concept correspondant à ce qui existait en aller - mais comme je le vois (et vous êtes de pointage), c'est probablement mieux de simplement aborder le problème différemment.
Yup. Les fichiers temporaires sont aussi très bien. Vous les voyez dans la "testdata" sous-répertoire de formules telles que golang.org/src/pkg/net/testdata. Donc pas difficile et rapidement la règle ici: parfois, il est logique d'avoir vos données de test dans les fichiers, et parfois, il est logique de les intégrer dans les tests. Comme en Java (où vous voyez
java.io.InputStream
etjava.io.Reader
partout), vous verrez que la majorité des Go code fonctionne avec génériqueio.Reader
, donc je voulais juste assurez-vous qu'il a été documenté comme une approche à votre question quelque part. 😛Amen et bravo!
OriginalL'auteur dyoo
Vous pouvez utiliser ioutil.TempDir ou TempFile de la même package.
OriginalL'auteur Ask Bjørn Hansen