web-dev-qa-db-ja.com

「assert False」と「self.assertFalse」の利点または違いは何ですか

私はテストを書いていて、使用するように言っている人がいることを聞いたことがあります self.assertFalse ではなく assert False 。なぜこれがあり、どんな利点があるのですか?

31
chrissygormley

_assert False_は、有用なログ情報なしで例外をスローします。テストにエラーがありました。

self.assertFalse()は、メッセージやテスト名などのテスト失敗情報を含むテスト失敗例外をスローします。

エラー(テストを実行できなかった)と失敗(テストコードは機能しましたが、間違った回答が生成されました)には違いがあります。

エラーはコードの深刻な問題です。

失敗は、修正が必要な失敗にすぎません。

28
S.Lott

走れば

_import unittest

class Test_Unittest(unittest.TestCase):
    def test_assert(self):
        assert False
    def test_assertFalse(self):
        self.assertFalse(True)

if __name__ == '__main__':
    unittest.main()
_

同じロギング情報、同じ失敗を取得します。

_FF
======================================================================
FAIL: test_assert (__main__.Test_Unittest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/unutbu/pybin/test.py", line 6, in test_assert
    assert False
AssertionError

======================================================================
FAIL: test_assertFalse (__main__.Test_Unittest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/unutbu/pybin/test.py", line 8, in test_assertFalse
    self.assertFalse(True)
AssertionError

----------------------------------------------------------------------
Ran 2 tests in 0.000s

FAILED (failures=2)
_

両方が同じように処理される理由は、_unittest.TestCase_が定義するためです

_failureException = AssertionError
_

_assert False_と言うとAssertionErrorが発生します。

self.assertFalse(True)と言うと、failureExeceptionが発生します。

これらの例外は同じであるため、明らかな違いはありません。

ただし、assertと_self.assertFalse_は、従来の使用法とは異なります。

assertは、特定の条件がコードの特定のポイントで保持されることを宣言するために使用されます。開発時には松葉杖として使用されますが、量産コードで使用するためのものではありません。 _python -O my_unittest.py_を実行すると、すべてのassertステートメントが無視されます。これは、assertの意図した使用法を覆し、失敗した場合でもユニットテストに合格する可能性があります。

(-Oフラグなしで)結果は同じですが、assertは単体テストコードで使用するためのものではありません。単体テストを作成するときは、_self.assertTrue_または_self.assertFalse_を使用します。

38
unutbu

これまでのところ答えに言及していない1つの点は、Pythonのイントロスペクションマジックを使用してユニットを記述できるようにするいくつかのテストフレームワーク(例 py.test および nose )があることです。そのようなテスト:

# test_this_and_that.py
def test_frobber():
    assert frobber('x') == 'y'
# EOF

上記で見た単体テストのボイラープレートは必要ありません。したがって、場合によっては、骨組み/文体の問題だけに要約できます。

10
as.