2011-06-08 4 views
8

Je suis un peu confus au sujet des tests unitaires. Je vois la valeur dans des choses comme les tests automatisés. Je pense que peut-être un bon exemple serait la meilleure façon de m'aider à comprendre. Disons que j'ai une fonction de recherche binaire que je veux tester. Maintenant, dans les tests, je voudrais savoir des choses comme: Est-ce que la recherche trouve le premier élément, le dernier élément et d'autres éléments? Est-ce que la recherche compare correctement les caractères Unicode. Est-ce que la recherche gère les symboles et autres caractères "douloureux". Est-ce que les tests unitaires couvriraient cela, ou est-ce que je l'ai manqué? Comment écririez-vous des tests unitaires pour ma recherche binaire?Expliquer les tests unitaires s'il vous plaît

function search(collection, value){ 
var start = 0, end = collection.length - 1, mid; 
while (start <= end) { 
    mid = start + ((end - start)/2); 
    if (value == collection[mid]) 
    return mid; 
    if (collection[mid] < value) 
    end = mid - 1; 
    else 
     start = mid + 1; 
} 
return mid; 
} 

Le code de pseudo pour les tests unitaires serait adorable.

Ainsi, nous pourrions avoir:

function testFirst(){ 
var collection = ['a','b','c','x','y','z'],first = 'a', findex = 0; 
assert(seach(collection,first),findex); 
} 
function testLast(){ 
var collection = ['a','b','c','x','y','z'], last = 'z', lindex = 5; 
assert(seach(collection,last),lindex); 
} 

Répondre

2

Vous avez raison de vos attentes en matière de tests unitaires; Il s'agit surtout de valider et de vérifier le comportement attendu.

Une valeur Je pense que beaucoup de gens manquent de tests unitaires, c'est que sa valeur augmente avec le temps. Quand j'écris un morceau de code, et que j'écris un test unitaire, j'ai simplement testé que le code fait ce que je pense qu'il devrait faire, qu'il ne manque pas de quelque façon que ce soit que j'ai choisi de vérifier, etc. les choses, mais elles ont une valeur limitée, car elles expriment la connaissance que vous avez du système à ce moment-là; ils ne peuvent pas vous aider avec des choses que vous ne connaissez pas (y a-t-il un bug sournois dans mon algorithme que je ne connais pas et que je ne pensais pas tester?).

La valeur réelle des tests unitaires, à mon avis, est la valeur qu'ils gagnent au fil du temps. Cette valeur prend deux formes; valeur de la documentation et valeur de validation. La valeur de la documentation est la valeur du test unitaire indiquant "c'est ce que l'auteur du code attendait de ce bit de code". Il est difficile d'exagérer la valeur de ce genre de chose; Quand vous avez été sur un projet qui a une grande partie de code hérité sous-documenté, laissez-moi vous dire, ce genre de valeur de la documentation est comme un miracle.

L'autre valeur est celle de la validation; Comme le code vit dans les projets, les choses sont réécrites, changées et décalées.Les tests unitaires fournissent la validation que le composant que vous pensiez fonctionner d'une certaine manière continue de fonctionner de cette manière. Cela peut être inestimable pour aider à trouver des erreurs qui se glissent dans les projets. Par exemple, le changement d'une solution de base de données peut parfois être transparent, mais parfois, ces changements peuvent provoquer des changements inattendus dans le fonctionnement de certaines choses; Les tests unitaires des composants qui dépendent de votre ORM peuvent détecter des changements subtils critiques dans le comportement sous-jacent. Cela devient vraiment utile quand vous avez un morceau de code qui fonctionne parfaitement depuis des années à la fois, et personne ne pense à considérer son rôle potentiel dans un échec; ces types de bugs peuvent prendre TRES longtemps à trouver, car le dernier endroit où vous allez regarder est dans le composant qui a été solide comme le roc pendant très longtemps. Les tests unitaires fournissent la validation de cette "solidité de roche".

3

Non, vous n'êtes pas le manquer, c'est ce que les tests unitaires est conçu pour vous dire. Vous avez la bonne idée en testant les bonnes et mauvaises entrées, les cas de bords, etc. Vous avez besoin d'un test pour chaque condition. Un test établira toutes les conditions préalables, puis affirmera que votre calcul (ou quoi que ce soit) correspond à vos attentes.

2

Oui, c'est à peu près tout. Chacune de ces questions que vous posez pourrait être utilisée comme test. Pensez au test unitaire en trois étapes. Définissez des conditions préalables, exécutez du code "en cours de test" et rédigez une affirmation qui documente vos attentes.

Dans votre cas, la configuration de 'collection' avec des valeurs particulières (ou aucune valeur) définit les conditions préalables.

L'appel de votre méthode de recherche avec un paramètre particulier exécute le code testé.

Vérifiez que la valeur renvoyée par votre méthode correspond à ce que vous attendez de l'étape d'assertion. Donnez à ces trois choses un nom qui décrit ce que vous essayez de faire (DoesTheSearchMethodFailIfCollectionIsEmpty) et voila vous avez un test unitaire.

Questions connexes