在Postman,JMeter中进行接口测试,用过 CSV 数据文件驱动的方式来做。
在Python中,也可以进行数据驱动进行单接口的测试。
主要数据文件

  • json文件
  • yaml文件
  • csv文件
  • Excel文件

json文件操作

https://docs.python.org/zh-cn/3/library/json.html

json模块是Python自带的模块,可以对json文件进行编码和解码。

解析json文件

定义json文件
data.json

  1. {
  2. "casename":"登录",
  3. "url":"http://49.233.108.117:28019/api/v1/user/register",
  4. "body":{
  5. "loginName": "17011112222",
  6. "password": "123456"
  7. }
  8. }

解析json文件。

  1. """
  2. 文件解析
  3. """
  4. import json
  5. # 打开json文件
  6. with open('./data.json',mode='r',encoding='utf8') as file:
  7. # 加载json文件
  8. data = json.load(file)
  9. # json文件中的内容转换为字典格式。
  10. print(data,type(data))

保存json文件

使用json的dump方法可以将数据保存到文件中

  1. """
  2. 文件解析
  3. """
  4. import json
  5. import requests
  6. # 打开json文件
  7. with open('./data.json',mode='r',encoding='utf8') as file:
  8. # 加载json文件
  9. data = json.load(file)
  10. # json文件中的内容转换为字典格式。
  11. print(data,type(data))
  12. r = requests.post(data['url'],json=data['body'])
  13. print(r.json())
  14. # 将服务器返回的结果保存到data中
  15. data["result"] = r.json()
  16. # 将data数据保存到data.json中
  17. with open('./data.json',mode='w',encoding='utf8') as f:
  18. # 将数据存放在文件中
  19. json.dump(data,f,ensure_ascii=False)

执行完成之后 可以将运行的结果保存到 data.json 文件中。

yaml文件操作

yaml 文件教程
https://www.ruanyifeng.com/blog/2016/07/yaml.html

yaml文件解析
https://pyyaml.org/

安装pyyaml

python本身并不支持yaml文件的解析,需要安装第三方的库进行文件解析。

  1. pip install pyyaml

准备yaml数据文件

data.yaml

  1. casename: 登录
  2. url: http://49.233.108.117:28019/api/v1/user/register
  3. body:
  4. loginName: 17011112222
  5. password: 123456

解析yaml文件

使用yaml模块的load方法进行加载。

  1. import yaml
  2. # 打开yaml文件
  3. with open('./data.yaml',mode="r",encoding="utf8") as file:
  4. # 添加 loader 加载器
  5. data = yaml.load(file,Loader=yaml.SafeLoader)
  6. print(data,type(data))

保存yaml文件

使用 yaml文件的 dump 方法 保存数据。

  1. import requests
  2. import yaml
  3. # 打开yaml文件
  4. with open('./data.yaml',mode="r",encoding="utf8") as file:
  5. # 添加 loader 加载器
  6. data = yaml.load(file,Loader=yaml.SafeLoader)
  7. print(data,type(data))
  8. r = requests.post(data["url"],json=data["body"])
  9. print(r.json())
  10. data["result"] = r.json()
  11. # 把data数据存放到文件中
  12. with open('./data.yaml',encoding='utf8',mode='w') as f:
  13. # 将结果保存到文件中
  14. yaml.safe_dump(data,f,allow_unicode=True)

csv文件操作

https://docs.python.org/zh-cn/3/library/csv.html
不需要安装,python自带,可以直接使用。

csv文件写入

  1. import csv
  2. with open('./data.csv',mode='w',encoding='utf8',newline='') as file:
  3. # 写入csv文件
  4. f = csv.writer(file)
  5. f.writerow(["用户名","密码"])
  6. for i in range(10):
  7. f.writerow([f"test{i}","123456"])

这里需要注意: newline=”” 主要是为写入文件的时候 新的一行不能换行。
image.png

读取csv数据文件

  1. """
  2. 文件解析
  3. """
  4. # 导入csv模块
  5. import csv
  6. with open('./data.csv',mode='w',encoding='utf8',newline='') as file:
  7. # 写入csv文件
  8. f = csv.writer(file)
  9. f.writerow(["用户名","密码"])
  10. for i in range(10):
  11. f.writerow([f"test{i}","123456"])
  12. with open('./data.csv',mode='r',encoding='utf8') as f:
  13. # 读取文件
  14. lines = csv.reader(f)
  15. next(lines) #去掉第一行内容
  16. # 循环里面的内容
  17. for line in lines:
  18. print(line)

读取csv文件内容。并将接口运行的新结果 保存到新文件中。

data.csv

