2009-11-05 5 views
1

Donc je commence à écrire une bibliothèque de classe de méthodes utiles que j'ai écrites et ramassées au fil des ans, je vais commencer avec deux exemples de code, puis poser mes questions spécifiques:Comment démarrer avec Unit Testing? Question n00b totale, des pensées?

Je voudrais aussi tiens à faire l'argument que c'est pas une copie de certains des autres, "où puis-je commencer des questions de test unit."

Vérifiez la connectivité réseau (pas Internet, juste netwok)

public static Boolean IsNetworkConnected() 
    { 
     Boolean ret = false; 
     try 
     { 
      String HostName = System.Net.Dns.GetHostName(); 
      System.Net.IPHostEntry thisHost = System.Net.Dns.GetHostEntry(HostName); 
      String thisIpAddr = thisHost.AddressList[0].ToString(); 

      ret = thisIpAddr != System.Net.IPAddress.Parse("127.0.0.1").ToString(); 
     } 
     catch (Exception) 
     { 
      return false; 
     } 
     return ret; 
    } 

Et ma méthode de IsValiEmail (note, je n'ai pas écrit le regex)

public const String MatchEmailPattern = @"^(([\w-]+\.)+[\w-]+|([a-zA-Z]{1}|[\w-]{2,}))@" 
     + @"((([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\." 
     + @"([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])){1}|" 
     + @"([a-zA-Z]+[\w-]+\.)+[a-zA-Z]{2,4})$"; 


    public static bool IsValidEmail(string email) 
    { 
     if (email != null && email != string.Empty) 
      return Regex.IsMatch(email, MatchEmailPattern); 
     else 
      return false; 
    } 

Alors, ma question est de savoir comment faire Je vérifie que ces méthodes fonctionnent réellement, évidemment je veux commencer Unit Testing plus de mon code qui est plus complexe que ces exemples rapides. Je voudrais éviter d'installer des outils/frameworks supplémentaires si possible, mais je suis ouvert à vos idées.

mise à jour

devrait ce nouveau code de test d'unité (via les liens déjà posté) vivent? Dans la même assemblée? Un assemblage séparé?

Répondre

5

Découvrez le livre. The art of unit testing. La page wiki a beaucoup de bonnes ressources.

+0

+1. C'est un excellent livre de démarrage. – TrueWill

+0

+1 D'accord, et aussi un bon livre une fois que vous avez les bases, mais que vous voulez obtenir une suite de tests maintenable. – Mathias

+0

à peu près tout ce que roy osherove fait avec les tests unitaires est l'or! –

3

NUnit est probablement le cadre de test unitaire qui répond le mieux à vos besoins. Jetez un oeil à leur tutoriel quick start.

0

Vous pouvez commencer avec Junit, et vous pouvez utiliser un cadre de simulation (comme mockito) pour simuler des parties de votre code qui impliquent l'utilisation de Frameworks. Mais pour utiliser un cadre fictif, vous devez isoler une partie de votre code qui utilise un cadre externe dans une classe ou une interface séparée et utiliser un cadre fictif pour simuler la dépendance externe.

Dans votre code, vous utilisez également un opérateur "==" pour la comparaison de chaînes.


ret = thisIpAddr != System.Net.IPAddress.Parse("127.0.0.1").ToString();

Mais vous devez utiliser la méthode "égal" pour cordes comparision.

+3

Ceci est une question C#, pas une question Java. – TrueWill

+0

OOPS, comme vous l'avez souligné j'ai complètement manqué que ce n'est pas une question Java. Merci pour la correction – sateesh

0

D'accord avec Asaph, NUnit est le cadre le plus largement utilisé. Cela étant dit, si vous ne voulez pas utiliser de frameworks supplémentaires, VStudio Professional dispose d'outils de tests unitaires.
Je recommande de placer vos tests dans la même solution, dans un projet séparé, de sorte que vous n'ayez pas à expédier vos tests avec votre assemblée.
Votre premier cas n'est en fait pas le plus évident à tester, car votre classe a une dépendance externe qui sera difficile à répliquer: évidemment, si la classe teste que la machine est connectée, le résultat lui-même dépendra de l'état de la machine. En d'autres termes, si le test échoue, vous ne savez pas si c'est à cause de votre code, ou à cause de quelque chose qui échappe au contrôle de votre code. Ces situations sont généralement abordées par Mocking, mais ce n'est probablement pas la chose la plus facile à démarrer si vous êtes novice en tests unitaires!
Le deuxième cas est un meilleur point de départ; Essentiellement, vous devrez créer des adresses valides et invalides, et les transmettre à votre méthode, et vérifier que le résultat est ce qu'il devrait être.

1

Pour le premier bit de code, vous voudrez vous pencher sur l'introduction de l'Inversion de Dépendance afin que vous puissiez simuler ces dépendances et contrôler quand la méthode retourne true et quand elle retourne false. Pour la seconde, je créerais des tests NUnit qui passeraient chacun dans des emails valides ou invalides et vérifieraient que le résultat correct est retourné. Pour ce faire, créez un test par e-mail que vous souhaitez tester ou créez un test en tant que test de ligne (ce qui est possible avec NUnit 2.5+). En ce qui concerne l'endroit où les tests devraient vivre ... eh bien, ils peuvent vivre dans le même assemblage ou dans un autre assemblage ... La meilleure pratique, pour l'instant, semble être de les mettre dans un assemblage séparé. Si vous avez un projet appelé MyProject, vous créez ensuite un projet pour vos tests unitaires appelés MyProject.Tests .... et en plus, il est bon de mettre vos tests d'intégration dans un autre assembly appelé MyProject.Integration.Tests.

2

Vous pouvez certainement effectuer des tests unitaires sans framework - créez simplement une application avec un bouton "test" qui exécute vos tests. Cependant, j'ai trouvé qu'il est beaucoup plus agréable d'utiliser un framework existant - Ils sont configurés pour vous permettre d'ajouter facilement des tests, voir le succès/l'échec, et exécuter des tests automatiquement. Nunit va bien, ou vraiment, n'importe quoi fera l'affaire. MSTest est OK, si vous avez une version de Visual Studio qui l'accompagne. IsValidEmail devrait être facile à tester: test avec null, "", un email valide, et un email invalide. Ensuite, mettez un chapeau noir et essayez d'infiltrer des déchets pernicieux dans: pouvez-vous le faire casser? Mais puisque cette fonction ne fonctionne que sur ses entrées, il est assez facile à tester.

IsNetworkConnected est plus difficile à tester. Vous appelez GetHostName et GetHostEntry et vous ne pouvez pas contrôler ce qu'ils retournent. Cela rend difficile la vérification de tous les modes possibles. Les tests unitaires exercent une forte pression sur vous pour séparer votre logique de votre récupération de données. Une option ici serait de passer dans IPHostEntry. Bien sûr, cela rendrait votre interception moins utile et en enverrait une partie à l'appelant.

Vous pouvez créer une fonction pour faire les appels à GetHostName et GetHostEntry pour vous, puis passer un délégué à la vraie dans votre application et un faux * dans votre test. À un moment donné, cette stratégie coûte plus cher qu'elle ne l'est en termes de valeur - vous devrez faire ce jugement vous-même et ne pas gaspiller d'efforts pour un travail qui ne produit pas de valeur.

* Les utilisateurs de la technique Mock Objects noteront que vous ne devez pas simuler GetHostName et GetHostEntry, puisque vous ne les possédez pas. Si vous avez un cadre moqueur et que vous souhaitez l'utiliser, n'hésitez pas; Juste ne vous méprenez pas en utilisant leurs outils en suivant leurs méthodes de conception.

2

Test IsNetworkConnected

McMillan Sean a raison dans sa réponse qu'il n'y a pas beaucoup d'un avantage dans la méthode IsNetworkConnected de test. Il n'encapsule pas beaucoup de logique mais seulement les dépendances qui ne valent pas la peine d'être abstraites. Cependant, supposons qu'il est important de tester cette méthode pour une raison quelconque.Ce qui suit est la façon dont je voudrais aller sur:

public static Boolean IsNetworkConnected(IIPAddressProvider ipAddressProvider) 
    { 
     Boolean ret = false; 
     try 
     { 
      IPAddress thisIpAddr = ipAddressProvider.GetIPAddressOFLocalHost(); 
      ret = thisIpAddr.ToString() != System.Net.IPAddress.Parse("127.0.0.1").ToString(); 
     } 
     catch (Exception) 
     { 
      return false; 
     } 
     return ret; 
    } 

Après avoir fait que j'écrire le test unitaire suivant:

  • Throw exception de la maquette de IIPAddressProvider
  • Retour Null IPAddress de le simulacre de IIPAddressProvider
  • Retour 127.0.0.1 du simulacre de IIPAddressProvider
  • Renvoyer IPAddress autre que 127.0.0.1 à partir du simulacre de IIPAddressPro
vider

Test IsValidEmail

Il y a une valeur définie dans les tests unitaires d'écriture pour cette méthode. Vous devez essayer les cas de test positifs, négatifs et limites. Les tests unitaires sont également des tests en boîte blanche. De votre méthode, il est clair que vous devez exercer sur pré-condition de la méthode et l'expression régulière tout en faisant des tests unitaires. L'important ici est d'exercer l'expression régulière. Il n'y a pas beaucoup de chemins de code dans la méthode. À mon avis, vous devez écrire les scénarios de cas de test mentionnés ci-dessus. En outre, certains outils tiers pour effectuer une validation d'expression régulière doivent être utilisés avant de l'utiliser dans votre code de production.

Lorsque le code de test doit être situé

À mon avis, il devrait toujours se trouver dans un ensemble différent du code de production. C'est le meilleur choix.

1

Certains cadres de tests unitaires supplémentaires peuvent être trouvés here.

Questions connexes