【问题标题】:TDD unit tests can call other functions?TDD单元测试可以调用其他函数吗?
【发布时间】:2014-05-19 08:13:41
【问题描述】:

我使用优秀的书 (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()和testB之间建立依赖关系,但是我也在测试A(),应该没问题。

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

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

感谢您的帮助,

【问题讨论】:

  • 作为一般规则,测试应该是独立的。所以最好在不同的测试中再次创建对象,除非它真的很昂贵(但如果是的话,它应该由集成测试来处理)。
  • 所以基本上,您所说的与@Duncan 完全相反。这有点令人困惑:/

标签: python unit-testing tdd


【解决方案1】:

我觉得你的问题太笼统了,能举个具体的例子吗?答案会因对象和关系而异。

不过,一般来说,是的,您可以使用其他功能(只要这些功能有自己的测试)。通常你会在 setUp 方法中这样做:

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

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

虽然有时您可能想要一个模拟对象或只是将一些虚拟对象传递给 B。这完全取决于。

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

【讨论】:

  • 作为一个具体的例子,这几乎就是我在我的问题中写的:创建一个对象,修改它并在另一个函数中使用修改后的对象。感谢您的回答,您让我选择在我的测试中使用其他(已经测试过的)函数而不是创建常量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
相关资源
最近更新 更多