2010-08-04 12 views
2

Comment normalisez-vous les aspects de votre application qui doivent accéder aux variables système du système d'exploitation? Par exemple, mon application doit être en mesure de récupérer correctement le nom d'utilisateur actuellement connecté du système d'exploitation.Comment utiliser l'application TDD pour extraire le nom d'utilisateur de l'environnement système

Je TDD une fonction qui fait cela, et il est appelé:

string getUserNameFromSystemEnvironment(); 

Le problème que j'ai est:

Je suis en cours d'exécution du test sur ma machine, donc je sais ce que le le nom d'utilisateur est (par exemple FooBar). Je TDD getUserNameFromSystemEnvironment() par codage en dur FooBar dans mon test comme.

EXPECT_EQ(getUserNameFromSystemEnvironment(), "FooBar");

Il est clair que ce test fonctionne bien sur ma machine, mais pas sur d'autres. Pour le faire tourner bien sur
d'autres, cependant, je devrais utiliser getUserNameFromSystemEnvironment(). Mais alors, que les défaites genre de l'objet du test parce que nous aurons:

EXPECT_EQ(getUserNameFromSystemEnvironment(), 
      getUserNameFromSystemEnvironment()); 

Toutes les idées?

Répondre

2

Assurez-vous simplement qu'une valeur revient, vous n'avez pas toujours besoin de savoir quelle est la valeur exacte.

  • Vérifiez que le type est une chaîne.
  • Vérifiez que ce n'est pas nul ou vide.

Les tests n'ont pas besoin d'être parfaits à 100%, ils doivent juste augmenter votre confiance dans le code.

+0

"Les tests n'ont pas besoin d'être 100% parfaits" <- merci pour cet aperçu. Je n'y ai jamais pensé de cette façon avant. – sivabudh

5

Si vous voulez vérifier cela, vous devrez configurer un simulacre. Créez une interface qui renvoie l'ID utilisateur, une implémentation qui appelle getUserNameFromSystemEnvironment() et un simulateur qui renvoie la chaîne que vous lui avez renvoyée.

Mais ce n'est pas vraiment ce que vous voulez faire. Si vous essayez de tester getUserNameFromSystemEnvironment(), vous testez efficacement une fonction du système d'exploitation. Vous n'avez pas besoin de tester le code d'autres personnes. Au lieu de cela, mettez getUserNameFromSystemEnvironment() dans une interface, et simulez cela pour d'autres parties de votre système. Ensuite, par exemple, pour tester LoginValidator, transmettez un modèle qui renvoie le nom d'utilisateur "Foobar" et vérifiez qu'il valide la connexion. Ajoutez ensuite un test qui renvoie un nom d'utilisateur qui ne doit pas valider et vérifiez qu'il ne le laisse pas entrer.

+1

+10 si je le pouvais. Tout si évident quand vous le lisez écrit si clairement. Toucher divers aspects du test. * Ne pas tester le code d'autres personnes. Écrivez votre code de telle manière qu'il puisse facilement être raillé. * –