Je fais des tests unitaires.
J'essaie de tester une fonction.
Je l'appelle depuis mon composant de test. Mais si la fonction distante ne peut pas gérer l'exception, mon composant de testeur recevra également une exception, je suppose.
Dois-je donc m'inquiéter d'obtenir une exception dans mon composant de testeur?
Merci.
MODIFIER:
PS:
Lancer une erreur est une bonne chose, mais uniquement pour d'autres fonctions, pas pour les utilisateurs finaux jusqu'à ce que ce soit une dernière option!
OMG j'ai écrit un devis de programmation !!
Réponse courte: NON.
N'attrapez pas d'exceptions dans les tests unitaires. Vous effectuez des tests unitaires pour rechercher des erreurs et des situations dans lesquelles des exceptions sont déclenchées.
Le cadre de test unitaire doit gérer les exceptions de manière saine. La plupart (sinon la totalité) des frameworks xUnit ont une construction pour attendre certaines exceptions que vous utilisez lorsque vous souhaitez induire une condition d'exception particulière dans le système sous test et avoir un test réussi si l'exception attendue est levée mais échouez si ce n'est pas le cas.
(Contrairement à la réponse de mcottle) Réponse longue: NON ... la plupart du temps
Lorsque vous dites que vous vous attendez à ce qu'un test déclenche une exception particulière, vous saurez quand TOUTE ligne de ce test déclenche cette exception particulière.
Ce n'est pas tout à fait la même chose que de savoir que la méthode testée lève l'exception.
Si votre test implique la mise en place d'un objet ou d'un contexte (dans le test, pas dans la version de votre framework de SetUp
), vous feriez peut-être mieux d'encapsuler la seule ligne que vous voulez réellement tester dans un try/catch, peut-être avec un assistant.
Par exemple,
public static class AssertHelper {
public delegate void Thunk();
public static void DoesNotThrow<T>(Thunk thunk, string message = "")
where T: Exception {
try {
thunk.Invoke();
} catch(T) {
Assert.Fail(message);
}
}
}
et alors
[TestMethod]
public void assertHelperInAction() {
// Random setup stuff here that's too annoying to put in my SetUp
// method.
AssertHelper.DoesNotThrow<IllegalArgumentException>(() =>
{/* My random method under test */})
}
Si ce test échoue, je sais que ma méthode en cours de test a levé l'exception, et pas quelque chose dans la configuration aléatoire.
(Vous devriez essayer d'éviter les choses de configuration aléatoire. Parfois, il est plus facile d'avoir du code de configuration dans le test.)
En général, vous devez simplement laisser l'exception, et le cadre de test vous donnera un bon rapport avec toutes les informations dont vous avez besoin.
Mais dans la méthodologie TDD, nous devons suivre ces étapes:
Lorsque vous laissez sortir une exception, si l'erreur est claire, alors ça va. Mais parfois, l'exception est obscure, voire erronée. Comment pourriez-vous laisser cela figurer dans votre code (pour vous plus tard, lorsque vous aurez oublié, ou pour un membre de l'équipe qui perdra beaucoup de temps à résoudre le problème)? Donc ma politique est: "S'il est nécessaire de clarifier un échec, vous devez intercepter l'exception".