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