Si vous avez affaire à de grandes quantités de code hérité qui ne sont pas actuellement testés, obtenir la couverture de test maintenant plutôt que d'attendre une grande réécriture hypothétique à l'avenir est la bonne solution. Commencer par écrire des tests unitaires n'est pas.
Sans test automatisé, après avoir apporté des modifications au code, vous devez effectuer des tests manuels complets de l'application pour vous assurer de son bon fonctionnement. Commencez par écrire des tests d'intégration de haut niveau pour remplacer cela. Si votre application lit les fichiers, les valide, les traite d'une manière ou une autre et affiche les résultats souhaités pour les tests.
Idéalement, vous disposez de données issues d'un plan de test manuel ou vous pouvez obtenir un échantillon des données de production réelles à utiliser. Si ce n'est pas le cas, puisque l'application est en production, dans la plupart des cas, elle fait ce qu'elle devrait être, alors créez simplement des données qui atteindront tous les points forts et supposerez que la sortie est correcte pour le moment. Ce n'est pas pire que de prendre une petite fonction, en supposant qu'elle porte le nom ou les commentaires suggérant qu'elle le devrait, et en écrivant des tests en supposant que cela fonctionne correctement.
IntegrationTestCase1()
{
var input = ReadDataFile("path\to\test\data\case1in.ext");
bool validInput = ValidateData(input);
Assert.IsTrue(validInput);
var processedData = ProcessData(input);
Assert.AreEqual(0, processedData.Errors.Count);
bool writeError = WriteFile(processedData, "temp\file.ext");
Assert.IsFalse(writeError);
bool filesAreEqual = CompareFiles("temp\file.ext", "path\to\test\data\case1out.ext");
Assert.IsTrue(filesAreEqual);
}
Une fois que vous avez suffisamment écrit de ces tests de haut niveau pour capturer le fonctionnement normal des applications et les cas d'erreur les plus courants, vous aurez besoin de passer beaucoup de temps à cogner sur le clavier pour essayer de récupérer les erreurs du code en effectuant autre chose. vous pensiez que cela était supposé faire va considérablement réduire la future refactorisation (ou même une grosse réécriture) beaucoup plus facile.
Comme vous pouvez étendre la couverture des tests unitaires, vous pouvez réduire, voire annuler, la plupart des tests d'intégration. Si votre application lit / écrit des fichiers ou accède à une base de données, il est évident de commencer par tester ces parties séparément, puis de les imiter ou de faire en sorte que vos tests commencent par créer les structures de données lues à partir du fichier / de la base de données. En réalité, la création de cette infrastructure de test prendra beaucoup plus de temps que la rédaction d'un ensemble de tests rapides et sales; et chaque fois que vous exécutez un ensemble de tests d'intégration de 2 minutes au lieu de passer 30 minutes à tester manuellement une fraction de ce que les tests d'intégration couvraient, vous gagniez déjà beaucoup.