1

unittest には多くの assert メソッドが付属しています。assert組み込みのPythonと比較演算子と組み込みの単純なユニットテストアサーションを使用してtimeitテストを行いました。

#!/usr/bin/python
import timeit

s = """\
import unittest
class TestRepomanManExtFunctions(unittest.TestCase):
    def test1(self):
        someObj = object()
        newObj = someObj
        self.assertEqual(someObj, newObj)

    def test2(self):
        str1 = '11111111111111111111111111111111111111'
        str2 = '33333333333333333333333333333333333333'
        self.assertNotEqual(str1, str2)


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

"""
t = timeit.Timer(stmt=s)
print "%.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000)

s2 = """\
import unittest
class TestRepomanManExtFunctions(unittest.TestCase):
    def test1(self):
        someObj = object()
        newObj = someObj
        assert someObj == newObj

    def test2(self):
        str1 = '11111111111111111111111111111111111111'
        str2 = '33333333333333333333333333333333333333'
        assert str1 != str2


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

"""

t = timeit.Timer(stmt=s2)
print "%.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000)

結果は

yeukhon@yeukhon-P5E-VM-DO:/tests$ python t.py
1203.46 usec/pass
873.06 usec/pass
yeukhon@yeukhon-P5E-VM-DO:tests$ vim t.py
yeukhon@yeukhon-P5E-VM-DO:tests$ python t.py
1300.33 usec/pass
956.35 usec/pass
yeukhon@yeukhon-P5E-VM-DO:tests$ python t.py
1208.82 usec/pass
865.18 usec/pass

unittest の組み込み assert メソッドを使用する利点の 1 つは、実際に何が比較されているかをユーザーに伝えることです。私の実際のテストの例:

======================================================================
FAIL: test_000_write_to_file_directory_not_exist (__main__.TestRepomanManExtFunctions)
Test writing content to a new file whose parent directory
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/mock.py", line 1224, in patched
    return func(*args, **keywargs)
  File "test_ext.py", line 71, in test_000_write_to_file_directory_not_exist
    self.assertNotEqual(mk_exists.call_args_list, exists_call_list)
AssertionError: [call('/tmp/test/fake/')] == [call('/tmp/test/fake/')]

ここではシンプルに使用していますassert X = Y

======================================================================
FAIL: test_000_write_to_file_directory_not_exist (__main__.TestRepomanManExtFunctions)
Test writing content to a new file whose parent directory
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/mock.py", line 1224, in patched
    return func(*args, **keywargs)
  File "test_ext.py", line 72, in test_000_write_to_file_directory_not_exist
    assert exists_call_list != mk_exists.call_args_list
AssertionError

この利点の他に、ビルトインを利用することで、他にどんな良いことができるself.assert_*(...)でしょうか?

raw の方が速いのはなぜですか? 属性へのアクセスとクラスに対するチェックは一般的に遅いことを知っています。しかし、私も何が起こっているのか知りたいですか?これが有効な質問であることを願っています。

ありがとう

4

2 に答える 2

1

おそらく assert* 関数は、インラインで実行される assert キーワードと比較して、それを呼び出す際のオーバーヘッド (スタックへのパラメーターのプッシュ、呼び出し、スタックからの戻りアドレスのポップなど) があるため、遅くなります。assert* 関数には、期待値と実際の値を出力するなど、他にもいくつかの優れたプロパティがあります。

あなたは好奇心から尋ねていますか、それともこれは実際の問題ですか? アサーションの速度がボトルネックになっている状況を見ると驚かれることでしょう。

于 2012-07-14T19:52:58.810 に答える
0

使用する単体テスト ライブラリによって提供されるアサートを単体テストすると、テストに関するより多くの情報が収集されます。それらは、テストが成功したか失敗したか、エラーの原因、スローされた例外、およびテストからの出力を収集します。このデータのコレクションは、stdout や xml ファイルなど、必要な出力に変換されます。これには時間がかかり、完了するには多くの関数オーバーヘッドが必要です。単一のアサートは多かれ少なかれインラインであり、ファイルと行番号とともにエラーが表示されます。

舞台裏で両者の間には大きな違いがあります。

于 2012-07-14T20:27:53.387 に答える