第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