第3章:Python基础回顾(上)——变量与数据类型、字符串操作、列表与字典的使用
好,咱们直接进入正题。这一章是给自动化诊断测试打地基的。你想想看,写测试脚本,本质上就是在跟数据打交道——拿数据、改数据、存数据、比数据。Python 的这些基础玩意儿,说白了就是你工具箱里的螺丝刀和扳手。我做了这么多年测试开发,见过太多人因为基础不牢,写出来的脚本又臭又长,跑起来还一堆坑。
今天咱们就把它捋清楚。别急,慢慢来。
3.1 变量与数据类型——别小看这步
变量是什么?就是一个装东西的盒子。Python 里你不用提前声明盒子能装什么,直接往里扔就行。这点跟 C 语言不一样,我刚从 C 转 Python 时还不太习惯,总觉得不声明类型心里不踏实。
核心要点:Python 是动态类型语言。变量的类型由赋的值决定,而且可以随时改变。
# 我习惯这样写——清晰明了
device_name = "ECU_001" # 字符串
firmware_version = 2.3 # 浮点数
test_passed = True # 布尔值
error_count = 0 # 整数
# 注意:变量名别用中文,也别用拼音
# 我在项目中见过有人写 "cheSu" 表示车速,后来维护时自己都看不懂
常用的数据类型就这几种:
| 类型 | 例子 | 说明 |
|---|---|---|
| int | 42, -1, 0 | 整数,测试中常用于计数、索引 |
| float | 3.14, -0.5, 1.0 | 浮点数,传感器数值、电压值常用 |
| str | "CAN_Bus", 'OK' | 字符串,设备名、日志消息 |
| bool | True, False | 布尔值,判断测试通过/失败 |
| None | None | 空值,表示「还没有数据」 |
我的小技巧:写测试脚本时,我习惯用 type() 函数快速检查变量类型。特别是从外部读取数据时,经常发现读进来的是字符串而不是数字,这时候 type() 一查就露馅了。
3.2 字符串操作——测试日志的命脉
字符串在自动化测试里太常见了。解析日志、拼接命令、格式化输出,哪哪都离不开它。我个人觉得,字符串操作学好了,脚本质量能提升一大截。
3.2.1 字符串拼接与格式化
拼接字符串,新手最爱用 +。但说实话,我建议你少用。为什么?因为效率低,而且容易出错。
# 不推荐的方式
msg = "测试" + str(case_id) + ":" + result
# 推荐的方式——f-string,Python 3.6+ 才有
msg = f"测试{case_id}:{result}"
# 我在项目中遇到过:用 + 拼接时忘了把数字转字符串,直接报 TypeError
# 用 f-string 就完全没这个问题
3.2.2 常用字符串方法
嗯,这里有几个我几乎天天用的方法:
strip()—— 去掉首尾空白。读配置文件时必用,不然换行符会坑你split()—— 按分隔符切分。解析 CSV 日志文件时,一行代码搞定startswith() / endswith()—— 判断开头结尾。检查日志是否以 "ERROR" 开头,太方便了replace()—— 替换子串。批量修改测试用例名称时常用
log_line = " ERROR: CAN bus timeout "
clean = log_line.strip() # "ERROR: CAN bus timeout"
parts = clean.split(": ") # ["ERROR", "CAN bus timeout"]
is_error = clean.startswith("ERROR") # True
# 我曾经踩过一个坑:从文件读出来的字符串末尾有 \n,直接拿去比较死活不相等
# 后来养成习惯,读进来先 strip() 一下
注意:字符串是不可变的。你调用的 strip()、replace() 等方法,都是返回一个新字符串,原字符串不变。这个很多人一开始会搞混。
3.3 列表与字典——测试数据的容器
单个变量只能存一个值。但测试中我们经常要处理一堆数据——比如所有测试用例的ID、每个用例的预期结果。这时候就需要容器了。
3.3.1 列表——有序的集合
列表用方括号 [],可以放任何类型的数据。说白了就是个购物清单,按顺序排列。
# 测试用例ID列表
test_cases = ["TC001", "TC002", "TC003"]
# 混合类型也没问题(但我不建议这么干,容易乱)
mixed = [1, "hello", 3.14, True]
# 常用操作
test_cases.append("TC004") # 末尾添加
test_cases.insert(0, "TC000") # 指定位置插入
test_cases.remove("TC002") # 删除指定元素
first = test_cases[0] # 索引访问,从0开始
last = test_cases[-1] # 最后一个元素
# 遍历列表——写测试脚本最常用的模式
for tc in test_cases:
print(f"正在执行:{tc}")
避坑指南:我曾经在遍历列表时直接删元素,结果索引错乱,漏掉了一半数据。正确做法是遍历副本 for item in list[:],或者用列表推导式。
3.3.2 字典——键值对的利器
字典用花括号 {},存的是键值对。你想想看,每个测试用例都有ID、名称、预期结果、实际结果——用字典来存,一目了然。
# 一个测试用例的完整信息
test_case = {
"id": "TC001",
"name": "CAN总线通信测试",
"expected": "通信正常",
"actual": "通信正常",
"status": "PASS"
}
# 访问值
print(test_case["name"]) # "CAN总线通信测试"
print(test_case.get("priority", "NORMAL")) # 安全获取,不存在返回默认值
# 修改值
test_case["status"] = "FAIL"
# 遍历字典——我常用的写法
for key, value in test_case.items():
print(f"{key}: {value}")
3.3.3 列表与字典的组合使用
实际项目中,很少只用一种数据结构。往往是列表套字典,或者字典套列表。我举个例子:
# 多个测试用例的集合——列表里放字典
all_tests = [
{"id": "TC001", "name": "CAN通信", "status": "PASS"},
{"id": "TC002", "name": "LIN通信", "status": "FAIL"},
{"id": "TC003", "name": "以太网通信", "status": "PASS"}
]
# 找出所有失败的用例
failed_tests = [t for t in all_tests if t["status"] == "FAIL"]
print(f"失败用例数:{len(failed_tests)}")
# 按ID快速查找——用字典套字典更高效
test_map = {t["id"]: t for t in all_tests}
print(test_map["TC002"]["name"]) # 直接定位,不用遍历
我的经验:写测试脚本时,我习惯把测试数据单独放在一个字典或列表里,跟测试逻辑分开。这样改数据时不用动代码,维护起来特别爽。说白了就是「数据驱动测试」的雏形。
3.4 本章小结
这一章咱们把 Python 最基础的东西过了一遍。变量就是盒子,字符串就是文本,列表和字典就是装东西的架子。别觉得简单就跳过——我见过太多人因为 strip() 没调、字典键写错、列表索引越界,导致脚本跑一半崩了。
下一章咱们继续聊流程控制和函数。这些东西组合起来,就能写出像模像样的自动化测试脚本了。到时候你会发现,今天打的地基,真没白打。
公众号:蓝海资料掘金营,微信deep3321