Python4个核心知识点(附完整代码),新手互助,共同进步✨
本文分享了软件测试新手必备的4个Python核心知识点,包含完整代码示例和实际应用场景。第一部分讲解异常处理(try/except/finally),避免脚本崩溃;第二部分介绍JSON操作(dumps/loads),解析接口数据必备;第三部分讲解函数封装,提高代码复用性;第四部分详解文件处理,管理测试数据和日志。文章还包含常见错误总结、测试场景应用和练习题,帮助新手快速掌握基础技能。作者以亲身经历
作为一个入行有2-3个月的软件测试新手,真的太懂新手的迷茫了!刚开始写测试脚本,要么一运行就崩溃,要么接口返回的数据不会解析,要么代码写得乱七八糟,复用性极差,踩了无数坑😭。
之前实习时一边跟着学习,一边整理了自己常用、也最核心的4个Python知识点,包含完整代码示例、知识点总结和实际测试场景应用,纯干货无冗余,都是新手入门必掌握的内容。今天分享出来,和各位同是新手的小伙伴互相交流、一起进步,希望大家少走一些我踩过的弯路~
第一部分:异常处理(新手必学,避免脚本崩溃)
刚开始写测试脚本,我最头疼的就是“脚本崩溃”——有时候是找不到文件,有时候是网络超时,有时候是数据格式错了,一报错整个脚本就停了,还要从头排查问题,浪费好多时间。后来学会了异常处理,终于能让脚本“优雅”报错,再也不用被崩溃搞心态了!
1. 知识点总结
在测试里,程序出现错误太正常了(比如元素找不到、网络超时、数据格式错误),处理不当就会让脚本直接崩溃。异常处理就能解决这个问题,让脚本要么友好报错,要么继续执行,还能帮我们释放资源,避免浪费。
try ... except : 捕获异常(脚本出错时,不崩溃,执行我们写的处理逻辑)
else: 如果没有异常发生,执行此块(比如脚本正常执行完,打印“执行成功”)
finally:无论是否发生异常,一定会执行(重点!常用于关闭浏览器、数据库连接,避免资源占用,新手很容易忘记这一步)
raise:主动抛出异常(比如断言失败时,主动报错,标记用例失败,方便我们排查)
raise 用途(新手常用场景):
校验数据不合法时主动报错(比如测试数据为空,直接报错,不用等脚本执行到后面再崩溃)
测试异常处理是否生效(自己主动抛错,看脚本能不能正常捕获)
发现问题直接中断流程(比如接口返回码不对,直接中断,节省执行时间)
补充:if 'file' in locals(): (新手避坑点)
1. 判断变量是否被创建成功
2. 防止文件没打开就执行close(),导致新的错误(我刚开始就踩过这个坑,文件没打开,却写了close(),又报了新错)
分享一个我自己记的简单口诀,新手容易记住:
try:尝试做事(执行可能出错的代码)
except:自己处理错误(出错了不崩溃,执行我们写的提示)
raise:自己不兜着了,抛给上级处理(自己处理不了,主动报错)
finally:无论如何都要收尾关资源(不管错不错,都要关闭浏览器、文件)
完整代码示例(可直接复制,新手练手必备)
try: file = open("D:/python/test.txt")
#执行文件操作
content = file.read()
print("文件读取成功")
#主动抛出异常(演示用,新手可以试试注释掉这行,看脚本正常执行的效果)
raise Exception("主动触发一个测试异常")
except FileNotFoundError:
print("文件不存在")
#捕获其他类型的错误,e是错误信息,方便我们排查问题
except Exception as e:
print(f"发生错误:{e}")
finally:
#无论是否报错,都会执行,新手一定要记得写!
print("==进入 finall块===")
if 'file' in locals():
file.close() print("文件已关闭,资源释放")
结果如下:
2. 基本结构
(1)基本结构(最基础,新手先掌握这个)
try:
num = int("abc")#这里会报错(字符串转整数,肯定错)
except ValueError:
#捕获特定异常,给出友好提示,不崩溃
print("捕获到数值转换错误")
结果如下:

