unittest有许多assert方法。我对使用内置Pythonassert
和比较运算符与内置的简单unittest断言进行了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)
结果是
^{pr2}$使用unittest的内置assert方法的一个优点是它告诉用户实际要比较的内容。我实际测试的一个例子:
======================================================================
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_*(...)
做些什么呢?在
为什么生的更快?我知道访问属性和检查类通常比较慢。但我也想知道发生了什么事?我希望这是一个有效的问题。在
谢谢
当进行单元测试时,您使用的单元测试库提供的assert收集有关测试的更多信息。它们收集测试是成功还是失败,是什么导致了错误,捕获抛出的任何异常,以及测试的任何输出。然后将这个数据集合操纵到您需要的任何输出中,无论是stdout还是xml文件。这一切只需要花费时间,并且需要大量的函数开销才能完成,正如前面所说的那样,一个断言或多或少是内联的,并显示一个错误以及文件和行号。在
两人在幕后有着巨大的不同。在
与内联执行的assert关键字相比,assert*函数可能更慢,因为调用它(将参数推送到堆栈、调用、从堆栈弹出返回地址等)有开销。assert*函数还有其他一些很好的属性,如打印预期值和实际值。在
你是出于好奇还是真的有问题?我会惊讶地看到任何情况下,断言的速度是一个瓶颈。在
相关问题 更多 >
编程相关推荐