4、Python基础速通(三):流程控制(if/else/for/while)——构建测试逻辑的骨架。
各位好,欢迎来到第三讲。
上一讲我们聊了数据类型和变量,那是代码的「血肉」。今天要讲的流程控制,就是代码的「骨架」。没有骨架,血肉立不起来。测试脚本里,判断、循环、分支,几乎无处不在。说白了,流程控制就是让代码学会「思考」和「重复劳动」。
4.1 条件判断:if / elif / else
先说说最基础的 if 判断。它的逻辑很简单:如果条件成立,就做某件事;否则,做另一件事。
# 判断电压是否超限
voltage = 3.45
if voltage > 3.3:
print("电压过高,触发告警")
else:
print("电压正常")
嗯,这里要注意:Python 用缩进来表示代码块,而不是花括号。我刚开始从 C 语言转过来时,老是不习惯,经常忘记缩进。结果一运行就报错,气得我直拍桌子。后来我养成了一个习惯:写 if 语句时,先写冒号,再按回车,编辑器自动缩进,这样就不会漏了。
实际测试中,我们经常需要多条件判断。比如判断一个测试结果的状态码:
status_code = 404
if status_code == 200:
print("测试通过")
elif status_code == 404:
print("资源未找到,检查路径")
elif status_code == 500:
print("服务器内部错误,需要重试")
else:
print("未知状态码,记录日志")
我个人习惯把最可能出现的条件放在最前面,这样能减少判断次数,提升一点点效率。虽然 Python 的 if 判断很快,但写测试脚本时,这种小细节积累起来,也能让脚本跑得更顺畅。
if voltage > 3.0 and temperature < 85:。也可以用 or 表示「或」关系。我曾经在写一个电源管理测试脚本时,用 and 把电压、电流、温度三个条件串起来,一次性判断,代码简洁多了。
4.2 循环:for 循环
for 循环,说白了就是「遍历」。遍历列表、遍历字典、遍历字符串,甚至遍历一个数字范围。测试脚本里,最常用的就是遍历测试用例列表。
# 遍历测试用例列表
test_cases = ["case_001", "case_002", "case_003"]
for case in test_cases:
print(f"正在执行:{case}")
# 这里可以调用测试函数
你想想看,如果没有 for 循环,你得写多少重复代码?三个用例还好,三百个呢?那不得写到天荒地老。
还有一个常用场景:用 range() 生成数字序列,控制循环次数。
# 重复测试 5 次
for i in range(5):
print(f"第 {i+1} 次测试")
# 执行测试逻辑
range(5) 生成的是 0 到 4,所以我在打印时加了 1,这样显示更符合人类习惯。嗯,这个小细节,我踩过坑。有一次写压力测试脚本,直接用 range(5) 打印,结果日志里显示「第 0 次测试」,被同事吐槽说「你这计数是从零开始的吗?」。从那以后,我只要显示给用户看,都会加 1。
4.3 循环:while 循环
while 循环和 for 循环的区别在于:for 循环知道要循环多少次,while 循环不知道。while 循环会一直执行,直到条件不满足为止。
这在嵌入式测试中非常有用。比如等待某个寄存器值变成期望状态:
# 等待设备就绪,最多等待 10 秒
timeout = 10
start_time = time.time()
while read_register("status") != 0x01:
if time.time() - start_time > timeout:
print("设备超时,测试失败")
break
time.sleep(0.1)
else:
print("设备已就绪")
注意看,这里用了 while...else 结构。当 while 循环正常结束(没有被 break 打断)时,会执行 else 块。这个特性很多人不知道,我也是在一次代码审查中学到的。当时我写了一个 while 循环,后面跟了一个 if 判断是否正常结束,同事说:「你直接用 while...else 不就行了?」我一看,果然简洁多了。
4.4 嵌套与控制流组合
实际测试脚本中,很少只用一种控制结构。往往是 if 套 for,for 套 while,各种组合。比如一个典型的自动化测试框架:
test_suite = ["test_voltage", "test_current", "test_temperature"]
for test_name in test_suite:
print(f"开始测试:{test_name}")
retry_count = 0
while retry_count < 3:
result = run_test(test_name)
if result == "PASS":
print(f"{test_name} 通过")
break
else:
retry_count += 1
print(f"{test_name} 失败,第 {retry_count} 次重试")
else:
print(f"{test_name} 最终失败,记录缺陷")
这个例子展示了:外层 for 循环遍历测试用例,内层 while 循环实现重试机制,if 判断测试结果。三种控制结构配合使用,构成了一个完整的测试逻辑骨架。
我个人习惯在嵌套循环中,用注释标明每一层的作用。不然过两周回来看代码,自己都看不懂。你想想看,一个三层嵌套的循环,没有注释,那简直就是代码迷宫。
4.5 实战:构建一个简单的测试决策树
最后,我们结合今天学的所有内容,写一个简单的测试决策树。假设我们要测试一个电源模块:
def test_power_module():
voltage = measure_voltage()
current = measure_current()
# 第一层判断:电压是否在范围内
if 3.0 <= voltage <= 3.6:
print("电压正常")
# 第二层判断:电流是否在范围内
if 0.5 <= current <= 2.0:
print("电流正常,测试通过")
return "PASS"
else:
print("电流异常,需要进一步诊断")
# 第三层:尝试调整负载
for load in [50, 75, 100]:
adjust_load(load)
new_current = measure_current()
if 0.5 <= new_current <= 2.0:
print(f"负载 {load}% 时电流正常")
break
else:
print("所有负载下电流均异常,测试失败")
return "FAIL"
else:
print("电压异常,直接判定失败")
return "FAIL"
这个例子把 if/else、for、while(虽然没有显式写 while,但 for...else 的逻辑类似)都用上了。它模拟了一个真实的测试场景:先判断主要指标,再判断次要指标,最后尝试修复或诊断。
好了,这一讲就到这里。流程控制是测试脚本的骨架,掌握了 if/else、for、while,你就能写出有逻辑的测试代码了。下一讲,我们会聊函数和模块,那是把骨架组装成完整系统的方法。到时候见。