(2)多重捕获与资源清理(Finally)
实际测试中,可能会出现多种错误,这个结构能处理多种错误,还能确保资源释放,新手一定要掌握,比如打开浏览器后,不管脚本对错,都要关闭浏览器。
try:
file = open("D:/python/test.txt")
#执行操作
except FileNotFoundError:
print("文件不存在")
except Exception as e:
print(f"发生未知错误{e}")
finally:
#无论是否报错,都会执行,释放资源
if 'file' in locals():
file.close() print("资源已经释放")
结果如下:

(3)主动抛出与自定义异常
这个稍微进阶一点,但很实用!比如测试数据为空时,我们可以主动报错,让问题更明显,不用等脚本执行到后面才发现错误。
class TestDataError(Exception):
pass
def check_data(data):
if not data:
raise TestDataError("测试数据不能为空")
try:
check_data(None)
except TestDataError as e:
print(f"测试数据校验失败:{e}")
结果如下:
完整代码示例(重复演示,方便新手复制练手)
try:
file = open("D:/python/test.txt")
#执行文件操作
content = file.read()
print("文件读取成功")
#主动抛出异常(演示用)
raise Exception("主动触发一个测试异常")
except FileNotFoundError:
print("文件不存在")
#捕获其他类型的错误,e是错误信息,方便打印查看
except Exception as e:
print(f"发生错误:{e}")
finally:
#无论是否报错,都会执行
print("==进入 finall块===")
if 'file' in locals():
file.close()
print("文件已关闭,资源释放")
运行结果:
3. 常见错误总结(新手高频踩坑!)
整理了我刚开始写代码时,经常遇到的几种错误,每个错误都附了示例,新手可以对照着看,避免踩坑~
①ZeroDivisionError → 除以 0 10 / 0 # 报错 ZeroDivisionError(我刚开始不小心写过,直接崩溃)
② FileNotFoundError → 文件找不到 open("aaa.txt") # 文件不存在 → FileNotFoundError(路径写错、文件名写错都会报这个错)
③KeyError → 字典 key 不存在 d = {"name":"aa"} d["age"] # 报错 KeyError(字典里没有age这个键,新手很容易写错键名)
④AssertionError → assert 条件不满足(自动化测试最常见,用例失败会报这个错)
⑤TypeError:类型不被接受(比如用列表转整数,类型不对)
⑥ValueError:值错误(输入的值不对、不合法)(类型被接受但内容不合格) int("abc") # 报错 ValueError(类型合法,值不合法) int([1,2]) # 报错 TypeError(类型不合法)
错误代码案例(新手可以复制运行,看看报错效果)
这个案例包含了上面的几种错误,还有主动抛异常的方法,新手可以注释掉不同的代码,看看每种错误的报错效果,加深记忆~
# 演示:ZeroDivisionError、FileNotFoundError、KeyError、AssertionError
# 包含:系统自动抛异常 + 自己 raise 主动抛异常
def test_error():
try:
# ======================
# 1. ZeroDivisionError 除以0错误
# ======================
# a = 10 / 0
# ======================
# 2. FileNotFoundError 文件不存在
# ======================
# open("不存在的文件.txt")
# ======================
# 3. KeyError 字典键不存在
# ======================
# d = {"name": "张三"}
# print(d["age"])
# ======================
# 4. AssertionError 断言失败
# ======================
# age = 15
# assert age >= 18
# ======================
# ✅ 重点:主动 raise 抛出异常(人为制造错误)
# ======================
raise ZeroDivisionError("我主动抛出除零错误!")
except ZeroDivisionError as e:
print("捕获到:ZeroDivisionError")
print("错误信息:", e)
# raise # 这里加raise = 继续抛给上层
except FileNotFoundError as e:
print("捕获到:FileNotFoundError")
print("错误信息:", e)
except KeyError as e:
print("捕获到:KeyError")
print("错误信息:", e)
except AssertionError as e:
print("捕获到:AssertionError")
print("错误信息:", e)
# 调用测试
test_error()
运行结果:

