5

失敗した単純な単体テストの詳細を取得するのは少しイライラします。実際に定義された assert メッセージ以外のすべてを抑制することは可能ですか?

Creating test database for alias 'default'...
.F
======================================================================
FAIL: test_get_sales_item_for_company (my_app.tests.SalesItemModelTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/kave/projects/my/my_app/tests.py", line 61, in test_get_sales_item_for_company
    self.assertEqual(sales_items.count(), 1, 'Expected one sales item for this company, but got %s' % sales_items.count())
AssertionError: Expected one sales item for this company, but got 2

----------------------------------------------------------------------
Ran 2 tests in 0.313s

FAILED (failures=1)
Destroying test database for alias 'default'...

このビットは不要だと思います。失敗したテスト名 (メソッド) とアサート メッセージを知る必要があります。本当にトレースバックは必要ありません..

Traceback (most recent call last):
  File "/home/kave/projects/my/my_app/tests.py", line 61, in test_get_sales_item_for_company
    self.assertEqual(sales_items.count(), 1, 'Expected one sales item for this company, but got %s' % sales_items.count())
4

1 に答える 1

1

救助のためのモンキーパッチ。次のように Django の TestCase をサブクラス化することで、Django のインストールに手を加えることなく、失敗のトレースバックを取り除くことができます。

import types
from django.utils.unittest.result import failfast
from django.test import TestCase

@failfast
def addFailureSansTraceback(self, test, err):
    err_sans_tb = (err[0], err[1], None)
    self.failures.append((test, self._exc_info_to_string(err_sans_tb, test)))
    self._mirrorOutput = True

class NoTraceTestCase(TestCase):
    def run(self, result=None):
        result.addFailure = types.MethodType(addFailureSansTraceback, result)
        super(NoTraceTestCase, self).run(result)

NoTraceTestCaseテストケースを代わりにのサブクラスにするだけで、準備完了TestCaseです。失敗のトレースバックはもうありません。(例外は引き続きトレースバックを出力することに注意してください。必要に応じて、同様にモンキー パッチを適用できます。)

仕組みは次のとおりです(モンキー パッチの簡単なレッスンを提供してくれた Jason Pratt に感謝します)。

  1. Django のテスト ランナーは、テストの実行ごとに TestCase のrunメソッドを呼び出します。resultパラメータはdjango.utils.unittest.result.TestResult、ユーザーへのテスト結果の表示を処理するクラスのインスタンスです。テストが失敗するたびにrun、次の呼び出しを行います: result.addFailure(self, sys.exc_info()). によって返されるタプルの 3 番目の項目として、そこからトレースバックが発生しsys.exc_info()ます。

  2. runここで、元のコードのコピーでオーバーライドし、必要に応じて微調整するだけで機能します。しかし、このrunメソッドは 75 行の長さで、変更する必要があるのはその 1 行だけです。

  3. このresult.addFailure割り当てにより、 NoTraceTestCase のaddFailureメソッドにresult渡されるオブジェクト内のrunメソッドが、新しく定義された関数に変更されます。この関数は、最初にと互換性のあるメソッドにaddFailureSansTraceback変換されます。resulttypes.MethodType

  4. このsuper呼び出しは、Django の既存の TestCase を呼び出しますrun。これで、既存のコードが実行されると、 への呼び出しaddFailureは実際に新しいバージョン、つまりaddFailureSansTraceback.

  5. addFailureSansTracebackの元のバージョンとaddFailure同じことを行います-2行のコードをコピーします-トレースバックを置き換える行を追加します(次の行の代わりに使用されるNone割り当て)。それでおしまい。err_sans_tberr

  6. オリジナルaddFailureにはfailfastデコレータがあるので、それをインポートして使用することに注意してください。正直なところ、私はそれが何をするか見ていません!

免責事項: 私は Django のテスト コードを十分に調べていません。これは、一般的なケースで動作させるための簡単なパッチです。自己責任!

于 2012-08-10T23:08:28.630 に答える