Comment gérer plusieurs assertions dans un seul unittest Python?
C'est un problème qui est survenu lors de la réalisation d'un seul test qui a eu de multiples indépendant des modes de défaillance, en raison d'avoir plusieurs flux de sortie. Je voulais aussi montrer les résultats d'affirmer que les données sur tous les modes, indépendamment de l'échec de la première. Python unittest n'a pas cette fonctionnalité en dehors de l'aide d'une série de représenter le seul test, ce qui est inacceptable, car mon seul test toujours nécessaires pour être exécuté comme une seule unité, il n'a tout simplement pas compte de la nature de la chose.
Un exemple pratique est le test d'un objet qui génère également un journal. Vous souhaitez faire valoir la sortie de ses méthodes, mais vous voulez aussi faire valoir la sortie du journal. Les deux sorties nécessitent différents tests, ce qui peut être bien exprimé par deux du stock affirme expressions, mais vous ne voulez pas que la défaillance de l'un à masquer l'échec possible de l'autre dans le test. Si vous avez vraiment besoin de tester les deux en même temps.
J'ai bricolé ce petit widget pour résoudre mon problème.
def logFailures(fnList):
failurelog = []
for fn in fnList:
try:
fn()
except AssertionError as e:
failurelog.append("\nFailure %d: %s" % (len(failurelog)+1,str(e)))
if len(failurelog) != 0:
raise AssertionError(
"%d failures within test.\n %s" % (len(failurelog),"\n".join(failurelog))
)
Qui est utilisé comme suit:
def test__myTest():
# do some work here
logFailures([
lambda: assert_(False,"This test failed."),
lambda: assert_(False,"This test also failed."),
])
Le résultat est que logFailures() génère une exception qui contient l'historique de toutes les affirmations qui ont été soulevées dans les méthodes de la liste.
La question: bien que ce fait le boulot, je me demande si il ya une meilleure façon de gérer cela, d'autres que d'avoir à aller à la longueur de la création de imbriquée de suites de tests et ainsi de suite?
source d'informationauteur Eric Anderton
Vous devez vous connecter pour publier un commentaire.
Je suis en désaccord avec l'opinion dominante que l'on doit écrire une méthode de test pour chaque affirmation. Il y a des situations où vous souhaitez vérifier plusieurs choses dans une méthode de test. Voici ma réponse pour savoir comment faire:
Et voici quelques situations où je pense que c'est utile et pas risqué:
1) si vous voulez le code de test pour les différents ensembles de données. Ici, nous avons un ajout() et la fonction que je veux tester avec quelques exemples. Pour écrire 3 méthodes d'essai pour les 3 ensembles de données les moyens de vous répéter, ce qui est mauvais. Surtout si l'appel a été plus élaborées.:
2) Lorsque vous voulez vérifier plusieurs sorties d'une fonction. Je veux vérifier chaque sortie, mais je ne veux pas d'un premier échec pour masquer les deux autres.
3) Tester des choses avec de lourds frais d'installation. Les Tests doivent courir vite ou arrêter de les utiliser. Certains tests nécessitent un db ou d'une connexion réseau qui prend une seconde qui serait vraiment ralentir votre test. Si vous testez la connexion aux bases de lui-même, alors vous avez probablement besoin de prendre de la vitesse coup. Mais si vous testez quelque chose sans rapport, nous voulons faire de la lenteur de l'installation une fois pour toute une série de contrôles.
Cela se sent comme plus de génie pour moi. Soit:
Utiliser deux affirme, dans un cas de test. Si la première assertion échoue, c'est vrai, vous ne savez pas si la seconde assertion est passé ou pas. Mais vous allez corriger le code de toute façon, le réparer, et puis vous verrez si le deuxième affirmer passé.
Écrire deux tests, l'un pour vérifier chaque condition. Si vous avez peur de code dupliqué dans les tests, mettre l'essentiel du code dans une méthode d'assistance que vous appelez à partir des essais.
Avec l'aide d'un sous-test, l'exécution ne serait pas s'arrêter après le premier échec
https://docs.python.org/3/library/unittest.html#subtests
Voici l'exemple avec deux échouer affirme:
Sortie sera:
Vous pouvez facilement enrouler sous-test comme suit