4. 测试场景应用(新手实际工作中会用到!)
分享两个我实际工作中用到的场景,新手可以参考,知道学了异常处理能用来做什么~
①UI自动化:当页面上找不到某个按钮时,捕获NoSuchElementException,截图并记录日志,而不是让脚本崩溃(不然前面执行的用例都白跑了)
②接口测试:当接口返回码不是200时,抛出异常标记测试失败,方便我们后续查看哪些用例失败了
5. 练习题(新手练手必备)
这些练习题都是我当时练手的,难度不高,能帮我们巩固异常处理的知识点,新手可以试着写一写,有不会的可以留言交流~
题目一
#案例
def divide(a,b):
try:
result = a/b
except ZeroDivisionError:
print("错误,除数不能为0")
return None
except TypeError:
print("错误请输入数字")
return None
else:
print("计算成功")
return result
finally:
print("计算结束")
print(divide(10, 2))
print(divide(10, 0))
运行结果:

题目二
编写一个函数 login_check(username, password),这个是登录校验的常用函数,新手一定要练!
-
如果 username 为空,抛出 ValueError("用户名不能为空")。
-
如果 password 长度小于 6 位,抛出 ValueError("密码长度不能小于 6 位")。
-
使用 try...except 调用该函数,捕获异常并打印友好的错误信息,确保程序不崩溃。
def login_check(username,password):
'''
登录校验函数
:param username:用户名
:param password:密码
:raises ValueError:用户名空/密码过于简短时抛出错误
'''
#1.判断用户名是否为空
if not username:
#主动报错
raise ValueError("用户名不能为空")
#2.判断密码是否小于6位
if len(password) < 6:
raise ValueError("密码长度不能小于6位")
#调用函数(try...except捕获异常)
if __name__ == '__main__':
#测试场景1.用户名为空时(会报错)
try:
login_check("","12345")
print("登录校验成功")
except ValueError as e:
print("登录失败:",e)
#测试场景2:密码太短(会报错)
try:
login_check("张三", "123")
print("密码校验成功")
except ValueError as e:
print("登录失败:",e)
#测试场景3:参数正确(正常通过)
try:
login_check("admin", "123456")
print("登录校验成功")
except ValueError as e:
print("登录失败:",e)
运行结果:
第二部分:JSON操作(接口测试重中之重!)
刚做接口测试的时候,我完全搞不懂JSON是什么,看到接口返回的一串字符串就头大,不知道怎么取值、怎么断言,后来专门花时间学了JSON操作,才发现原来这么简单,现在分享给和我一样刚接触接口测试的新手~
1. 知识点总结
这是接口测试最重要的部分!接口请求体和响应体通常都是JSON格式,不会JSON操作,基本做不了接口测试,新手一定要重点掌握~
-
模块:import json(先导入模块,才能使用JSON相关的方法,新手别忘了这一步)
-
字典/列表 《————》 JSON字符串:(最常用,记牢这两个方法)
-
json.dumps(): Python对象转JSON字符串(序列化,发送接口请求时会用到)
-
json.loads(): JSON字符串转Python对象(反序列化,解析接口响应体时会用到)
-
-
文件 <-> JSON:(保存、读取测试数据时会用到)
-
json.dump(): 写入 JSON 文件。
-
json.load(): 读取 JSON 文件。
-
例子(新手可以复制运行,看看效果):
import json
#1.字典转JSON字符串(发送请求前)
data = {"username":"test","pwd":"123"}
json_str = json.dumps(data)
print(type(json_str))#<class 'str'>
#2.JSON字符串转字典(收到响应后)
response_str = '{"code":200,"msg":"success"}'
res_dict = json.loads(response_str)
print(res_dict)
运行结果:

