Question

J'écris actuellement une mini-application simple basée sur une minuterie en C# qui effectue une action n fois toutes les k secondes.
J'essaie d'adopter un style de développement basé sur les tests, mon objectif est donc de tester unitairement toutes les parties de l'application.

Donc, ma question est :Existe-t-il un bon moyen de tester unitairement une classe basée sur un minuteur ?

Le problème, à mon avis, est qu'il existe un grand risque que les tests prennent trop de temps à s'exécuter, car ils doivent attendre un certain temps pour que les actions souhaitées se produisent.
Surtout si l'on veut des données réalistes (secondes), au lieu d'utiliser la résolution temporelle minimale autorisée par le framework (1 ms ?).
J'utilise un objet fictif pour l'action, pour enregistrer le nombre de fois que l'action a été appelée et pour que l'action ne prenne pratiquement pas de temps.

Était-ce utile?

La solution

Ce que j'ai fait, c'est se moquer de la minuterie, ainsi que de l'heure actuelle du système, afin que mes événements puissent être déclenchés immédiatement, mais en ce qui concerne le code testé, le temps écoulé était de quelques secondes.

Autres conseils

Je pense que ce que je ferais dans ce cas, c'est tester le code qui s'exécute réellement lorsque le minuteur tourne, plutôt que la séquence entière.Ce que vous devez réellement décider, c'est s'il vaut la peine de tester le comportement réel de l'application (par exemple, si ce qui se passe après chaque tick change radicalement d'un tick à l'autre), ou si cela est suffisant (c'est-à-dire , l'action est la même à chaque fois) pour simplement tester votre logique.

Puisqu'il est garanti que le comportement du timer ne changera jamais, soit il fonctionnera correctement (c'est-à-dire que vous l'avez correctement configuré), soit il ne fonctionnera pas ;il semble que ce soit un effort inutile d'inclure cela dans votre test si vous n'en avez pas réellement besoin.

Je suis d'accord avec Danny dans la mesure où il est probablement logique, du point de vue des tests unitaires, d'oublier simplement le mécanisme de minuterie et de simplement vérifier que l'action elle-même fonctionne comme prévu.Je dirais également que je ne suis pas d'accord dans la mesure où c'est un effort inutile d'inclure la configuration de la minuterie dans une suite de tests automatisés.Il existe de nombreux cas extrêmes lorsqu'il s'agit de travailler avec des applications de chronométrage et il est très facile de créer un faux sentiment de sécurité en testant uniquement les éléments faciles à tester.

Je recommanderais d'avoir une suite de tests qui exécutent le chronomètre ainsi que l'action réelle.Cette suite prendra probablement un certain temps à s'exécuter et ne sera probablement pas quelque chose que vous exécuterez tout le temps sur votre ordinateur local.Mais configurer ce genre de choses sur une version automatisée nocturne peut vraiment aider à éliminer les bogues avant qu'ils ne deviennent trop difficiles à trouver et à corriger.

En bref, ma réponse à votre question est de ne pas vous soucier d'écrire quelques tests qui prennent beaucoup de temps à s'exécuter.Testez unitairement ce que vous pouvez et faites en sorte que cette suite de tests s'exécute rapidement et souvent, mais assurez-vous de compléter cela avec des tests d'intégration qui s'exécutent moins fréquemment mais couvrent une plus grande partie de l'application et de sa configuration.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top