TDD单元测试可以调用其他功能吗?

时间:2014-05-19 08:13:42

标签: python unit-testing tdd

我使用优秀的书籍(Test Driven Development in Python)在Python上发现了TDD,到目前为止,我很享受。

但是,我对你创建单元测试的方式提出了疑问。

让我们想象一下这样的事情:

def A(MyObject):
    # Do some complex modification on MyObject
    return modified_MyObject

def B(modified_MyObject):
    # Do some stuff on modified_MyObject
    return something

如果我想测试A,它将非常简单:我将在我的单元测试中手动创建一个对象,并测试它,如下所示:

class TestObject(unittest.TestCase):

    def testA(self):
        testA = MyObject()
        modified_MyObject = A(testA)
        # assert MyObject has been modified

但是,如何测试B? 我可以看到:

  • 手动创建“modified_MyObject”并使用它来测试B
  • 使用testB()中的A()创建modified_MyObject

第一种方法允许testB不依赖于A(),但我会创建一个“常量”对象,这显然是在TDD中要避免的。此外,如果我在代码中更改了某些内容,我还必须修改我创建的对象。最后,如果对我的对象进行的修改意味着数百个步骤/数据,那么手动创建对象可能会非常痛苦。

第二种方法是在A()和A之间建立一种依赖关系。 testB,但是我正在测试A(),它应该没问题。

    def testB(self):
        testA = MyObject()
        testModifiedObject = A(testA)
        result = B(testModifiedObject)
        # assert that B return a correct result.

一般问题可能是:“在TDD中,如果代码函数正在使用其他函数,我可以在单元测试中使用它们吗?”

感谢您的帮助,

1 个答案:

答案 0 :(得分:0)

我认为你的问题太笼统了,你能举个具体的例子吗?根据对象和关系,答案会有所不同。

一般情况下,是的,您可以使用其他功能(只要这些功能有自己的测试)。通常,您可以使用setUp方法执行此操作:

def setUp(self):
    self.modified_object = A(object())

def testB(self):
    result = B(self.modified_object)
    # assert something

有时候你可能想要一个模拟对象或只是将一些虚拟对象传递给B.这一切都取决于。

是的,你知道object()创建的对象是不可变的,你不能修改它吗?