2. 测试场景应用(新手实际工作场景)
分享三个我实际工作中常用的场景,新手可以对应着练习,很快就能掌握:
-
接口断言: 接口返回的是 JSON 字符串,需要用 loads 转成字典,然后断言 data['code'] == 200(判断接口是否正常返回)。
-
构造请求: 将测试数据字典 dumps 成字符串发送给服务器(比如登录请求,需要把账号密码转成JSON格式发送)。
-
测试数据管理: 将复杂的测试数据保存在 .json 文件中,需要时读取,不用每次都写重复的代码,节省时间。
3. Python字典和JSON字符串的区别(新手必分清!)
我刚开始就经常混淆这两个,导致代码报错,后来整理了它们的区别,再也没踩过坑,新手一定要分清~
字典:是Python里的数据对象(内存里的东西,程序能用)
data = {
"name": "小明",
"age": 18,
"is_student": True
}
特点:
-
是 Python 数据类型,程序能直接使用
-
可以用 data["name"] 直接取值(很方便)
-
键可以单引号、双引号都行(新手怎么写都可以)
-
布尔值:True False 首字母大写
JSON:是字符串(纯文本、用来传输、保存)
'{
"name": "小明",
"age": 18,
"is_student": true
}'
特点:
-
本质就是一串字符串,外面被引号包着,程序不能直接取值
-
必须双引号,不能单引号(新手容易错,一定要注意)
-
布尔小写:true false(和字典的区别,报错时可以检查这里)
-
不能直接 json["name"] 取值,必须先用loads转成字典
第三部分:函数(代码复用神器,新手必学!)
刚开始写代码,我都是把所有代码堆在一起,写一个登录用例写一遍打开浏览器、输入账号密码的代码,不仅麻烦,后期修改也不方便,后来学会了函数封装,代码简洁了很多,也能重复使用,效率提升太多了!
1. 知识点总结
函数是代码复用的核心,测试中,我们不会把所有代码写在一个文件里,而是封装成函数,需要的时候直接调用,新手一定要养成封装函数的习惯。
-
def:定义函数(用def开头,后面跟函数名和参数)
-
参数:位置参数、默认参数(def func(a,b=0))、可变参数(*args,**kaef)。新手先掌握位置参数和默认参数就够了。
-
return:返回结果(测试中常用于返回断言结果或提取的数据,比如调用函数后,返回接口返回的内容)
-
作用域:局部变量VS全局变量(简单说,函数里定义的变量,只有函数里能用,外面不能用,新手不用太复杂,先记住这个就行)
2. 测试场景应用(新手高频使用)
-
封装操作:将“打开浏览器”、“输入用户名”、“点击登录”封装成一个login()函数,多个用例可直接调用,不用重复写代码。
-
数据驱动:编写一个函数,接受不同测试数据,执行相同测试逻辑(比如多组账号密码登录测试,不用写多个重复的脚本)
-
PO模式(Page Object):每个页面对应一个类,页面上的操作对应类中的方法(函数),后期维护更方便(新手可以先了解,慢慢掌握)
3. 代码示例(新手可以直接复制练手)
def send_request(url,method="GET",timeout=30):
print(f"正在发送{method}请求到{url},超时时间:{timeout}s")
return True#模拟请求成功
#调用
send_request("https://www.baidu.com/")
send_request("https://www.baidu.com/", method="POST", timeout=60)
运行结果;

练习题(新手练手,巩固函数知识点)
这个练习题很实用,是测试数据生成器,新手可以试着写一写,能帮我们掌握函数的默认参数和返回值~
题目:编写一个测试数据生成器函数 generate_user_data(role="user")。
-
如果 role 是 "admin",返回字典 {"username": "admin001", "permission": "all"}。
-
如果 role 是 "user" (默认),返回字典 {"username": "user001", "permission": "read"}。
-
调用该函数,打印返回的字典内容。
def generate_user_data(role="user"):
'''
测试数据生成器函数
:param role: 角色参数,默认值为 "user"
:return: 根据角色返回对应的用户信息字典
'''
#判断角色是否为管理员
if role == "admin":
return {"username": "admin001", "permission": "all"}
#默认角色(普通用户)
else:
return{"username": "user001", "permission": "read"}
# 1. 使用默认参数 role="user"
user_data = generate_user_data()
print("默认用户数据:", user_data)
# 2. 传入参数 role="admin"
admin_data = generate_user_data(role="admin")
print("管理员数据:", admin_data)
运行结果:

