Python 凭借简洁优雅的语法、丰富的生态库,成为自动化测试脚本开发的首选语言。无论是接口测试、UI 自动化,还是数据驱动测试,扎实的核心语法都是高效编写测试脚本的基础。本文结合测试场景,从基础语法到实战应用,带你一站式掌握 Python 测试开发必备知识点,看完就能动手编写测试用例!
一、变量与数据类型:测试数据的 “存储容器”
测试脚本中离不开各类数据 —— 测试用例 ID、接口请求参数、预期结果等,变量与数据类型就是存储这些数据的核心工具。Python 的动态类型特性无需手动声明类型,赋值即定义,极大提升了脚本编写效率。
核心数据类型及测试场景应用
| 数据类型 | 定义方式 | 核心操作 | 测试场景示例 |
|---|---|---|---|
| 整数(int) | case_id = 1001 | 计数、编号对比 | 测试用例编号、状态码判断(如 200、404) |
| 浮点数(float) | response_time = 0.35 | 数值比较 | 接口响应时间阈值判断(如小于 1 秒) |
| 字符串(str) | url = “https://api.test.com“ | 拼接、替换、查找 | 接口地址拼接、响应结果文本匹配 |
| 列表(list) | test_cases = [1001, 1002, 1003] | 增删改查、遍历 | 存储批量测试用例 ID、请求参数列表 |
| 元组(tuple) | api_config = (“GET”, “https://api.test.com“) | 仅查询 | 存储固定接口配置(请求方法、基础地址) |
| 字典(dict) | test_case = {“case_id”:1001, “params”:{“name”:”test”}, “expected”:”success”} | 按键取值、增删键值对 | 存储单条测试用例完整信息(参数、预期结果) |
| 集合(set) | actual_codes = {200, 400, 500} | 去重、成员判断 | 接口返回状态码去重、合法状态码校验 |
测试场景易错点
- 可变与不可变类型:列表、字典是可变类型(可动态添加测试数据),字符串、元组是不可变类型(如接口基础地址不能直接修改字符)。
- 错误示例:
url = "https://api.test.com"; url[8] = "t"(字符串不可修改) - 正确示例:
url = url.replace("api", "test-api")(生成新字符串)
- 错误示例:
- 字典键的选择:测试用例字典的键建议用字符串(如 “case_id”),避免用列表等可变类型,否则会报错。
- 推荐写法:
test_case = {"case_id":1001, "expected":200}
- 推荐写法:
二、运算符:测试逻辑的 “判断与计算工具”
测试脚本中频繁需要进行条件判断(如响应结果是否符合预期)、数值计算(如响应时间统计),运算符就是实现这些逻辑的核心。
核心运算符及测试场景应用
- 算术运算符:
+(字符串拼接)、/(平均响应时间计算)、%(用例编号分组)- 示例:拼接接口完整地址
base_url = "https://api.test.com"; path = "/login"; full_url = base_url + path
- 示例:拼接接口完整地址
- 比较运算符:
==(预期结果与实际结果对比)、!=(异常场景判断)、<=(响应时间阈值校验)- 示例:判断接口响应是否成功
actual_code = 200; expected_code = 200; is_success = actual_code == expected_code
- 示例:判断接口响应是否成功
- 逻辑运算符:
and(多条件校验)、or(异常场景兼容)、not(反向判断)- 示例:接口正常响应的双重校验
is_pass = (actual_code == 200) and (response_time <= 1.0)
- 示例:接口正常响应的双重校验
- 成员运算符:
in(校验响应结果包含指定字段)、not in(异常信息排查)- 示例:判断响应结果是否包含关键数据
actual_msg = "操作成功"; assert "成功" in actual_msg
- 示例:判断响应结果是否包含关键数据
- 赋值运算符:
+=(统计用例执行次数)、*=(重复执行测试用例)- 示例:累计失败用例数
fail_count = 0; fail_count += 1
- 示例:累计失败用例数
测试脚本实用技巧
- 优先级避坑:多条件判断时用括号明确顺序,如
(actual_code == 200) and (len(data) > 0) - 自增自减替代:Python 无
++/--,用count += 1统计用例执行次数
三、输入输出:测试数据与结果的 “交互桥梁”
测试脚本中常需要读取测试数据(如从控制台输入环境地址)、输出执行结果(如打印用例执行状态),input()和print()是最基础的交互工具。
1. 输出测试结果:print () 与格式化
- 基础输出:打印用例执行状态
print("用例1001执行结果:通过") - 多参数输出:同时打印用例 ID、执行时间
case_id = 1001; exec_time = 0.5; print("用例ID:", case_id, "执行时间:", exec_time, "秒") - 格式化输出(f-string 推荐):优雅展示测试结果
print(f"用例{case_id}执行{status},响应时间{exec_time:.2f}秒")(注::.2f表示保留 2 位小数,适合响应时间展示)
2. 读取测试数据:input () 与类型转换
- 读取字符串:输入接口环境地址
env_url = input("请输入测试环境地址:") - 读取数字:输入超时时间阈值
timeout = int(input("请输入接口超时阈值(秒):")) - 测试场景实战:读取多条测试数据python运行
# 读取3个接口请求参数 param1 = input("请输入第一个请求参数:") param2 = int(input("请输入第二个请求参数(整数):")) param3 = float(input("请输入第三个请求参数(小数):")) # 存储为测试用例字典 test_case = {"params": [param1, param2, param3]}
四、流程控制:测试逻辑的 “执行引擎”
测试脚本需要根据不同条件执行不同逻辑(如响应码 200 则校验结果,500 则记录异常),或重复执行测试用例(如批量执行 10 条用例),这就需要流程控制语句。
1. 条件语句:用例执行的 “分支判断”
- 基础 if:判断用例是否执行python运行
run_case = True if run_case: print("执行测试用例1001...") - if-else:判断用例执行结果python运行
actual_result = "success" expected_result = "success" if actual_result == expected_result: print("用例通过") else: print("用例失败") - if-elif-else:多状态判断(接口响应码处理)python运行
status_code = 400 if status_code == 200: print("接口正常") elif status_code == 400: print("请求参数错误") elif status_code == 500: print("服务器内部错误") else: print("未知响应状态")
2. 循环语句:批量执行测试用例
- for 循环:遍历测试用例列表python运行
# 批量执行3条测试用例 test_cases = [1001, 1002, 1003] for case_id in test_cases: print(f"正在执行用例{case_id}...") # 此处可添加用例执行逻辑 - range () 生成序列:执行指定次数的测试python运行
# 重复执行5次接口请求(压力测试基础) for i in range(5): print(f"第{i+1}次请求接口...") - 循环控制:跳过失败用例或终止循环python运行
test_cases = [1001, 1002, 1003, 1004] for case_id in test_cases: if case_id == 1003: print(f"跳过用例{case_id}") continue # 跳过当前用例,执行下一个 if case_id == 1004: print(f"遇到异常用例{case_id},终止执行") break # 终止整个循环 print(f"执行用例{case_id}")
五、函数:测试脚本的 “复用神器”
测试脚本中很多逻辑会重复出现(如接口请求、结果断言),将这些逻辑封装为函数,可大幅减少重复代码,提升脚本可维护性。
1. 函数定义与测试场景应用
- 基础断言函数:校验测试结果python运行
def assert_result(actual, expected, case_id): """ 断言实际结果与预期结果是否一致 :param actual: 实际结果 :param expected: 预期结果 :param case_id: 测试用例ID :return: 布尔值(True通过,False失败) """ if actual == expected: print(f"用例{case_id}:通过") return True else: print(f"用例{case_id}:失败,实际结果:{actual},预期结果:{expected}") return False - 接口请求函数:封装 HTTP 请求逻辑python运行
def send_request(url, method="GET", params=None): """ 发送HTTP请求(测试场景简化版) :param url: 接口地址 :param method: 请求方法(默认GET) :param params: 请求参数(默认None) :return: 模拟响应结果 """ print(f"发送{method}请求:{url},参数:{params}") # 实际测试中可替换为requests库真实请求 return {"status_code": 200, "data": "success"}
2. 函数调用与参数技巧
- 基础调用:执行断言逻辑python运行
# 调用断言函数 result = assert_result(actual="success", expected="success", case_id=1001) - 默认参数:简化重复配置(如默认请求方法 GET)python运行
# 调用接口请求函数,使用默认GET方法 response = send_request(url="https://api.test.com/login", params={"name":"test"}) - 关键字参数:明确参数含义,避免混淆python运行
# 关键字参数调用,顺序可任意 response = send_request(method="POST", url="https://api.test.com/register", params={"name":"newtest"})
3. 变量作用域:避免测试数据冲突
- 局部变量:函数内部定义的临时数据(如请求参数),外部不可访问
- 全局变量:脚本全局可用的配置(如测试环境地址),修改需用
global声明python运行# 全局变量:测试环境地址 base_url = "https://api.test.com" def update_base_url(new_url): global base_url # 声明修改全局变量 base_url = new_url print(f"更新测试环境地址为:{base_url}") update_base_url("https://api.test-new.com")
六、容器进阶:测试用例的 “高效管理”
列表、字典等容器是测试用例管理的核心工具,合理使用可让测试数据组织更清晰。
1. 列表:批量管理测试用例
- 存储测试用例集合:python运行
# 列表存储多条测试用例(字典格式) test_cases = [ {"case_id":1001, "params":{"name":"test1"}, "expected":"success"}, {"case_id":1002, "params":{"name":"test2"}, "expected":"success"}, {"case_id":1003, "params":{"name":""}, "expected":"参数错误"} ] - 遍历执行用例:python运行
for case in test_cases: print(f"执行用例{case['case_id']}") response = send_request(url="https://api.test.com/test", params=case["params"]) assert_result(actual=response["data"], expected=case["expected"], case_id=case["case_id"])
2. 字典:精准存储用例详情
- 测试用例字典:包含用例全量信息python运行
case_1004 = { "case_id": 1004, "title": "用户登录功能测试", "method": "POST", "url": "https://api.test.com/login", "headers": {"Content-Type": "application/json"}, "data": {"username": "admin", "password": "123456"}, "expected": {"status_code": 200, "msg": "登录成功"} } - 快速获取用例数据:python运行
# 提取请求参数和预期结果 request_data = case_1004["data"] expected_code = case_1004["expected"]["status_code"]
3. 元组:固定配置信息
- 存储不可修改的配置(如接口请求方法、状态码集合):python运行
# 合法的HTTP请求方法(固定不变) valid_methods = ("GET", "POST", "PUT", "DELETE") # 合法的响应状态码 valid_codes = (200, 201, 400, 401, 403, 500)
七、文件操作:测试数据与报告的 “持久化”
测试中常需要读取外部测试数据(如 CSV、TXT 文件)、写入测试报告,文件操作是实现数据持久化的核心。
1. 核心操作流程:打开→读写→关闭
- 读取测试数据文件(推荐 with 语句,自动关闭文件):python运行
# 读取txt格式测试用例数据 with open("test_data.txt", "r", encoding="utf-8") as f: # 逐行读取测试数据 for line in f: case_data = line.strip() # 去除换行符和空格 print(f"读取测试数据:{case_data}") - 写入测试报告:python运行
# 写入测试执行结果到报告文件 test_results = [ "用例1001:通过", "用例1002:通过", "用例1003:失败" ] with open("test_report.txt", "w", encoding="utf-8") as f: f.write("测试报告\n") f.write("="*20 + "\n") for result in test_results: f.write(result + "\n")
2. 测试场景实战:读取 CSV 测试数据(简化版)
python
运行
# 读取CSV格式测试用例(每行格式:case_id,params,expected)
with open("test_cases.csv", "r", encoding="utf-8") as f:
next(f) # 跳过表头
for line in f:
case_id, params, expected = line.strip().split(",")
print(f"执行用例{case_id},参数:{params},预期结果:{expected}")
# 此处可添加用例执行逻辑
八、测试常用库:提升脚本效率的 “利器”
Python 丰富的库生态让测试脚本开发事半功倍,以下是测试场景高频使用的库及基础用法。
1. 标准库:无需安装,开箱即用
- json:处理接口 JSON 数据python运行
import json # 解析接口返回的JSON字符串 response_str = '{"status_code":200, "data":{"name":"test"}}' response_dict = json.loads(response_str) print(f"接口返回名称:{response_dict['data']['name']}") - os:管理测试文件与路径python运行
import os # 查找当前目录下的测试数据文件 test_files = [f for f in os.listdir("./") if f.endswith(".txt")] print(f"找到测试数据文件:{test_files}")
2. 第三方库:测试开发必备
- requests:接口测试核心库(需安装:
pip install requests)python运行import requests # 发送POST接口请求 url = "https://api.test.com/login" data = {"username": "admin", "password": "123456"} response = requests.post(url=url, json=data) # 断言响应状态码 assert response.status_code == 200, f"接口请求失败,状态码:{response.status_code}" print("接口请求成功,响应数据:", response.json()) - pytest:测试框架(需安装:
pip install pytest)python运行import pytest # 编写Pytest测试用例 def test_login_success(): url = "https://api.test.com/login" data = {"username": "admin", "password": "123456"} response = requests.post(url=url, json=data) assert response.status_code == 200 assert response.json()["msg"] == "登录成功" if __name__ == "__main__": pytest.main(["-v", "test_login.py"]) # 执行测试用例
九、测试脚本编写实战:接口测试完整示例
结合以上知识点,编写一个简单的接口测试脚本,涵盖用例管理、接口请求、结果断言、报告生成:
python
运行
import requests
import json
# 全局配置
BASE_URL = "https://api.test.com"
TEST_CASES = [
{
"case_id": 1001,
"title": "正常登录",
"method": "POST",
"path": "/login",
"data": {"username": "admin", "password": "123456"},
"expected": {"status_code": 200, "msg": "登录成功"}
},
{
"case_id": 1002,
"title": "密码错误",
"method": "POST",
"path": "/login",
"data": {"username": "admin", "password": "wrong"},
"expected": {"status_code": 401, "msg": "密码错误"}
}
]
def send_api_request(case):
"""发送接口请求"""
url = BASE_URL + case["path"]
method = case["method"].upper()
if method == "POST":
response = requests.post(url=url, json=case["data"])
else:
response = requests.get(url=url, params=case["data"])
return response
def assert_case_result(case, response):
"""断言用例结果"""
try:
# 断言状态码
assert response.status_code == case["expected"]["status_code"], \
f"状态码不匹配,实际:{response.status_code},预期:{case['expected']['status_code']}"
# 断言响应信息
response_data = response.json()
assert response_data["msg"] == case["expected"]["msg"], \
f"响应信息不匹配,实际:{response_data['msg']},预期:{case['expected']['msg']}"
return True, "通过"
except AssertionError as e:
return False, str(e)
def generate_test_report(results):
"""生成测试报告"""
with open("api_test_report.txt", "w", encoding="utf-8") as f:
f.write("接口测试报告\n")
f.write("="*50 + "\n")
total = len(results)
pass_count = sum([1 for r in results if r["status"] == "通过"])
fail_count = total - pass_count
f.write(f"总用例数:{total},通过:{pass_count},失败:{fail_count}\n")
f.write("="*50 + "\n")
for res in results:
f.write(f"用例ID:{res['case_id']}\n")
f.write(f"用例标题:{res['title']}\n")
f.write(f"执行状态:{res['status']}\n")
f.write(f"备注:{res['remark']}\n")
f.write("-"*30 + "\n")
if __name__ == "__main__":
print("开始执行接口测试...")
test_results = []
for case in TEST_CASES:
print(f"正在执行用例{case['case_id']}:{case['title']}")
response = send_api_request(case)
status, remark = assert_case_result(case, response)
test_results.append({
"case_id": case["case_id"],
"title": case["title"],
"status": status,
"remark": remark
})
print(f"用例{case['case_id']}执行结果:{status},备注:{remark}\n")
# 生成测试报告
generate_test_report(test_results)
print("测试执行完成,报告已生成:api_test_report.txt")
总结
Python 核心语法是测试脚本开发的基础,本文结合测试场景,从变量数据类型、流程控制、函数封装到库的使用,覆盖了测试开发必备知识点。关键在于将语法与测试实际需求结合 —— 用容器管理测试用例、用函数复用核心逻辑、用库提升开发效率。
建议大家结合实际测试项目多做实践,比如用 requests 库做接口测试、pytest 框架管理测试用例,逐步将语法知识转化为实战能力。随着实践深入,你会发现 Python 测试脚本开发不仅高效,还能通过自动化大幅提升测试覆盖率和效率!