为什么unittest的assert方法比原始断言慢?

2024-06-16 09:06:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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_*(...)做些什么呢?在

为什么生的更快?我知道访问属性和检查类通常比较慢。但我也想知道发生了什么事?我希望这是一个有效的问题。在

谢谢


Tags: totestselfmaindefassertunittestcall
2条回答

当进行单元测试时,您使用的单元测试库提供的assert收集有关测试的更多信息。它们收集测试是成功还是失败,是什么导致了错误,捕获抛出的任何异常,以及测试的任何输出。然后将这个数据集合操纵到您需要的任何输出中,无论是stdout还是xml文件。这一切只需要花费时间,并且需要大量的函数开销才能完成,正如前面所说的那样,一个断言或多或少是内联的,并显示一个错误以及文件和行号。在

两人在幕后有着巨大的不同。在

与内联执行的assert关键字相比,assert*函数可能更慢,因为调用它(将参数推送到堆栈、调用、从堆栈弹出返回地址等)有开销。assert*函数还有其他一些很好的属性,如打印预期值和实际值。在

你是出于好奇还是真的有问题?我会惊讶地看到任何情况下,断言的速度是一个瓶颈。在

相关问题 更多 >