Python单个单元测试似乎使用相同的实例化对象

时间:2015-03-19 16:01:49

标签: python unit-testing

我想知道是否有人可以帮助我理解为什么在单独的单元测试中实例化的对象实际上是相同的,具有相同的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 ===========================

1 个答案:

答案 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