我想知道是否有人可以帮助我理解为什么在单独的单元测试中实例化的对象实际上是相同的,具有相同的id。当我从python命令行运行unittest时会发生这种情况,但是当我通过py.test运行时却没有。
我认为这两种测试方法应该是独立的,因此有自己的对象吗?
MyClass.py
class MyClass(object):
def __init__(self, name=None):
if name:
self._name = name
else:
self._name = 'No Name'
def get_name(self):
return self._name
test_myclass.py
import unittest
import MyClass
class TestMyClass(unittest.TestCase):
def test_works_with_none(self):
m = MyClass.MyClass()
print 'test_works_with_none id: ' + str(id(m))
n = m.get_name()
self.assertEqual(n, 'No Name')
def test_works_with_name(self):
m = MyClass.MyClass(name='Don')
print 'test_works_with_name id: ' + str(id(m))
n = m.get_name()
self.assertEqual(n, 'Don')
if __name__ == '__main__':
unittest.main()
python test_myclass.py
$ python test_myclass.py
test_works_with_name id: 139857431210832
.test_works_with_none id: 139857431210832
.
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
py.test -s
$ py.test -s
============================= test session starts ==============================
platform linux2 -- Python 2.7.9 -- py-1.4.25 -- pytest-2.6.3
collected 2 items
test_myclass.py test_works_with_name id: 140612631892240
.test_works_with_none id: 140612631892624
.
=========================== 2 passed in 0.02 seconds ===========================
答案 0 :(得分:1)
id()
的返回值保证仅在同时存在的所有对象中唯一。来自documentation:
具有非重叠生命周期的两个对象可能具有相同的id() 值。
考虑这个简化的例子:
>>> a=object()
>>> b=object()
>>> id(a)
140585585143936
>>> id(b)
140585585143952
>>> del a
>>> del b
>>> a=object()
>>> id(a)
140585585143952
>>> del a
>>> b=object()
>>> id(b)
140585585143952