Cadre de test Python avec prise en charge des échecs non fatals
je suis en train d'évaluer des" cadres de test " pour les tests de systèmes automatisés; jusqu'à présent, je suis à la recherche d'un cadre python. In py.test ou nez Je ne peux pas voir quelque chose comme les macros D'attente que je sais de Google testing framework. J'aimerais faire plusieurs assertions dans un test tout en n'abolissant pas le test au premier échec. Est-ce que je manque quelque chose dans ces cadres ou est-ce que cela ne fonctionne pas? Quelqu'un a-t-il des suggestions pour les framworks de test python utilisables pour les tests du système automatisé?
5 réponses
je voulais quelque chose de similaire pour les tests fonctionnels que je fais en utilisant le nez. J'ai finalement trouvé ceci:
def raw_print(str, *args):
out_str = str % args
sys.stdout.write(out_str)
class DeferredAsserter(object):
def __init__(self):
self.broken = False
def assert_equal(self, expected, actual):
outstr = '%s == %s...' % (expected, actual)
raw_print(outstr)
try:
assert expected == actual
except AssertionError:
raw_print('FAILED\n\n')
self.broken = True
except Exception, e:
raw_print('ERROR\n')
traceback.print_exc()
self.broken = True
else:
raw_print('PASSED\n\n')
def invoke(self):
assert not self.broken
en d'autres termes, il imprime des chaînes indiquant si un test a réussi ou échoué. À la fin du test, vous appelez la méthode invoke qui fait en fait l'assertion réelle . Ce n'est certainement pas préférable, mais je n'ai pas vu de framework de test Python capable de gérer ce genre de test. Je n'ai obtenu autour de comprendre comment écrire un plugin nez pour faire ce genre de chose. :- /
vous avez demandé des suggestions donc je vais suggérer robot framework .
curieusement, il semble que vous cherchez quelque chose comme mon claft
(ligne de commande et testeur de filtre). Quelque chose comme ça, mais beaucoup plus mature.
claft
est (jusqu'à présent) juste un jouet que j'ai écrit pour aider les étudiants avec des exercices de programmation. L'idée est de fournir aux exercices des fichiers de configuration simples qui représentent les besoins du programme en termes raisonnablement lisibles par l'utilisateur (et déclaratifs plutôt que programmatique) tout en étant adapté pour des tests automatisés.
claft
exécute tous les tests définis, en fournissant des arguments et des entrées à chacun, en vérifiant les codes de retour, et en appariant les messages de sortie ( stdout
) et d'erreur ( stderr
) avec les modes d'expression réguliers. Il recueille tous les échecs dans une liste et imprime la liste entière à la fin de chaque suite.
il ne fait pas encore de dialogues arbitraires de séquences d'entrée/sortie. Jusqu'à présent, il il suffit d'alimenter les données dans puis lit toutes les données / erreurs. Il n'implémente pas non plus les timeouts et, en fait, ne capture même pas les tentatives d'exécution ratées. (J'ai dit que c'était juste un jouet, non?). Je n'ai pas encore implémenté le support pour les scripts de configuration, de démontage et de vérification externe (bien que je prévoie de le faire).
la suggestion de Bryan du "robot framework" pourrait être mieux pour vos besoins; bien qu'un coup d'oeil rapide à travers elle suggère qu'il est beaucoup plus impliqué que je veux pour mes fins. (Je dois faire en sorte que les choses soient suffisamment simples pour que les étudiants débutants en programmation puissent se concentrer sur leurs exercices et ne pas passer beaucoup de temps à se battre avec la mise en place de leur harnais d'essai).
vous pouvez regarder claft
et l'utiliser ou en tirer votre propre solution (c'est BSD sous licence). Évidemment, vous seriez le bienvenu pour contribuer en retour. (C'est sur [bitbucket]:( http://www.bitbucket.org/ ) de sorte que vous pouvez utiliser Mercurial de clone, et fourche ton propre respositaire ... et soumettez une "demande de retrait" si vous voulez que j'envisage de fusionner vos modifications de nouveau dans mon repo).
peut-être que j'ai mal compris votre question.
Pourquoi pas unittest
, mais cela devrait fonctionner dans n'importe quel cadre):
class multiTests(MyTestCase):
def testMulti(self, tests):
tests( a == b )
tests( frobnicate())
...
en supposant que vous avez implémenté MyTestCase pour qu'une fonction soit incluse dans
testlist = []
x.testMulti(testlist.append)
assert all(testlist)
n'avortera que lors de la première panne si vous passez l'option -x
à la ligne de commande.
test.py:
def test1():
assert False
def test2():
assert False
sans-option x:
C:\temp\py>C:\Python26\Scripts\nosetests.exe test.py FF ====================================================================== FAIL: test.test1 ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\Python26\lib\site-packages\nose-0.11.1-py2.6.egg\nose\case.py", line 183, in runTest self.test(*self.arg) File "C:\temp\py\test.py", line 2, in test1 assert False AssertionError ====================================================================== FAIL: test.test2 ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\Python26\lib\site-packages\nose-0.11.1-py2.6.egg\nose\case.py", line 183, in runTest self.test(*self.arg) File "C:\temp\py\test.py", line 5, in test2 assert False AssertionError ---------------------------------------------------------------------- Ran 2 tests in 0.031s FAILED (failures=2)
avec-X option:
C:\temp\py>C:\Python26\Scripts\nosetests.exe test.py -x F ====================================================================== FAIL: test.test1 ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\Python26\lib\site-packages\nose-0.11.1-py2.6.egg\nose\case.py", line 183, in runTest self.test(*self.arg) File "C:\temp\py\test.py", line 2, in test1 assert False AssertionError ---------------------------------------------------------------------- Ran 1 test in 0.047s FAILED (failures=1)
vous pourriez vouloir examiner la documentation du nez .