2009-03-26 9 views
6

J'utilise le code suivant dans mon cadre de tests:PyUnit: arrêter après le premier test d'échec?

testModules = ["test_foo", "test_bar"] 

suite = unittest.TestLoader().loadTestsFromNames(testModules) 
runner = unittest.TextTestRunner(sys.stdout, verbosity=2) 
results = runner.run(suite) 
return results.wasSuccessful() 

Y at-il un moyen de faire la déclaration abandonner après le premier échec pour éviter verbosité excessive (runner.run?)?

Répondre

5

C'est une caractéristique. Si vous voulez surcharger cela, vous devez sous-classer les classes TestCase et/ou TestSuite et remplacer la logique dans la méthode run().

P.S .: Je pense que vous avez sous-classe unittest.TestCase et remplacer la méthode run() dans votre classe:

def run(self, result=None): 
    if result is None: result = self.defaultTestResult() 
    result.startTest(self) 
    testMethod = getattr(self, self._testMethodName) 
    try: 
     try: 
      self.setUp() 
     except KeyboardInterrupt: 
      raise 
     except: 
      result.addError(self, self._exc_info()) 
      return 

     ok = False 
     try: 
      testMethod() 
      ok = True 
     except self.failureException: 
      result.addFailure(self, self._exc_info()) 
      result.stop() 
     except KeyboardInterrupt: 
      raise 
     except: 
      result.addError(self, self._exc_info()) 
      result.stop() 

     try: 
      self.tearDown() 
     except KeyboardInterrupt: 
      raise 
     except: 
      result.addError(self, self._exc_info()) 
      ok = False 
     if ok: result.addSuccess(self) 
    finally: 
     result.stopTest(self) 

(j'ai ajouté deux result.stop() appels à la définition par défaut run).

Ensuite, vous devrez modifier tous vos testcases pour en faire des sous-classes de cette nouvelle classe, au lieu de unittest.TestCase.

AVERTISSEMENT: Je n'ai pas testé ce code. :)

+1

Je ne suis pas sûr d'être capable de ça (ou plutôt, je ne veux pas mettre trop d'effort dans ça ...). J'espérais qu'il y aurait un équivalent de l'option --exitfirst de py.test. – AnC

+0

Eh bien, il n'y a pas d'autre moyen. En fait, le code unittest.py est plutôt simple - facile à lire et à étendre. –

+0

J'ai examiné cela, et j'ai essayé de surcharger unittest.TextTestRunner.test pour annuler si un drapeau a été défini - mais c'est déjà l'ensemble des tests, donc ça ne m'aide pas ... Les pointeurs seraient plus Bienvenue! – AnC

5

D'après la direction d'Eugène, je suis venu avec les éléments suivants:

class TestCase(unittest.TestCase): 
    def run(self, result=None): 
     if result.failures or result.errors: 
      print "aborted" 
     else: 
      super(TestCase, self).run(result) 

Bien que cela fonctionne assez bien, il est un peu gênant que chaque module de test individuel doit définir si elle veut utiliser cette classe personnalisée ou celui par défaut (un commutateur de ligne de commande, semblable à py.test « s --exitfirst, serait idéal) ...

0

Miser sur la réponse de AnC, voici ce que je utilise ...

def aborting_run(self, result=None): 
    if result.failures or result.errors: 
     print "aborted" 
    else: 
     original_run(self, result) 
original_run = unittest.TestCase.run 
unittest.TestCase.run = aborting_run 
Questions connexes