Pour charger ou ne pas charger les données pour les tests unitaires à partir de fichiers externes


17

Lors des tests unitaires, je me retrouve souvent à débattre de la quantité de données que j'alimente et j'attends de mes unités testées que je devrais inclure dans les fichiers de test réels.

Le compromis avec lequel je lutte constamment est:

  • Si une grande partie du test (en volume de code) se compose de données d'entrée et de sortie, il semble difficile de lire réellement le test, mais je peux facilement voir les entrées et sorties réelles.
  • Si je charge les données de test à partir de fichiers, je peux facilement tester un tas de variations sur une entrée de données possible, réutiliser facilement les données de test pour plusieurs tests, mais je dois laisser le code source pour regarder un autre fichier pour voir quelles sont exactement les entrées. .

L'un ou l'autre est-il un anti-modèle?


Quels types de données?
Jon Reid

@JonReid: Surtout du texte.
DudeOnRock

Réponses:


11

Pour répondre directement à votre question - non, je ne crois pas non plus que ce soit un anti-modèle lorsqu'il est utilisé correctement.

--- Réponse plus verbeuse ---

D'après mon expérience, je pense que cela dépend fortement de l'objectif de votre test. Voici la règle générale que j'ai utilisée dans le passé et cela m'a aidé à décider:

Testez-vous actuellement une petite unité de code? (Un vrai test unitaire)

Si oui, j'ai trouvé qu'il était beaucoup plus facile de créer les données à l'intérieur du test lui-même, car je peux voir ce qui est passé. Dans ces cas, je vais généralement chercher une bibliothèque de type Jasmine à utiliser car je trouve que il facilite la création et la maintenance des données de test. C'est une préférence personnelle - utilisez tout ce qui vous facilite la tâche.

Si non, vous testez probablement le système lui-même. Dans ces cas, je charge souvent des données à partir d'une source externe, pour les raisons suivantes:

  1. Ce test ne concerne pas la clarté du code pour les programmeurs (bien que cela soit toujours important - quelqu'un doit le maintenir), il s'agit d'exécuter suffisamment de types de données différents sur l'ensemble du système pour être raisonnablement sûr que cela fonctionne.
  2. Souvent, j'écrirai le code de plomberie pour charger et utiliser les données de test, mais les données elles-mêmes sont créées par quelqu'un d'autre (généralement un membre du personnel d'AQ dans mon cas). Ces personnes ne sont généralement pas des programmeurs, je ne peux donc pas m'attendre à ce qu'elles éditent du code.

Donc, réponse courte, cela dépend de ce que vous testez et pourquoi. Les deux approches sont utiles et ont leur place - choisissez celle qui convient le mieux à votre situation.


9

Je ne vois pas de compromis ici. Le code source est censé décrire des algorithmes, ou du moins une logique métier, pas de grandes quantités de données. Si vous écrivez une transformée de Fourier, vous voulez vérifier qu'une tonalité sinusale est correctement mappée à une seule crête, un son mélangé à plusieurs crêtes, etc., mais pour cela, il suffit complètement d'alimenter un fichier nommé sinus.wavdans la routine et de vérifier que la structure de sortie correspond à ce que vous attendez.

Bien sûr, techniquement, vous n'avez pas d'assurance immédiate qui sinus.wavcontient vraiment un ton sinusal, mais comme vous l'avez dit, la liste des 100 000 valeurs d'amplitude dans la source ne vous donne pas vraiment cela non plus - en fait, c'est pire , parce que vous peut au moins lire un fichier externe avec un lecteur audio pour vérifier, tandis que les valeurs de données enfouies dans le code source sont essentiellement impossibles à faire.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.