La programmation consiste Ă gĂ©nĂ©rer un code qui effectue les opĂ©rations prĂ©vues. Nous avons prĂ©cĂ©demment traitĂ© des erreurs qui devaient ĂȘtre corrigĂ©es pendant l'Ă©criture (erreurs de compilation) ainsi que d'autres qui apparaissent pendant l'exĂ©cution. Allons plus loin pour nous assurer que vos fonctions marchent correctement et comme prĂ©vu. Pour ce faire, vous devez effectuer des tests sur votre code.
Il existe deux moyens de tester vos fonctions :
Ăcrire des fonctions de test
Utiliser des processus automatisés
Les fonctions de test sont un ensemble de fonctions destinées à tester les fonctions principales de l'application. Par exemple, si vous avez une classe qui fait des calculs simples, vous pouvez définir quelque chose comme ceci :
class MathMagiques
{
public static int Somme(int a, int b)
{
return a + b;
}
public static int Soustraction(int a, int b)
{
return a - b;
}
}Vous pouvez ensuite écrire une fonction pour la tester :
// Tester la somme
if (MathMagiques.Somme(1, 5) == 6)
{
Console.WriteLine("La somme est correcte");
}
else
{
Console.WriteLine("La somme est incorrecte");
}
// Tester la soustraction
if (MathMagiques.Soustraction(10, 8) == 2)
{
Console.WriteLine("La soustraction est correcte")
}
else
{
Console.WriteLine("La soustraction est incorrecte");
}Ce code paraĂźt fonctionnel, vous devriez obtenir des rĂ©sultats corrects. Supposons maintenant (simple supposition, vraiment đ) que vous ayez fait une erreur dans l'implĂ©mentation des fonctions de la classe en inversant les nombres  a et  b :
class MathMagiques
{
public static int Somme(int a, int b)
{
return b + a;
}
public static int Soustraction(int a, int b)
{
return b - a;
}
}ExĂ©cutez ensuite les mĂȘmes tests :
// Tester la somme
if (MathMagiques.Somme(1, 5) == 6)
{
Console.WriteLine("La somme est correcte");
}
else
{
Console.WriteLine("La somme est incorrecte");
}
// Tester la soustraction
if (MathMagiques.Soustraction(10, 8) == 2)
{
Console.WriteLine("La soustraction est correcte");
}
else
{
Console.WriteLine("La soustraction est incorrecte");
}Dans cette situation, la fonction  Somme ne sera pas affectĂ©e. Calculer  a + b ou  b + a revient au mĂȘme.
Mais la fonction  Soustraction va gĂ©nĂ©rer un rĂ©sultat complĂštement erroné ! đ±
Dans la plupart des cas, les fonctions que vous devrez tester prĂ©senteront des comportements plus complexes, mais mĂȘme avec cet exemple simple, vous pouvez voir qu'il est facile de faire une erreur et qu'il faut effectuer plusieurs tests diffĂ©rents pour la repĂ©rer.
En fait, on commet plus facilement des erreurs banales lorsqu'on est trop sĂ»r de soi. Voici un scĂ©nario plausible : vous avez Ă©crit votre fonction  Somme en indiquant  b + a au lieu de  a + b . Vous l'avez testĂ©e et elle a bien fonctionné ! Vous avez ensuite copiĂ© le code de la fonction  Somme , remplacĂ©  + par  - et poursuivi votre dĂ©veloppement sans faire d'autre test. Vous Ă©tiez sĂ»r et certain que cela fonctionnerait, car la seule diffĂ©rence entre les deux fonctions est l'opĂ©rateur mathĂ©matique. Malheureusement, ça ne marche pas toujours. C'est pourquoi il est extrĂȘmement important de faire des tests, quelle que soit la mĂ©thode que vous utilisez !
Vous crĂ©ez ici du code auquel les utilisateurs n'auront pas recours dans le dĂ©roulement normal de l'application. Par consĂ©quent, il est conseillĂ© de sĂ©parer ce code du code principal. Une façon de le faire est de dĂ©dier une section d'une classe au test. De cette façon, il peut facilement ĂȘtre repĂ©rĂ© et supprimĂ©.
Vous pouvez Ă©galement placer le code de test dans des fichiers sĂ©parĂ©s afin qu'ils puissent ĂȘtre repĂ©rĂ©s et supprimĂ©s. Assurez-vous que votre code de test est facilement identifiable. Pour cela, vous pouvez utiliser des mots qui sont naturellement associĂ©s aux tests, comme test, tmp, factice, etc. Reprenons notre exemple de calcul pour organiser le code de test en fonctions :
public static void TestSomme()
{
if (MathMagiques.Somme(1, 5) == 6)
{
Console.WriteLine("La somme est correcte");
}
else
{
Console.WriteLine("La somme est incorrecte");
}
}
public static void TestSoustraction()
{
if (MathMagiques.Soustraction(10, 8) == 2)
{
Console.WriteLine("La soustraction est correcte");
}
else
{
Console.WriteLine("La soustraction est incorrecte");
}
}Ensuite, il suffit d'appeler les fonctions de test :
// Tester la somme
MathMagiques.TestSomme();
// Tester la soustraction
MathMagiques.TestSoustraction();Cette approche est utile dans de nombreux cas ; toutefois, à mesure que la complexité de votre projet augmente, ces méthodes deviennent moins fiables et plus longues. Vous pouvez pousser plus loin l'idée de séparer le code de test et le transformer en une application de test à part entiÚre. Cela nous amÚne à notre prochain sujet : les processus automatisés.
Les tests peuvent ĂȘtre plus efficaces grĂące Ă des processus automatisĂ©s. Des outils dĂ©diĂ©s vous permettent de crĂ©er une couche de test, c'est-Ă -dire une toute nouvelle application qui teste l'application principale. L'application de test fonctionne en tandem avec l'application principale pour garantir que la logique de votre programme fonctionne comme prĂ©vu.
Il existe deux catégories de tests d'applications :
Les tests fonctionnels
Les tests unitaires
Les tests fonctionnels peuvent ĂȘtre programmatiques (automatisĂ©s) ou stratĂ©giques (manuels), et sont utilisĂ©s pour tester la fonctionnalitĂ© complĂšte d'une application.
Les tests unitaires sont des tests programmatiques utilisés pour valider un petit morceau de code, généralement une méthode ou une fonction. Ils sont similaires aux fonctions de test présentées plus haut dans ce chapitre. La différence est qu'ils sont mis en forme et isolés dans une application distincte. Il existe toutefois deux différences caractéristiques.
La premiÚre est l'utilisation de techniques de nommage précises, qui énoncent les conditions exactes du test. Dans ce cas, ce sont les arguments que vous testez. Cela transformerait les noms de vos fonctions de test en :
// Tester Somme
public void TestUnPlusCinqEgalSix()
{
}
// Tester Soustraction
public void TestDixMoinsHuitEgalDeux()
{
}Ici, vous remarquerez également que vous n'avez plus besoin d'utiliser  Somme ou  Soustraction pour nommer une fonction de test, car vous avez des noms trÚs spécifiques et clairs qui incluent  Plus ou  Moins .
La deuxiÚme différence est qu'au lieu d'afficher la sortie en retour, la fonction lÚve une exception et génÚre volontairement une erreur. En C#, vous pouvez utiliser des méthodes prédéfinies. Ainsi, au lieu de réinventer la roue, vous pouvez ajouter une bibliothÚque pour profiter de toutes les méthodes et variables qui lui sont associées.
N'oubliez pas qu'Ă©crire des tests est toujours une bonne idĂ©e ! đ
PrĂȘt Ă coder ? Pour accĂ©der Ă lâexercice, suivez ce lien.Â
Dans ce chapitre, vous avez appris un concept central de la programmation : les tests. Ils sont réalisés de deux maniÚres :
L'utilisation des fonctions de test.
Les fonctions de test forment du code temporaire au sein de l'application principale.
Cette approche est moins fiable et fonctionne pour les tests rapides dans les petits projets.
L'utilisation de processus automatisés avec le recours à des outils dédiés.
Les tests unitaires sont un exemple populaire de tests automatisés.
Les tests automatisĂ©s sont mis en Ćuvre sous la forme d'une autre application qui teste l'application principale.
L'application principale et l'application de test vont de pair et se valident mutuellement.