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
demandé sur housemaister 2009-08-20 20:28:38

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. :- /

2
répondu Jason Baker 2009-08-20 17:25:31

vous avez demandé des suggestions donc je vais suggérer robot framework .

1
répondu Bryan Oakley 2009-08-20 17:28:36

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.

1
répondu Jim Dennis 2012-05-20 06:53:19

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)
0
répondu ilya n. 2012-05-20 06:54:26
Le nez

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 .

-1
répondu Mark Rushakoff 2009-08-20 16:41:49