第四部分:文件处理(测试数据/日志管理必备)
刚工作的时候,我经常需要读取测试用例、写入测试日志,一开始不知道怎么操作文件,每次都手动输入测试数据,浪费好多时间,学会文件处理后,能自动读取、写入数据,效率提升太多了,新手一定要掌握!
文件打开模式说明(新手必记,容易混淆)
|
模式 |
说明 |
文件不存在时 |
|---|---|---|
|
r |
只读 |
报错(新手经常忘,打开不存在的文件用r模式,会直接崩溃) |
|
w |
写入,不能读(覆盖原有内容) |
创建新文件(注意:会覆盖原有内容,新手慎用) |
|
a |
追加(末尾追加) |
创建(不会覆盖原有内容,写日志常用) |
|
r+ |
读写(追加) |
报错 |
1. 知识点总结
测试中,我们经常需要读取测试用例数据,或写入测试日志/报告,这些都离不开文件处理,新手重点掌握open()函数和常用方法就够了。
-
open():打开文件(核心函数,必须掌握)
-
模式: 'r' (读), 'w' (写,覆盖), 'a' (追加), 'encoding='utf-8'' (防止乱码,新手一定要加,不然容易出现中文乱码)
-
with 语句: 强烈推荐!自动管理文件关闭,防止文件占用或数据丢失(新手容易忘记close(),用with语句就不用管了)
-
常用方法:
-
read():将文件全部内容一次性读出来(适合小文件)
-
readline():调用一次读一行,适合逐行处理(大文件常用)
f = open("test.txt", "r", encoding="utf-8") line1 = f.readline() # 第一行 line2 = f.readline() # 第二行 f.close() print(line1) # admin001 print(line2) # user001 -
#结果 ["admin001\n", "user001\n", "test001"]readlines():作用:把文件每一行当作一个元素,全部放进列表
返回类型:列表 list [str]
特点:最常用!方便 for 循环遍历) -
f = open("test.txt", "r", encoding="utf-8") lines = f.readlines() f.close() print(lines) #结果 ["admin001\n", "user001\n", "test001"] -
write():写入一个字符串(不会自动换行!要换行自己加 \n,新手容易忘加,导致内容都堆在一起)
-
f = open("out.txt", "w", encoding="utf-8") f.write("admin001\n") # \n 表示换行 f.write("user001\n") f.close() #文件内容 admin001 user001 -
writelines():把列表里的字符串依次写进去,也不会自动换行!
-
lines = ["admin001\n", "user001\n", "test001\n"] f = open("out.txt", "w", encoding="utf-8") f.writelines(lines) f.close()
-
2. 测试场景应用
-
读取配置:从.txt或者.ini文件读取数据库地址、环境URL,不用硬编码,后期修改方便。
-
写入日志:将测试执行步骤和结果写入log.txt,方便后续排查问题(比如用例失败了,查看日志就能知道哪里错了)。
-
读取用例:从CSV文件读取多组账号密码进行批量测试,不用手动输入,节省时间。
3. 写入文本文件(新手实操示例)
#文件操作
#打开文件的模式①只读模式:“r”只能看不能改,文件不存在会报错
#②写入模式:“w”清空原有内容,没有文件会创建③追加功能:“a”在末尾加内容,不会删除原有
f=open("test.txt","r",encoding="utf-8") #如果这个text文件和这个pyhton在同一目录下
#方法一:用正斜杠 /(最简单,不用转义,推荐!)
f=open("D:/python/test.txt","r",encoding="utf-8")#文件在其他位置,填入文件的绝对路径
#方法二:用双反斜杠 \\ 转义(标准写法)
f = open("D:\\python\\test.txt", "w", encoding="utf-8")
f=open("test.txt","w",encoding="utf-8")
f.write("写入你想加入文件的内容hh")#写入内容
f.close()
#写入文件(会清空原来的内容)
f = open("D:/python/test.txt","w",encoding = "utf-8")
f.write("第一行内容\n")
f.write("第二行内容\n")
f.write("第三行内容\n")
f.close()
#追加内容(不清空,在末尾追加)
f = open("D:/python/test.txt","a",encoding = "utf-8")
f.write("这是我追加的内容\n")
f.close()
4. 读取文件内容(新手实操示例)
f = open("D:/python/test.txt","r",encoding = "utf-8")
content = f.read()
print(content)
f.close()
#逐行获取(大文件必备)
f = open("D:/python/test.txt","r",encoding = "utf-8")
for line in f:
print(line,end="")#逐行输出,不额外换行
f.close()
5. 路径怎么写(新手高频踩坑!)
我刚开始经常因为路径写错,导致文件找不到,报错FileNotFoundError,整理了两种路径写法,新手可以参考:
-
1. 相对路径(与py文件在同一个文件夹):直接写文件名,简单方便
f = open("test.txt", "r", encoding="utf-8") -
2. 绝对路径(写完整地址,文件在其他位置时用):两种写法,推荐第一种
-
f = open("D:/python/test.txt", "r", encoding="utf-8")#正斜杠(推荐) -
f = open("D:\\python\\test.txt", "r", encoding="utf-8")#双反斜杠(转义)
-
5. 读取文件内容
f = open("D:/python/test.txt","r",encoding = "utf-8")
content = f.read()
print(content)
f.close()
#逐行获取(大文件必备)
f = open("D:/python/test.txt","r",encoding = "utf-8")
for line in f:
print(line,end="")#逐行输出,不额外换行
f.close()
运行结果:

