【发布时间】: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