2

我正在编写一个包,并像一个优秀的小程序员一样进行测试,但这就是发生的事情:

class TestOne(unittest.TestCase):
    def setUp(self):
        self.finder = Finder()

    def test_default_search_parts(self):
        self.assertEqual(self.finder.search_parts, [])

class TestTwo(unittest.TestCase):
    def setUp(self):
        self.finder = Finder()

    def test_add_letter(self):
        self.finder.add('a')
        self.assertNotEqual(self.finder.search_parts, [])

在这种情况下,test_default_search_parts以 , 失败AssertionError: ['a'] != []test_add_letter通过。我不知道这里发生了什么。当我重写时,它变得非常奇怪test_default_search_parts

def test_default_search_parts(self):
    f = Finder()
    self.assertEqual(f.search_parts, [])

发生同样的故障。我在初始化我的实例时做错了什么?

哦,我正在用鼻子来运行它们,如果这很重要的话。

4

1 回答 1

4

正如@samplebias 所提到的,共享状态(在这种情况下具有类级属性)可能会导致问题。这是您可能遇到的情况:

import unittest

# bad implementation of Finder, class-level attribute
class Finder(object):
    search_parts = []

    def add(self, letter):
        self.search_parts.append(letter)


# using 'Zne' here makes sure this test is run second        
class TestZne(unittest.TestCase):
    def setUp(self):
        print 'I am run next'
        self.finder = Finder()

    def test_default_search_parts(self):
        self.assertEqual(self.finder.search_parts, [])


class TestTwo(unittest.TestCase):
    def setUp(self):
        print 'I am run first'
        self.finder = Finder()

    def test_add_letter(self):
        self.finder.add('a')
        self.assertNotEqual(self.finder.search_parts, [])

unittest.main()

输出

Traceback (most recent call last):
  File "test.py", line 18, in test_default_search_parts
    self.assertEqual(self.finder.search_parts, [])
AssertionError: Lists differ: ['a'] != []

问题是所有 Finder 实例共享这个类级属性 search_parts,并且 add_letter 在默认搜索测试之前运行。

要解决,请使用以下内容:

class Finder(object):
    def __init__(self):
        self.search_parts = []

这将确保它只是一个实例属性。

于 2011-04-27T17:57:59.443 回答