方法一(普通方式,手动关闭文件)
f=open("test.txt","r",encoding="utf-8")#打开文件
content=f.read()#读取文件内容
print("文件内容")
print(content)
f.close()#必须要写,否者或占用公共资源
方法二(with语句,推荐新手)
with open("D:/python/test.txt","r",encoding="utf-8") as f:
content = f.read()
print(content)
#退出缩进,文件自动关闭
6. 案例(新手实操,必练!)
这个案例很实用,模拟测试用例的创建、读取和统计,新手可以复制运行,练手文件处理的知识点,我当时就是靠这个案例,掌握了文件的读写操作~
需求:创建一个名为 cases.txt 的文件,写入三行测试用例描述(例如:"登录成功", "密码错误", "用户不存在"),编写代码读取该文件,逐行打印内容,并统计一共有多少个测试用例。
方法一:
#打开文件,如果没有创建
f = open("D:\\python\\test4-2.txt","w",encoding="utf-8")
f.write("登陆成功\n")
f.write("密码错误\n")
f.write("用户不存在\n")
f.close()#写入完成,关闭保存
#读取文件
f = open("D:\\python\\test4-2.txt","r",encoding="utf-8")
lines = f.readlines()#读取所有行
#逐行打印
for line in f:
print(line,end="")
print(f"一共有{lines}个测试用例")
f.close()
方法二:
#创建cases.txt,并写入3条测试用例
with open("D:\\python\\case.txt","w",encoding="utf-8") as f:
f.write("登陆成功\n")
f.write("密码错误\n")
f.write("用户不存在\n")
#读取文件逐行打印并统计总数
with open("D:\\python\\case.txt","r",encoding="utf-8") as f:
# 读取所有行,返回列表
lines = f.readlines()
#逐行打印
for line in lines:
print(line,end="")
#统计总数:列表的长度就是用例个数
print(f"\n测试用例总数:{len(lines)} 个")
方法一运行结果:
![]()
方法二运行结果:

基础铺垫:if __name__ == '__main__' 与断言
刚开始写代码的时候,完全不懂这行代码的意思,直到一次把自己的文件导入给同事,发现自己写的测试代码也跟着执行了,才明白它的作用,现在整理清楚,分享给和我一样的新手!
1. if __name__ == '__main__':
简单说就是:这个文件被「直接运行」时,才执行下面的测试代码;如果这个文件被别人「导入调用」,下面的代码就不执行。新手一定要记住,不然很容易出现代码混乱的情况~
2. 断言(assert)
这是自动化测试的核心!刚开始我以为断言没用,直到写自动化脚本时,不知道怎么判断用例是否通过,才发现断言就是“自动判断对错”的神器,不用手动去核对结果,太省心了。
核心逻辑:断言 预期结果 == 实际结果
-
相等 → 安静通过(用例成功)
-
不等 → 报错(AssertionError,用例失败)
assert 1 + 1 == 2 # 对 → 安静通过
assert 1 + 1 == 3 # 错 → 抛 AssertionError
最后:致和我一样的测试新手
写这篇文章的时候,想起自己刚入行的迷茫,不知道该学什么、怎么学,经常因为写不出脚本、脚本崩溃而焦虑,但是慢慢坚持下来,一点点积累,也能慢慢上手。
以上4个知识点,是我之前整理的,也是Python测试新手最常用、最核心的内容,每一个知识点都附了完整代码和实际场景,新手可以直接复制练手。
软件测试这条路,新手难免会踩坑,希望这篇分享能帮到和我一样的小伙伴,我们互相交流、互相鼓励、共同进步,慢慢从新手成长为能独当一面的测试工程师✨
如果大家有更好的学习方法、或者有不懂的问题,欢迎在评论区留言,我们一起探讨、一起进步!
更多推荐



所有评论(0)