2009-03-26 23 views
6

Używam następujący kod w moim ramach testów:PyUnit: zatrzymać po pierwszym nieudanym teście?

testModules = ["test_foo", "test_bar"] 

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

Czy istnieje sposób, aby raportowanie przerwać po pierwszym niepowodzeniu, aby zapobiec nadmiernej szczegółowości (runner.run?)?

Odpowiedz

5

To jest funkcja. Jeśli chcesz to zmienić, musisz podklasować klasy TestCase i/lub TestSuite i zastąpić logikę w metodzie run().

P.S .: Chyba trzeba podklasy unittest.TestCase i zastąpić metodę run() w swojej klasie:

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) 

(Dodałem dwa result.stop() połączeń do definicji domyślny run).

Będziesz musiał zmodyfikować wszystkie swoje testcases, aby utworzyć podklasy tej nowej klasy, zamiast unittest.TestCase.

OSTRZEŻENIE: Nie testowałem tego kodu. :)

+1

Nie jestem pewien, czy jestem do tego zdolny (a raczej nie chcę w to wkładać zbyt wiele wysiłku ...). Miałem nadzieję, że będzie odpowiednik opcji py.test --exitfirst. – AnC

+0

Cóż, nie ma innej drogi. W rzeczywistości kod unittest.py jest dość prosty - łatwy do odczytania i rozszerzony. –

+0

Zajrzałem do tego i próbowałem przesłonić unittest.TextTestRunner.test, aby przerwać, jeśli flaga została ustawiona - ale to już cały zestaw testów, więc to mi nie pomoże ... Wszelkie wskaźniki byłyby najbardziej Witamy! – AnC

5

podstawie wytycznych Eugeniusza, mam wymyślić, co następuje:

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

Chociaż to działa dość dobrze, to trochę irytujące, że każdy moduł testowy musi określić, czy chce skorzystać ta klasa zwyczaj lub jeden domyślny (przełącznik wiersza polecenia, podobnie jak py.test „s --exitfirst, byłby idealny) ...

0

Opierając się na odpowiedź ANC, to co używam ...

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 
Powiązane problemy