我使用这本优秀的书(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?我可以看到这样的方式:
第一种方法允许testB不依赖于A(),但是我将创建一个“常量”对象,这显然是TDD中需要避免的。此外,如果我在代码中更改了一些内容,我也必须修改我创建的对象。最后,如果对我的对象进行的修改意味着数百个步骤/数据,那么手工创建对象可能会非常痛苦。
第二种方法是在A()之间建立依赖关系
def testB(self):
testA = MyObject()
testModifiedObject = A(testA)
result = B(testModifiedObject)
# assert that B return a correct result.
一般问题可能是:“在TDD中,如果代码函数使用其他函数,我可以在单元测试中也使用它们吗?”
谢谢你的帮助,
我觉得你的问题太笼统了,你能举个具体的例子吗?答案会因对象和关系的不同而有所不同。
然而,一般来说,是的,你可以使用其他函数(只要这些函数有自己的测试)。通常,您会在setUp
方法中执行此操作:
def setUp(self):
self.modified_object = A(object())
def testB(self):
result = B(self.modified_object)
# assert something
有时,尽管您可能需要一个模拟对象,或者只是将一些虚拟对象传递给B。这一切都取决于。
顺便说一句,你知道由对象()
创建的对象是不可变的,你不能修改它吗?
虽然这个测试可能是微不足道的,但它说明了单元测试的基本元素。 我们使用解释这个测试是什么,我们使用来断言我们从测试中得到什么样的结果。 这些是用户定义的,因此在这些消息中描述性和准确性是一个好主意。 诸如“应该工作”或“测试服务”之类的消息不能真正解释发生了什么,并且在整个应用程序上运行多个测试时可能会产生混淆。 我们的实际测试是基本的,我们使用制定一个场景,并使用来断言我们从该场景预期的结果条件
假设我有两个html文件具有如下功能: 我想从a.html直接指向B.html,然后直接调用函数B。我怎样才能做到?。因为我想要将JSON字符串从函数A传递到函数B,而不是使用window.onload()或$(document).ready()。 我将我的JSON字符串存储到本地存储,并将用户引导到b.html。然后函数B将读取本地存储并直接处理数据。
问题内容: 我有一个实现一些WKNavigationDelegate函数的UIViewController,并且我想对这些函数中的逻辑进行单元测试。这是一个例子: 我希望我的单元测试确保基于WKNavigationAction的request.url用正确的WKNavigationActionPolicy调用DecisionHandler。 但是,我不知道如何测试此功能。当我运行测试项目时,在We
我的任务是为另一个团队编写的AngularJS代码编写单元测试,该团队没有编写任何测试 他们已经编写了以下函数,但我不知道如何测试它 我需要测试每个函数是否被调用,而不是担心它们做什么,因为我将分别测试它们,只是它们被调用。 调用populateCallAlertOnEditCall时,需要返回空数组或其中包含某些项的数组 调用openAlertModalInstance时,它需要返回未定义的或传
问题内容: 我有一个Python 2.7方法,有时会调用 当满足正确的条件时,是否可以进行单元测试以验证是否调用了此代码行? 问题答案: 是。加注,因此您可以使用以下命令进行检查: 的实例具有设置为建议的退出状态的属性,并且返回的上下文管理器将捕获的异常实例设置为,因此检查退出状态很容易: sys.exit文档: 从Python退出。这是通过引发异常来实现的…可以在外部级别拦截出口尝试。