2009-03-26 17 views
6

私は私のテストフレームワークに次のコードを使用しています:(?runner.runPyUnit:最初に失敗したテストの後で停止しますか?

testModules = ["test_foo", "test_bar"] 

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

は、報告過度の冗長性を防ぐために、最初の失敗の後に中止を作るための方法はありますか?

答えて

5

これは機能です。これをオーバーライドする場合は、run()メソッドでサブクラス化してTestCaseクラスおよび/またはTestSuiteクラスをオーバーライドし、ロジックをオーバーライドする必要があります。

P.S: は、私はあなたのクラスでunittest.TestCaseとオーバーライドメソッドrun()をサブクラス化する必要があると思う:

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) 

(私はデフォルトrun定義に2つのresult.stop()の呼び出しを追加しました)。

次に、すべてのテストケースを変更して、unittest.TestCaseの代わりに、この新しいクラスのサブクラスにする必要があります。

警告:このコードはテストしませんでした。

+1

私はそれがかなり能力があるかどうかはわかりません(むしろ、これに多大な努力を払う必要はありません...)。 py.testの--exitfirstオプションと同等のものがあることを期待していました。 – AnC

+0

他の方法はありません。実際、unittest.pyコードはかなりシンプルです。読みやすく、拡張するのが簡単です。 –

+0

私はこれを調べて、フラグがセットされていれば中止するためにunittest.TextTestRunner.testをオーバーライドしようとしましたが、それは既にテストのセット全体であり、それは私を助けません... すべてのポインタは、ようこそ! – AnC

5

ユージンの指導に基づいて、私は次のように作ってみた:):

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

これはかなりうまく動作しますが、それは個々のテストモジュールは、それが使用することを望んでいるかどうかを定義しなければならないことを少し迷惑なんですANCの答えに、このカスタムクラスまたはデフォルト1(py.test--exitfirstのようなコマンドラインスイッチ、理想的である)...

0

ビル、これは私が使用しているものです...

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 
関連する問題