文章目录
引言:为什么测试工程师需要学好 Python?
对于正在从功能测试向自动化测试转型的工程师而言,Python 无疑是首选语言。它语法简洁、学习曲线平缓、拥有极其丰富的测试框架和库(如 pytest, Selenium, requests, Appium),并且社区活跃,资源丰富。掌握 Python 基础语法,是构建稳定、高效自动化测试脚本的基石。本文将系统性地讲解 Python 核心语法,并特别标注测试工程师需要熟练和重点掌握的部分,帮助你高效入门,为后续学习自动化测试框架扫清障碍。
1. 环境搭建与第一个程序
1.1 安装 Python
访问 Python 官网 下载最新稳定版本(推荐 3.8+)。安装时务必勾选 “Add Python to PATH”。
验证安装:打开命令行(CMD 或 Terminal),输入 python --version 或 python3 --version,看到版本号即表示成功。
1.2 选择开发工具
- 初学者推荐:VS Code 或 PyCharm Community Edition。
- 第一个脚本:创建一个名为
hello_test.py的文件,输入以下内容:
在终端中运行:print("Hello, Automated Testing World!")python hello_test.py。你将看到输出,这标志着你的 Python 之旅正式开始。
学习重点:确保环境配置成功,理解如何创建 .py 文件并运行。
2. 变量与数据类型
变量是存储数据的容器,Python 是动态类型语言,无需声明类型。
2.1 基本数据类型
# 整型 (int)
test_case_count = 100
# 浮点型 (float)
success_rate = 99.5
# 字符串 (str) - 测试中大量使用
test_name = "用户登录功能测试"
error_message = 'Invalid credentials'
# 布尔型 (bool) - 用于断言判断
is_test_passed = True
is_regression = False
# 空值 (NoneType)
test_result = None # 表示暂无结果
2.2 类型查看与转换
print(type(test_case_count)) # 输出: <class 'int'>
# 类型转换
str_count = str(test_case_count) # 转换为字符串: "100"
int_rate = int(success_rate) # 转换为整数: 99 (向下取整)
熟练与重点:
- 字符串操作:拼接(
+)、格式化(f-string, 强烈推荐)、常用方法(.strip(),.split(),.replace(),.find())。base_url = "https://api.example.com" endpoint = "/login" full_url = f"{base_url}{endpoint}" # f-string 格式化 print(f"请求的URL是: {full_url}") - 布尔值在断言中的应用:理解
True/False作为条件判断的核心。
3. 数据结构(核心)
自动化测试中,组织和管理测试数据离不开以下四种核心数据结构。
3.1 列表 (List) - 有序、可变
# 定义列表
test_steps = ["打开浏览器", "输入网址", "输入用户名", "点击登录"]
error_codes = [400, 401, 403, 404, 500]
# 访问元素 (索引从0开始)
first_step = test_steps[0] # “打开浏览器”
last_error = error_codes[-1] # 500 (负数表示倒数)
# 修改元素
test_steps[1] = "导航至登录页"
# 常用方法
test_steps.append("验证登录成功") # 追加元素
test_steps.insert(2, "输入密码") # 在指定位置插入
removed_step = test_steps.pop() # 移除并返回最后一个元素
3.2 元组 (Tuple) - 有序、不可变
用于存储不应被修改的数据集合,如配置项。
# 定义元组
db_config = ("localhost", 3306, "test_db", "readonly_user")
# db_config[0] = "127.0.0.1" # 错误!元组元素不可修改
# 常用于函数返回多个值
def get_test_result():
return True, "All checks passed", 0
status, message, code = get_test_result()
3.3 字典 (Dictionary) - 键值对、无序、可变
测试工程师必须熟练掌握! 广泛用于存储测试数据、API请求/响应体、配置。
# 定义字典
test_user = {
"username": "tester_zhang",
"password": "Test@123",
"role": "admin",
"is_active": True
}
# 访问值
print(test_user["username"]) # 输出: tester_zhang
# 更安全的获取方式,避免KeyError
phone = test_user.get("phone", "13800138000") # 如果键不存在,返回默认值
# 添加或修改
test_user["email"] = "tester@example.com"
test_user["password"] = "NewPass@456"
# 遍历
for key, value in test_user.items():
print(f"{key}: {value}")
# 在API测试中的应用示例
api_request_body = {
"method": "POST",
"url": "/api/login",
"headers": {"Content-Type": "application/json"},
"json": {"username": "test", "password": "123456"}
}
3.4 集合 (Set) - 无序、元素唯一
用于去重或成员关系测试。
# 定义集合
unique_error_types = {"TimeoutError", "ConnectionError", "ValidationError", "TimeoutError"}
print(unique_error_types) # 输出: {'TimeoutError', 'ConnectionError', 'ValidationError'} (已去重)
# 判断元素是否存在
if "TimeoutError" in unique_error_types:
print("发现了超时错误")
熟练与重点:
- 列表和字典的深度掌握:增删改查、遍历、列表推导式、字典推导式。
- 理解可变与不可变:列表、字典可变;元组、字符串、数字不可变。
4. 流程控制
控制代码的执行逻辑。
4.1 条件判断 (if/elif/else)
status_code = 200
if status_code >= 200 and status_code < 300:
print("请求成功")
elif status_code == 401:
print("未授权,请检查token")
elif status_code == 404:
print("资源未找到")
else:
print(f"请求失败,状态码: {status_code}")
# 简化写法 (链式比较)
if 200 <= status_code < 300:
print("成功区间")
4.2 循环 (for / while)
- for 循环:遍历序列(列表、元组、字符串、字典等)。
# 遍历列表 for step in test_steps: print(f"执行步骤: {step}") # 遍历字典 for key, value in api_request_body.items(): print(f"{key} -> {value}") # 结合 range 生成索引 for i in range(5): # 生成 0,1,2,3,4 print(f"执行第 {i+1} 次循环") - while 循环:在条件为真时重复执行。
retry_count = 0 max_retries = 3 is_success = False while retry_count < max_retries and not is_success: print(f"第 {retry_count + 1} 次重试...") # 模拟一些操作 # is_success = do_something() retry_count += 1
熟练与重点:
for循环遍历各种数据结构。- 循环控制语句:
break(终止循环)、continue(跳过本次循环剩余部分)。 - 在测试中应用:数据驱动测试(遍历多组测试数据)、重试机制。
5. 函数
将代码块组织成可重复使用的单元,是编写模块化、可维护测试脚本的关键。
5.1 定义与调用
def login(username, password):
"""
模拟登录函数。
参数:
username (str): 用户名
password (str): 密码
返回:
bool: 登录是否成功
str: 返回消息
"""
# 这里是模拟逻辑
if username == "admin" and password == "admin123":
return True, "登录成功"
else:
return False, "用户名或密码错误"
# 调用函数
success, message = login("admin", "admin123")
print(f"登录结果: {success}, 信息: {message}")
5.2 参数与返回值
- 默认参数:为参数提供默认值。
def send_request(url, method="GET", timeout=10): print(f"向 {url} 发送 {method} 请求,超时 {timeout} 秒") # ... 发送请求的逻辑 send_request("https://example.com") # 使用默认 method 和 timeout send_request("https://example.com", "POST", 30) # 覆盖默认值 - 关键字参数:调用时指定参数名,提高可读性。
send_request(url="https://example.com", timeout=15) - 返回值:使用
return返回结果,可以返回多个值(实质是返回一个元组)。
熟练与重点:
- 熟练定义和调用函数。
- 理解参数传递:位置参数、关键字参数、默认参数。
- 编写清晰的函数文档字符串 (docstring),如上面的
"""注释。 - 函数是测试用例和工具方法的主要组织形式。
6. 异常处理
优雅地处理程序运行时可能发生的错误,防止脚本意外崩溃,是编写健壮自动化脚本的必备技能。
try:
# 可能出错的代码块
result = 10 / 0 # 这里会引发 ZeroDivisionError
file = open("不存在的文件.txt", "r") # 可能引发 FileNotFoundError
except ZeroDivisionError as e:
# 处理特定的除零错误
print(f"捕获到除零错误: {e}")
result = None
except FileNotFoundError as e:
# 处理文件未找到错误
print(f"文件未找到: {e}")
except Exception as e:
# 捕获所有其他未预料到的异常
print(f"发生未知错误: {e}")
else:
# 如果没有异常发生,执行这里的代码
print("操作成功完成!")
finally:
# 无论是否发生异常,最终都会执行的代码(常用于清理资源)
print("执行清理工作...")
熟练与重点:
- 必须掌握
try-except的基本结构。 - 在测试脚本中:用于处理元素查找失败、网络请求超时、断言失败等场景,并记录详细的错误日志。
- 主动抛出异常:使用
raise关键字。
7. 文件操作
测试中经常需要读写配置文件、测试数据文件、日志文件等。
7.1 读写文本文件
# 写入文件 (记录测试日志)
with open("test_log.txt", "w", encoding="utf-8") as f: # ‘w’ 表示写入,会覆盖原有内容
f.write("测试开始于 2023-10-27\n")
f.write("用例1: 通过\n")
# 使用 with 语句,文件会自动关闭
# 读取文件 (读取测试数据)
with open("test_data.csv", "r", encoding="utf-8") as f: # ‘r’ 表示读取
content = f.read() # 读取全部内容
# 或按行读取
lines = f.readlines()
for line in lines:
print(line.strip()) # strip() 去除首尾空白字符
7.2 JSON 文件处理(极其重要)
Python 内置 json 模块,方便处理 JSON 格式(API 测试中无处不在)。
import json
# 将 Python 字典写入 JSON 文件
config = {
"base_url": "https://api.test.com",
"timeout": 30,
"users": ["user1", "user2"]
}
with open("config.json", "w") as f:
json.dump(config, f, indent=2) # indent 使格式美观
# 从 JSON 文件读取为 Python 字典
with open("config.json", "r") as f:
loaded_config = json.load(f)
print(loaded_config["base_url"])
熟练与重点:
- 使用
with open() as f:上下文管理器,确保文件正确关闭。 - 掌握
json.dump()和json.load()用于处理 JSON 数据。 - 了解不同模式:
'r','w','a'(追加),'rb'(二进制读)。
8. 模块与导入
通过模块化组织代码,复用他人编写的强大库。
8.1 导入内置或第三方模块
# 导入整个模块
import json
import os
import sys
# 从模块中导入特定函数/类
from datetime import datetime
from math import sqrt
# 给模块起别名(常用)
import pandas as pd
import requests as req
# 使用导入的功能
current_time = datetime.now()
response = req.get("https://httpbin.org/get")
8.2 创建自己的模块
创建一个名为 test_utils.py 的文件:
# test_utils.py
def assert_status_code(response, expected_code):
"""断言响应状态码"""
assert response.status_code == expected_code, \
f"预期状态码 {expected_code}, 实际得到 {response.status_code}"
def generate_random_email():
"""生成随机测试邮箱"""
import random
return f"test_{random.randint(10000,99999)}@example.com"
在另一个脚本中导入使用:
# main_test.py
import test_utils
# 或者
from test_utils import assert_status_code
# 使用函数
# assert_status_code(response, 200)
熟练与重点:
- 掌握
import语句的各种形式。 - 理解
if __name__ == "__main__":的作用(使得模块既可以导入,也可以直接运行)。 - 知道如何使用
pip安装第三方库(如pip install requests pytest selenium)。
总结与后续学习路径
恭喜你!通过以上学习,你已经掌握了 Python 基础语法的核心内容。作为测试工程师,请务必在以下方面多加练习,达到“熟练”程度:
- 字符串格式化(f-string):用于拼接日志和报告信息。
- 列表和字典的操作:这是你存储和处理测试数据的主要工具。
- 函数定义与调用:编写可复用的测试步骤和工具方法。
- 异常处理:让你的测试脚本更健壮。
- 文件与 JSON 操作:读写配置和测试数据。
- 模块导入:使用
requests,pytest,selenium等强大库。
下一步建议:
- 动手实践:将每个语法点用代码敲一遍,并尝试修改。
- 小项目驱动:写一个脚本,读取一个 JSON 格式的测试用例文件,然后模拟执行并输出测试报告。
- 进军自动化测试框架:在语法熟练后,立即开始学习
pytest测试框架和Selenium/requests库,将语法知识应用于真实的自动化测试场景。
记住,编程是一门实践技能,边学边练,遇到问题多查文档(官方文档、Stack Overflow),你会很快成长为一名合格的自动化测试工程师!

211

被折叠的 条评论
为什么被折叠?



