模拟打桩(Stub)是一种在软件测试中使用的技术,用于替代某些代码模块,从而隔离待测试单元的行为。通过使用一个“桩”来替代真实的代码,测试者可以控制待测试单元的环境和输入,使得测试更可控和可预测。
示例解释
假设我们有一个简单的应用程序,其中有一个函数 calculateTotalPrice,它负责计算购物车中商品的总价。这个函数依赖于一个外部服务 getDiscount,该服务会返回当前的折扣百分比。
# 实际代码
def getDiscount():
# 假设这个函数会调用一个外部服务来获取实时折扣
# 这里简化为一个固定返回值
return external_service_call()
def calculateTotalPrice(items):
total = sum(item['price'] for item in items)
discount = getDiscount()
return total * (1 - discount)
在测试 calculateTotalPrice 函数时,我们并不想依赖于 getDiscount 的实际实现,因为这可能会涉及到网络请求或不稳定的外部服务。此时,我们可以使用“桩”来替代 getDiscount:
# 测试代码
def stub_getDiscount():
return 0.1 # 假设折扣为 10%
def test_calculateTotalPrice():
items = [{'price': 100}, {'price': 200}]
# 使用桩来替代实际的 getDiscount 函数
original_getDiscount = calculateTotalPrice.__globals__['getDiscount']
calculateTotalPrice.__globals__['getDiscount'] = stub_getDiscount
try:
result = calculateTotalPrice(items)
assert result == 270 # 期望结果为 (100 + 200) * 0.9
finally:
# 恢复原始的 getDiscount 函数
calculateTotalPrice.__globals__['getDiscount'] = original_getDiscount
test_calculateTotalPrice()
解释
-
替换依赖: 在测试中,我们用
stub_getDiscount替换掉了getDiscount。这样一来,无论外部服务的实际折扣是多少,我们都可以确保我们的测试稳定地使用 10% 的折扣。 -
控制测试环境: 通过这种方式,我们可以完全控制
calculateTotalPrice的行为,不受外部因素的影响。 -
简化测试: 使用桩可以简化测试,因为我们不必考虑外部服务的复杂性,只需专注于我们要测试的功能本身。
通过这种方式,模拟打桩可以帮助我们创建可靠且可重复的单元测试。
"Stub" 这个词源自于英文,原意是指“树桩”或“残余部分”。在软件测试中,“Stub”是一个模拟对象或函数,用来替代某些复杂或难以控制的组件。这个术语之所以被使用,主要是因为“Stub”就像一个简单的“桩”或“支撑物”,用来暂时代替实际的、更复杂的功能,以便进行测试。
为什么叫“Stub”
-
简化复杂性: 就像树桩是树的一个简单部分,Stub 是系统中某个复杂组件的简单替代。它不需要实现所有复杂的逻辑,只需提供足够的接口来支持测试。
-
支撑测试: Stub 在测试中起到支撑作用,使得测试可以在没有完整实现或外部依赖的情况下进行。
-
临时性: Stub 通常是临时的,专为测试目的而创建。它们不像完整的实现那样是永久性的解决方案。
-
可控性: 使用 Stub,可以在测试中精确控制输入和行为,就像一个固定的“桩”一样,不会随外部环境变化。
因此,“Stub”这个术语形象地描述了其在测试中的角色:一个简单且稳定的替代物,帮助开发者在不依赖完整实现的情况下进行测试。
浙公网安备 33010602011771号