Je veux écrire un test pour établir qu'une exception n'est pas déclenchée dans une circonstance donnée.
Il est simple de tester si une exception est levée ...
sInvalidPath=AlwaysSuppliesAnInvalidPath()
self.assertRaises(PathIsNotAValidOne, MyObject, sInvalidPath)
... mais comment pouvez-vous faire le contraire .
Quelque chose comme ça dans ce que je cherche ...
sValidPath=AlwaysSuppliesAValidPath()
self.assertNotRaises(PathIsNotAValidOne, MyObject, sValidPath)
python
unit-testing
glaucon
la source
la source
assertNotRaises
méthode qui partage 90% de son code / comportement avecassertRaises
environ 30 lignes de code. Voir ma réponse ci-dessous pour plus de détails.hypothesis
pour m'assurer qu'elles produisent la même sortie pour toutes sortes d'entrées, tout en ignorant les cas où l'original déclenche une exception.assume(func(a))
ne fonctionne pas car la sortie peut être un tableau avec une valeur de vérité ambiguë. Je veux donc simplement appeler une fonction et obtenirTrue
si elle n'échoue pas.assume(func(a) is not None)
fonctionne je supposeRéponses:
la source
ValueError
, maisValueError
est levée à la place, votre test doit se terminer avec une condition d'échec, pas une condition d'erreur. D'un autre côté, si en exécutant le même code vous leviez unKeyError
, ce serait une erreur, pas un échec. En python - différemment de certains autres langages - Les exceptions sont couramment utilisées pour le flux de contrôle, c'est pourquoi nous avonsexcept <ExceptionName>
effectivement la syntaxe. À cet égard, la solution de user9876 est tout simplement fausse.C'est l'hypothèse par défaut - les exceptions ne sont pas levées.
Si vous ne dites rien d'autre, cela est supposé dans chaque test.
Vous n'avez pas besoin d'écrire une affirmation pour cela.
la source
Appelez simplement la fonction. S'il déclenche une exception, le framework de tests unitaires le signalera comme une erreur. Vous pouvez ajouter un commentaire, par exemple:
la source
xfail
décorateur de pytest.Je suis l'affiche originale et j'ai accepté la réponse ci-dessus par DGH sans l'avoir d'abord utilisée dans le code.
Une fois que j'ai utilisé, j'ai réalisé qu'il avait besoin d'un petit ajustement pour faire ce que j'avais besoin de faire (pour être juste envers DGH, il / elle a dit "ou quelque chose de similaire"!).
J'ai pensé qu'il valait la peine de poster le tweak ici pour le bénéfice des autres:
Ce que j'essayais de faire ici était de garantir que si une tentative était faite pour instancier un objet Application avec un deuxième argument d'espaces, pySourceAidExceptions.PathIsNotAValidOne serait levé.
Je crois que l'utilisation du code ci-dessus (basé fortement sur la réponse de DGH) fera cela.
la source
self.assertRaises(PathIsNotAValidOne, MyObject, sInvalidPath)
devrait faire le travail dans ce cas.Vous pouvez définir
assertNotRaises
en réutilisant environ 90% de l'implémentation d'origine deassertRaises
dans leunittest
module. Avec cette approche, vous vous retrouvez avec uneassertNotRaises
méthode qui, à part sa condition de défaillance inversée, se comporte de manière identique àassertRaises
.TLDR et démo en direct
Il s'avère étonnamment facile d'ajouter une
assertNotRaises
méthodeunittest.TestCase
(il m'a fallu environ 4 fois plus de temps pour écrire cette réponse que pour le code). Voici une démonstration en direct de laassertNotRaises
méthode en action . Tout commeassertRaises
, vous pouvez soit passer un appelable et des arguments àassertNotRaises
, soit l'utiliser dans unewith
instruction. La démo en direct comprend un cas de test qui démontre que celaassertNotRaises
fonctionne comme prévu.Détails
L'implémentation de
assertRaises
inunittest
est assez compliquée, mais avec un peu de sous-classement intelligent, vous pouvez remplacer et inverser sa condition d'échec.assertRaises
est une méthode courte qui crée simplement une instance de launittest.case._AssertRaisesContext
classe et la renvoie (voir sa définition dans leunittest.case
module). Vous pouvez définir votre propre_AssertNotRaisesContext
classe en sous_AssertRaisesContext
-classant et en remplaçant sa__exit__
méthode:Normalement, vous définissez des classes de cas de test en les faisant hériter de
TestCase
. Si vous héritez plutôt d'une sous-classeMyTestCase
:tous vos cas de test auront désormais la
assertNotRaises
méthode à leur disposition.la source
traceback
dans votreelse
déclaration vient?import
. Son fixepourrait être modifié si vous devez accepter des paramètres.
appeler comme
la source
Je l'ai trouvé utile pour monkey-patch
unittest
comme suit:Cela clarifie l'intention lors du test de l'absence d'une exception:
Cela simplifie également les tests en boucle, ce que je me retrouve souvent à faire:
la source
assertMayRaise
àunittest.TestSuite
vous pouvez simplement prétendre qu'il fait partie de launittest
bibliothèque.Si vous transmettez une classe Exception à
assertRaises()
, un gestionnaire de contexte est fourni. Cela peut améliorer la lisibilité de vos tests:Cela vous permet de tester les cas d'erreur dans votre code.
Dans ce cas, vous testez le
PathIsNotAValidOne
est levé lorsque vous passez des paramètres non valides au constructeur d'application.la source
vous pouvez essayer comme ça. try: self.assertRaises (None, function, arg1, arg2) sauf: pass si vous ne mettez pas de code à l'intérieur du bloc try, il passera par l'exception "AssertionError: None not raised" et le cas de test sera échoué. Le cas de test sera réussi si mis à l'intérieur, essayez le bloc qui est le comportement attendu.
la source
Une façon simple de s'assurer que l'objet est initialisé sans aucune erreur consiste à tester l'instance de type de l'objet.
Voici un exemple :
la source