csv文件读取内容,并将结果保存到文件中

  1. """
  2. 文件解析
  3. 读取csv文件中的内容,发送请求,并将服务器返回的结果进行保存
  4. """
  5. # 导入csv模块
  6. import csv
  7. # 读取csv数据
  8. import json
  9. import requests
  10. testdata=[]
  11. with open('./data.csv',mode='r',encoding='utf8') as file:
  12. lines = csv.reader(file)
  13. headers = next(lines)
  14. # 表头添加新的字段
  15. headers.append('result')
  16. # 添加表头
  17. testdata.append(headers)
  18. for line in lines:
  19. print(line)
  20. # 请求地址
  21. url = line[0]
  22. # 请求方法
  23. method = line[1]
  24. # 请求数据
  25. data = line[2]
  26. print(type(data),data)
  27. # 字符串转换为 字典
  28. data_dict = json.loads(data)
  29. print(data_dict,type(data_dict))
  30. if method=='post':
  31. r = requests.post(url,json=data_dict)
  32. print(r.json())
  33. # 将服务器返回结果 保存list 中
  34. # 将字典转换为字符串类型
  35. result_str = json.dumps(r.json(),ensure_ascii=False)
  36. line.append(result_str)
  37. print(line)
  38. testdata.append(line)
  39. # 执行完成之后, 查看 testdata数据
  40. print(testdata)
  41. # 将testdata中的数据 写入到csv文件中
  42. with open('./data_result.csv',mode='w',encoding='utf8',newline='') as f:
  43. cf = csv.writer(f)
  44. for data in testdata:
  45. cf.writerow(data)

这里主要需要使用到 数据转换。

  • 字符串 转 字典 json.loads() 方法。
  • 字典转 字符串 json.dumps() 方法。

Excel文件操作

使用openpyxl 模块进行安装。

安装

  1. pip install openpyxl

写入Excel文件

  1. """
  2. 文件解析
  3. 读取Excel文件中的内容,发送请求,并将服务器返回的结果进行保存
  4. """
  5. # 导入openpyxl
  6. import json
  7. from openpyxl import Workbook
  8. # 写入Excel文件
  9. wb = Workbook() # 创建workbook
  10. # 使用默认的工作表
  11. ws = wb.active
  12. # 工作表中添加内容 添加一列内容
  13. ws.append(["url",'method','data'])
  14. data = {
  15. "loginName": "17011112222",
  16. "password": "123456"
  17. }
  18. # 将字典格式转换为字符串保存到excel文件中
  19. ws.append(['http://49.233.108.117:28019/api/v1/user/register','post',json.dumps(data)])
  20. # 保存到excel文件中
  21. wb.save('./data.xlsx')

读取Excel文件

  1. import json
  2. # 读取Excel文件
  3. from openpyxl import load_workbook
  4. # 加载excel文件
  5. wb = load_workbook(filename='./data.xlsx')
  6. # 打开默认的工作薄
  7. ws = wb.active
  8. # 循环工作表中的数据 从第1行,第1列开始读取数据
  9. for line in ws.iter_rows(min_row=1,max_row=ws.max_row,
  10. min_col=1,max_col=ws.max_column,values_only=True):
  11. print(line)

作业

根据如下Excel文件
image.png
设计自动化代码
要求:

  1. 根据Excel中提供请求数据,能够自动发送请求。
  2. 将服务器返回的结果存到Excel文件中【运行结果】
  3. 发送请求的时候需要有日志记录。

测试用例.xlsx

下载附件。

  1. """
  2. 文件解析
  3. Excel文件中的内容,发送请求,并将服务器返回的结果进行保存
  4. """
  5. # 导入openpyxl
  6. import json
  7. # 读取Excel文件
  8. from openpyxl import load_workbook
  9. import requests
  10. # 加载excel文件
  11. wb = load_workbook(filename='./测试用例.xlsx')
  12. # 打开默认的工作薄
  13. ws = wb.active
  14. testdata = []
  15. # 循环工作表中的数据
  16. for line in ws.iter_rows(min_row=1,max_row=ws.max_row,
  17. min_col=1,max_col=ws.max_column,values_only=True):
  18. # print(line)
  19. # print(f'现在开始运行{line[0]},请求方法是{line[1]},请求路径为{line[2]},请求数据{line[3]}')
  20. if line[1] == "post":
  21. # 发送请求,因为从excel文件中读取出来的数据默认为字符串格式,将字符串转换为字典
  22. r = requests.post(url=line[2],json=json.loads(line[3]))
  23. # print(f'服务器返回结果为{r.json()}')
  24. testdata.append((line[0],line[1],line[2],line[3],r.text))
  25. else:
  26. testdata.append(line)
  27. # 读取完成所有的数据之后
  28. print(testdata)
  29. # 将数据保存到文件中
  30. from openpyxl import Workbook
  31. wb = Workbook()
  32. ws = wb.create_sheet("测试用例执行")
  33. for data in testdata:
  34. ws.append(data)
  35. wb.save('测试用例-执行.xlsx')