技术博客-导航条

Python 测试脚本开发核心语法:从入门到实战上手

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}去重、成员判断接口返回状态码去重、合法状态码校验

测试场景易错点

  1. 可变与不可变类型:列表、字典是可变类型(可动态添加测试数据),字符串、元组是不可变类型(如接口基础地址不能直接修改字符)。
    • 错误示例:url = "https://api.test.com"; url[8] = "t"(字符串不可修改)
    • 正确示例:url = url.replace("api", "test-api")(生成新字符串)
  2. 字典键的选择:测试用例字典的键建议用字符串(如 “case_id”),避免用列表等可变类型,否则会报错。
    • 推荐写法:test_case = {"case_id":1001, "expected":200}

二、运算符:测试逻辑的 “判断与计算工具”

测试脚本中频繁需要进行条件判断(如响应结果是否符合预期)、数值计算(如响应时间统计),运算符就是实现这些逻辑的核心。

核心运算符及测试场景应用

  1. 算术运算符+(字符串拼接)、/(平均响应时间计算)、%(用例编号分组)
    • 示例:拼接接口完整地址base_url = "https://api.test.com"; path = "/login"; full_url = base_url + path
  2. 比较运算符==(预期结果与实际结果对比)、!=(异常场景判断)、<=(响应时间阈值校验)
    • 示例:判断接口响应是否成功actual_code = 200; expected_code = 200; is_success = actual_code == expected_code
  3. 逻辑运算符and(多条件校验)、or(异常场景兼容)、not(反向判断)
    • 示例:接口正常响应的双重校验is_pass = (actual_code == 200) and (response_time <= 1.0)
  4. 成员运算符in(校验响应结果包含指定字段)、not in(异常信息排查)
    • 示例:判断响应结果是否包含关键数据actual_msg = "操作成功"; assert "成功" in actual_msg
  5. 赋值运算符+=(统计用例执行次数)、*=(重复执行测试用例)
    • 示例:累计失败用例数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 测试脚本开发不仅高效,还能通过自动化大幅提升测试覆盖率和效率!