Question

Supposons que nous concevons un test de première classe Stack (TDD):

public class Stack<T> {
    private T[] elements = new T[16];
    private int size = 0;
    ...
}

Cette pile utilise une taille 16 tableau interne pour stocker ses éléments. Il fonctionnera bien jusqu'à ce que vous devez ajouter un élément 17. Comme je l'ai peut-être besoin d'un élément 17, j'ai décidé d'ajouter cette fonctionnalité à ma pile, donc je commencé à penser à ce nom que je pourrais donner à l'essai qui ferait doivent ajouter cette fonctionnalité. Ce sera le sujet de mon première question .

J'ai d'abord choisi quelque chose de la forme:

Should_Be_Able_To_Correctly_Increase_Its_Inner_Array_Size()

et

Should_Handle_More_Items_Than_The_Default_Internal_Array_Size()

mais après avoir réfléchi un peu, je suis venu à la conclusion que peut-être quelque chose comme ce qui suit serait plus qu'appropriée:

Should_Double_Its_Size_Every_Time_Its_Full()

Mon raisonnement devrait faire dans le premier cas, je dis que ce qu'il fait, mais pas quand. Dans le second, je dis quand ajouter d'autres articles, mais je déclare aussi que je pense à y parvenir (en interne), qui ne peut être correcte. À mon avis (je ne suis pas sûr que je ne me trompe pas), mes tests devraient les interactions possibles de mon SUT avec l'extérieur, et non sur la façon dont il est mis en œuvre en interne. Ai-je raison?

Il me semble que le 3e choix est le meilleur, car il indique clairement ce qu'il fait (croître en taille - en fait, le double de sa taille), quand il le fait (quand il est plein) et ne me pas de liens à une mise en œuvre spécifique (je pourrais peut-être souhaitez changer à un ArrayList interne!).

Ce qui me conduit à mon deuxième question : En supposant que je ne les tests unitaires pour ma classe de pile qui utilise en interne un tableau et il fonctionne très bien et comme prévu, si mes tests restent intacts si je Ensuite, pour factoriser et changer le tableau à un ArrayList ou tout autre type de structure de données? Ou si les essais de quelque manière que refléter le fait que? Je suppose que non, mais je ne suis pas sûr.

Était-ce utile?

La solution

  

À mon avis (je ne suis pas sûr que je suis   correct), mes tests si le possible   interactions de mon SUT avec le   extérieur, et non sur la façon dont il est   mis en œuvre en interne. Ai-je raison?

Vous avez raison. Si vous modifiez l'implémentation interne de votre classe, les tests unitaires devraient rester les mêmes. Si vous quoi que ce soit à découvert un nouveau externe, vous devez créer de nouveaux tests unitaires pour tenir compte de ces changements.

Rappelez-vous que lorsque vous concevez votre classe, vous ne voulez pas exposer tout ce qui indique la façon dont il a été mis en œuvre. les membres du public de la classe indiquent comment interagir avec elle, maintenant comment cela fonctionne dans les coulisses.

Autres conseils

Je ne sais pas comment vous pouvez le test de la liste interne ou la taille du tableau par un test unitaire. Vous ne pouvez pas y accéder via l'interface de la pile. Les tests unitaires sont pour tester des contrats externes. Si vous voulez tester les détails de mise en œuvre alors essayez quelque chose d'autre.

La réponse à votre 2ème question est oui, le test doit encore passer, si elle est un test unitaire.

Demandez-vous ce que vous êtes prêt à engager pour cette classe.

Avez-vous ou les consommateurs de classe se soucient vraiment si les doubles de capacité, par incréments d'un, ou incréments par mille? Si oui, vous devez modifier l'interface afin de pouvoir préciser la stratégie utilisée pour augmenter la capacité:

public Stack<T>(CapacityGrowthStyle capacityGrowthStyle) { ... }

Dans le cas contraire, il suffit d'écrire des tests pour documenter la capacité et le laisser à ce (où X ci-dessous est la limite de votre structure de données sous-jacentes):

[Test]
public void Can_Handle_X_Items() { ... }

[Test]
[ExpectedException(typeof(InvalidOperationException))]
public void Cannot_Handle_More_Than_X_Items() { ... }

Je vais répondre à votre deuxième question similaire: vos tests ne devraient refléter la structure de données sous-jacentes si les utilisateurs de votre classe se soucier

.

Je ne sais pas si vous devrait tester la liste interne ou la taille du tableau grâce à un test unitaire, puisque vous ne pouvez pas y accéder via l'interface de la pile. Il y a plusieurs façons de mettre en œuvre une pile, une bonne et une mauvaise, mais comme Bernard a déclaré, ce sont les mises en œuvre internes. Les tests unitaires sont conçus pour tester la fonctionnalité vers l'extérieur.

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