目录:导读
前言
1、自动化测试用例设计:代码好处理,接口来说需要
url、body、预期结果、请求方式、路径、接口名称、用例名称、模块、用例id、请求参数类型、请求参数)
代码构建请求可能用到的,自动化测试用例要让代码容易解读。
为什么需要用例名称:如果一个模块有很多接口,比如新增,列出,删除课程,一般按照顺序来测试
如果不按照顺序(有名称可以自动识别用例模块,那个接口的,接口用例写的时候打乱,有用例名称可以自己识别组装成列表)—一般接口用例按照模块顺序写,方便
2、前后端分离项目才好做接口测试,api接口交互来做的(接口返回对应数据json比较多)
前后端不分离发一个接口数据返回在html页面,数据很多,n个单词,不知道接口数据在哪里(可能在某个元素里面)做起来麻烦
接口自动化偏向前后端分离的项目(返回数据格式比较适合,html捞取数据很麻烦)
3、接口用例
最关键的用例多少个取决于请求body不同,请求body里有必填,可选填,每个参数有指定的类型和长度
比如:要求name必须中文的,必填参数,不能有非法字符,有位数,个数,长度,编码设置(int,字符串都有现在)等限制
我们做用例很多时候针对接口用例的数据一般写字典,方便(data和json都能传字典,不需要代码里再转换)
swager框架可以导出对应的接口文档,没有可以导出来–(如果什么都没有,自己写文档)
4、接口项目代码大概框架如下
teach_sq # 项目名称,项目根目录
data # 放接口测试用例数据(用例和配置分开,如果还要配置文件放个config包)
lib # 放封装接口代码的(原代码),按照不同模块api,web的对应去封装
api_lib
lesson.py
login.py #(登录模块)
app_api
web_ui
report # 测试报告文件夹
test_case # 测试用例文件夹
tools # tools:第三方封装工具代码 如加密或者算法模块
execlMethod.py # excel用例表的读取和写入操作
get_MD5.py
conf # 配置文件
config.py
log # 日志模块
5、接口测试代码实战
1)tools文件夹源代码:封装第三方封装工具代码-如加密或者算法模块
import xlrd #读excel模块
from xlutils.copy import copy #写excel(复制excel)
# import xlutils
#1:_读取excel的数据(简单的功能可以直接写函数就行,没必要写成类),
def get_excelData(sheetName,startRow,endRow,body=6,reps=8):
'''
读取excel表函数 ,读取多行的body和reps参数,返回列表套元组的数据[(),(),()]
:param sheetName: 打开的表名
:param startRow: 读取excel开始行
:param endRow: 读取excel结束行
:param body: 读取excel的哪一列,获取body传参
:param reps: 读取excel的哪一列,获取预期响应数据
:return:
'''
excelDir="../data/测试用例-v1.4.xls"
workBook=xlrd.open_workbook(excelDir) #打开excel创建一个excel对象
#sheets=workBook.sheet_names() #看有几个表
#2取对应的表sheet来操作
worksheet=workBook.sheet_by_name(sheetName) #取哪个表传表名sheetName就行
#worksheet.row_values(0) #这是读取一excel表的一整行的,返回一个列表
#我们不需要读取一整行,只需要请求参数,和返回结果就行,读单元格
#获取单元格(单元格怎么获取---表.单元对应的值(行,列))
#return worksheet.cell(1,6).value #2行7列获取的是请求的body #.value代表单元格的值
#return worksheet.cell(1,8).value #2行9列获取的是预期的返回结果
#print(worksheet.nrows) #获取行数,获取所有的行(如果用例一个模块很多接口写在excel里面,新增课程,删除课程,各种用例在一起
#这种获取所有行不可行 )
#所以读取excel用例可以考虑传参,开始多少行和结束多少行
reslist=[]
for one in range(startRow-1,endRow):
#获取每个单元格
reslist.append((worksheet.cell(one,body).value,worksheet.cell(one,reps).value))
return reslist
#2:写入数据(现在没有用框架,把结果写在excel表里面)
def set_excelData(sheetIndex,startRow,endRow,colNum,inData,excelOutDir="../report/res.xls"): #inData传列表或者元组可迭代数据,写很多数据
excelDir="../data/松勤-教管系统接口测试用例-v1.4.xls"
workBook=xlrd.open_workbook(excelDir,formatting_info=True) #打开excel创建一个excel对象
#formatting_info=True,保证excel格式一致(不破坏原表格式)
#格式也复制过去(不破坏原表格式)
newWorkBook=copy(workBook) #把打开的excel复制一个全新的workBook对象 (有的只写不读,有的只读不写),另存其他文件这么写
newWorksheet=newWorkBook.get_sheet(sheetIndex) #newWorksheet全新的excel文件表对象,
#newWorkBook.get_sheet(sheetIndex)获取对应的编号(第一个表)
#获取全新的workbook对象的需要写结果的表对象(表名:sheetIndex传参)
idx=0
for one in range(startRow - 1, endRow): #如果写数据不是从2行开始,从10行开始,range(10,12),indata[one]会越界
newWorksheet.write(one,colNum,inData[idx]) #写单元格,表里面的write写,write(行,列,数据)
idx=idx+1
newWorkBook.save(excelOutDir) #保存路径(保存对象)
if __name__ == '__main__':
print(get_excelData('1-登录接口', 2, 5))
set_excelData('1-登录接口', 2, 5, 9, (1,2,3,4))
import hashlib # 这是加密库
def get_md5_data(psw): # 自己MD5加密--password String md5(‘zr’+111111 +‘hg’)
password = f"zr{psw}hg"
# 1:首先创建一个md5对象
md5 = hashlib.md5()
# 2:完成加密,updata方法加密
md5.update(password.encode("utf-8")) # 对象.方法(需要加密的对象.encode("utf-8"))----加密时候最好设置编码
# 对字符串进行编码后再进行一个加密
# md5(b"zr111111hg") #也可以传二进制数据直接进行编码:如下
# import hashlib
# md5 = hashlib.md5()
# md5.update(b'zr11111111hg')
# print(md5.hexdigest())
# 方法二:一行也可以写
# print(hashlib.md5(b'zr11111111hg')).hexdigest()---这样写也可以,(传bytes类型。可以这么写)
# 3要输出结果,return
return md5.hexdigest()
2)lib源代码文件夹
import requests
import json
from config import HOST
import json
from tools.get_MD5 import get_md5_data #加密函数
class Login:
def login(self,inData,inFlage=True): #登录方法,实例方法
url = f"{HOST}/api/mgr/loginReq"
header = {"Content-Typ": "application/x-www-form-urlencoded"}
payload = json.loads(inData) #多这步转换,万一inData需要转换,转成字符串还是什么
reps = requests.post(url, data=payload, headers=header)
reps.encoding = 'unicode_escape'
if inFlage ==True: #为true默认返回cookie的,这个登录的接口会作为后续接口的前置条件,需要返回cookie
return reps.cookies["sessionid"]
elif inFlage==False: #本身登录接口需要调用校验是否成功
return reps.json()
if __name__ == '__main__':
login1=Login()
print(login1.login('{"username": "auto", "password": "sdfsdfsdf"}', False))
#现在调用函数需要传字符串,因为里面有payload = json.loads(inData)
# indata只能传字符串,里面再转成字典
3)test_case 现在还没有使用到pytest框架,直接把执行的结构写到excel文件夹里
#自动化执行excel表用例
#1:先获取对应的用例数据
import json
from tools.execlMethod import get_excelData,set_excelData
from lib.api_lib.login import Login
testData=get_excelData('1-登录接口', 4, 5)
# 2:数据请求获取对应的数据(跑数据)
reslist=[]
for line in testData:
#3构建登录请求
res =Login().login(line[0],inFlage=False)
#4:判断实际结果和预期结果 if
if res['retcode']==json.loads(line[1])['retcode']:
res="pass"
else:
res = "fail"
reslist.append(res)
#3:写数据到excel
set_excelData('1-登录接口',4,5,9,reslist)
6、接口api编写心得
编写某个模块的源代码的时候,需要考虑这个模块有没有前置条件,
一个模块最好编写一个类函数,看这个类函数里面所有的接口函数特点(模块里面所有接口url是不是一样的,(可以创建课程对象的时候就创建出来,定义成实例对象)
sessionid值,cookie需要sessionid封装—每个接口都需要sessionid(创建课程实例也可以传sessionid封装好一个cookie))
7、面试自动化做到什么程度
1)规范流程
所有得代码传git——>git提交后通过ginkins去触发,自动化角度(脚本去触发,项目版本发布触发自动化脚本执行))
需要搭建服务器(搭建持续集成服务器,cicd),所有的代码环境都在服务器里面
开发角度:版本迭代发布到git进行jinkins自动打包,触发自动化执行
自动化人员角度:通过git传自动化脚本,触发对应场景触发自动化脚本执行
版本变化+脚本变化(都能触发自动化脚本执行)
2)本机跑项目(没有上jinkins持续集成的线路)
代码跑完了生成报告后发邮件(代码仅一个人有)
线上 线下
8、http和web socket
有些接口不一定有requset库,用socket去发的,socket会话,通信(人工智能,物联网,通信比较多,实时性强)
最全Python自动化测试进阶之路视频教学 (全集)
下面是我整理的2025年最全的软件测试工程师学习知识架构体系图 |
一、Python编程入门到精通
二、接口自动化项目实战
三、Web自动化项目实战
四、App自动化项目实战
五、一线大厂简历
六、测试开发DevOps体系
七、常用自动化测试工具
八、JMeter性能测试
九、总结(尾部小惊喜)
人生最珍贵的不是最终抵达的终点,而是沿途突破自我的每个瞬间。当你觉得撑不住时,请记住:蝴蝶破茧时的挣扎,正是它获得飞翔力量的关键。你的坚持,正在为生命谱写最动人的乐章!
别被暂时的风雨模糊了视线!那些看似坎坷的路途,都在引领你走向更美的风景。当别人选择放弃时,你的坚持就是最有力的宣言。向前奔跑吧,整个世界都在期待你的光芒绽放!