2022年 11月 9日

python习题#讲解13参数化讲解python+requests+pytest接口自动化

1.先了解项目目录架构

        测试框架
       目录结构
       python package类文件夹:1.api        2.scripts        3.common
       directory类文件夹:1.data        2.report
       项目根目录文件:1.config.py        2.pytest.ini

2.参数化步骤

1)api文件夹中封装登录.py

  1. #登录
  2. import requests#导包
  3. class Ihrmlogin(object):#封装登录类
  4. @classmethod#类方法
  5. def login(cls,json):#封装登录方法
  6. rep= requests.post("http://ihrm-test.itheima.net/api/sys/login",json= json)
  7. return rep#发送登录请求返回登录数据

2)data文件夹中放参数化数据.json

  1. [
  2. {
  3. "desc": "登陆成功",
  4. "req_data": {
  5. "mobile": "13800000002",
  6. "password": "123456"
  7. },
  8. "status_code": 200,
  9. "success": true,
  10. "code": 10000,
  11. "message": "操作成功"
  12. },
  13. {
  14. "desc": "手机号未注册",
  15. "req_data": {
  16. "mobile": "11777771111",
  17. "password": "123456"
  18. },
  19. "status_code": 200,
  20. "success": false,
  21. "code": 20001,
  22. "message": "用户名或密码错误"
  23. },
  24. {
  25. "desc": "密码错误",
  26. "req_data": {
  27. "mobile": "13800000002",
  28. "password": "12345678"
  29. },
  30. "status_code": 200,
  31. "success": false,
  32. "code": 20001,
  33. "message": "用户名或密码错误"
  34. },
  35. {
  36. "desc": "多参",
  37. "req_data": {
  38. "mobile": "13800000002",
  39. "password": "123456",
  40. "abc": "123"
  41. },
  42. "status_code": 200,
  43. "success": true,
  44. "code": 10000,
  45. "message": "操作成功"
  46. },
  47. {
  48. "desc": "少参",
  49. "req_data": {
  50. "mobile": "13800000002"
  51. },
  52. "status_code": 200,
  53. "success": false,
  54. "code": 20001,
  55. "message": "用户名或密码错误"
  56. },
  57. {
  58. "desc": "无参",
  59. "req_data": null,
  60. "status_code": 200,
  61. "success": false,
  62. "code": 99999,
  63. "message": "系统繁忙"
  64. }
  65. ]

2.1)data文件夹中也可以用w写入json数据.py

  1. # my_list = [{"desc": "正确的用户名和密码", "username": "admin", "password": "123456", "code": "8888", "expect": "登录成功"},
  2. {"desc": "用户名不存在", "username": "root", "password": "123456", "code": "8888", "expect": "登录失败"},
  3. {"desc": "错误的密码", "username": "admin", "password": "123123", "code": "8888", "expect": "登录失败"}]#定义数据
  4. # with open(D + '/data/add_data2.json', 'w',encoding='utf-8') as f:
  5. # json.dump(my_list, f, ensure_ascii=False)#w写入文件

3)根目录下建立绝对路径文件config.py

  1. import os
  2. D=os.path.dirname(__file__)
  3. # D自定义根目录

4)common文件夹中封装共用读取2)json文件.py调用3)路径

  1. import json#导包json
  2. from config import D#导包绝对路径D
  3. #定义读取json的方法定义filename形参用于调用传参
  4. def Radd_data(filename):
  5. with open(filename, encoding='utf-8') as file:
  6. data_list = json.load(file) # json默认r读取文件
  7. # json.load读取加载的数据赋值给变量名data_list
  8. new_list = []#创建空列表
  9. for my_dict in data_list:#for循环遍历列表得到字典
  10. # 字典.values()得到键值并转元组
  11. my_tuple = tuple(my_dict.values())
  12. new_list.append(my_tuple)#将得到数据的元组添加给新空列表
  13. return new_list#返回得到数据的列表值
  14. if __name__ == '__main__':
  15. print(Radd_data(D + '/data/login_data.json')) # 打印调用类并传参

5)common文件夹中封装断言.py

  1. def common_assert(reps, status_code, success, code, message):
  2. assert status_code == reps.status_code
  3. assert success is reps.json().get("success")
  4. assert code == reps.json().get("code")
  5. assert message in reps.json().get("message")

6)scripts文件夹中编写测试用例导包封装的文件实现参数化验证和断言创建.py文件

  1. import pytest#导入测试插件@pytest
  2. from api.ihrm01_fzdl import Ihrmlogin#导包封装接口
  3. from common.assert_tool import common_assert#导入共用断言
  4. from common.readlogin_dataw import Radd_data#导入共用读取json数据工具
  5. from config import D#导入绝对路径
  6. class Testihrmlogcsh:
  7. read_json=Radd_data(D + '/data/login_data2.json')#读入存储.json数据
  8. @pytest.mark.parametrize('desc,req_data,status_code,success,code,message',read_json)
  9. def test01log(self,desc,req_data,status_code,success,code,message):#登录形参
  10. reps = Ihrmlogin.login(req_data) # 发送登录请求方法reps
  11. print(desc,reps.json()) # 查看请求结果
  12. common_assert(reps,status_code,success,code,message)#断言响应

1)api文件夹中封装增删改查操作.py文件

  1. #增删改查
  2. import requests
  3. from common.Tonken import logintoken
  4. zsgheader = {"Authorization": logintoken()} # 定义请求头
  5. class Ihrmzsg(object):
  6. @classmethod
  7. def addyg(cls,ttbody):
  8. ttresp = requests.post(url="http://ihrm-test.itheima.net/api/sys/user", headers=zsgheader, json=ttbody)
  9. return ttresp
  10. # print("添加员工", ttresp.json())
  11. @classmethod
  12. def xgyg(cls,zsgid,xgbody):
  13. xgresp = requests.put(url="http://ihrm-test.itheima.net/api/sys/user/"+zsgid, headers=zsgheader, json=xgbody)
  14. return xgresp
  15. # print("修改员工", xgresp.json())
  16. @classmethod
  17. def cxyg(cls,zsgid):
  18. cxresp = requests.get(url="http://ihrm-test.itheima.net/api/sys/user/"+zsgid, headers=zsgheader)
  19. return cxresp
  20. # print("查询员工", cxresp.json())
  21. @classmethod
  22. def scyg(cls,zsgid):
  23. scresp = requests.delete("http://ihrm-test.itheima.net/api/sys/user/"+zsgid, headers=zsgheader)
  24. return scresp
  25. # print("删除员工", scresp.json())

2)common文件夹中封装断言.py文件

  1. def common_assert(reps, status_code, success, code, message):
  2. assert status_code == reps.status_code
  3. assert success is reps.json().get("success")
  4. assert code == reps.json().get("code")
  5. assert message in reps.json().get("message")

3)common文件夹中封装登录后生成的用户令牌.py文件调用登录封装1)

  1. from api.ihrm01_fzdl import Ihrmlogin
  2. def logintoken():
  3. dl_body = {"mobile": "13800000002", "password": "123456"} # 定义请求体
  4. dlreq = Ihrmlogin.login(dl_body) # 发送登录请求
  5. return dlreq.json().get("data") # 通过登录拿到令牌值

4)data文件夹中放添加员工参数化数据.json

  1. [
  2. {
  3. "desc": "新增成功",
  4. "req_data":{"username": "hzb", "mobile": "18888966698", "workNumber": "123412412412"},
  5. "status_code": 200,
  6. "success": true,
  7. "code": 10000,
  8. "message": "操作成功"
  9. },
  10. {
  11. "desc": "手机号空",
  12. "req_data": {"username": "hzb", "mobile": null, "workNumber": "123412412412"},
  13. "status_code": 200,
  14. "success": false,
  15. "code": 20002,
  16. "message": "新增员工失败"
  17. },
  18. {
  19. "desc": "无参",
  20. "req_data": null,
  21. "status_code": 200,
  22. "success": false,
  23. "code": 99999,
  24. "message": "系统繁忙"
  25. }]

5)根目录下建立绝对路径文件config.py

  1. import os
  2. D=os.path.dirname(__file__)
  3. # D自定义根目录

6)common文件夹中封装共用读取4)json文件.py调用5)路径

  1. import json#导包json
  2. from config import D#导包绝对路径D
  3. #定义读取json的方法定义filename形参用于调用传参
  4. def Radd_data(filename):
  5. with open(filename, encoding='utf-8') as file:
  6. data_list = json.load(file) # json默认r读取文件
  7. # json.load读取加载的数据赋值给变量名data_list
  8. new_list = []#创建空列表
  9. for my_dict in data_list:#for循环遍历列表得到字典
  10. # 字典.values()得到键值并转元组
  11. my_tuple = tuple(my_dict.values())
  12. new_list.append(my_tuple)#将得到数据的元组添加给新空列表
  13. return new_list#返回得到数据的列表值
  14. if __name__ == '__main__':
  15. print(Radd_data(D + '/data/login_data.json')) # 打印调用类并传参

7) api文件夹中封装数据库接口增删改查操作.py文件

  1. import pymysql
  2. class DBUtil(object):
  3. @classmethod
  4. def get_conn(cls):#定义连接
  5. conn = pymysql.connect(host='211.103.136.244', port=7061, user='student', password='iHRM_student_2021',database='ihrm', charset='utf8')
  6. return conn
  7. @classmethod
  8. def select_one(cls,sql):#查询一条
  9. conn= None
  10. cursor= None
  11. res= None
  12. try:
  13. conn=cls.get_conn()#创建连接
  14. cursor = conn.cursor()#获取游标
  15. cursor.execute(sql)#执行程序sql
  16. res = cursor.fetchone()#获取结果
  17. except Exception as e:#异常捕捉
  18. print(e)#打印异常
  19. finally:
  20. cursor.close() # 6.关闭游标
  21. conn.close()# 7.关闭连接
  22. return res#返回res数据
  23. @classmethod
  24. def select_many(cls,sql,i):#查询多条
  25. cls.i=i
  26. conn = None
  27. cursor = None
  28. res = None
  29. try:
  30. conn = cls.get_conn() # 创建连接
  31. cursor = conn.cursor() # 获取游标
  32. cursor.execute(sql) # 执行程序sql
  33. res = cursor.fetchmany(i) # 获取结果
  34. except Exception as e: # 异常捕捉
  35. print(e) # 打印异常
  36. finally:
  37. cursor.close() # 6.关闭游标
  38. conn.close() # 7.关闭连接
  39. return res # 返回res数据
  40. @classmethod
  41. def uid_db(cls,sql):
  42. conn = None
  43. cursor = None
  44. try:
  45. conn = cls.get_conn() # 创建连接
  46. cursor = conn.cursor() # 获取游标
  47. cursor.execute(sql) # 执行程序sql
  48. conn.commit()
  49. print("提交事务成功")
  50. print("影响⾏数:", conn.affected_rows())
  51. except Exception as e: # 异常捕捉
  52. print(e) # 打印异常
  53. conn.rollback()
  54. print("回滚事务")
  55. finally:
  56. cursor.close() # 6.关闭游标
  57. conn.close() # 7.关闭连接

8)scripts文件夹中编写测试用例导包封装的文件实现参数化验证和断言创建.py文件

  1. import pytest#导入测试插件@pytest
  2. from api.sql_05fzihrm import DBUtil#导包mysql数据库uid
  3. from common.assert_tool import common_assert#导入共用断言
  4. from api.ihrm02_fzzsg import Ihrmzsg#导包增删改员工接口
  5. from common.readlogin_dataw import Radd_data#导入共用读取json数据工具
  6. from config import D#导入绝对路径
  7. class Testihrmput:
  8. def setup_class(self):
  9. print('1.走在测试类class前面删除记录')#类前删除一条记录
  10. DBUtil.uid_db("delete from bs_user where mobile='18888966698'")
  11. read_json = Radd_data(D + '/data/ihrmygtt.json')#读入存储.json数据
  12. @pytest.mark.parametrize('desc,req_data,status_code,success,code,message', read_json)
  13. def testput01(self,desc,req_data,status_code,success,code,message):#添加形参
  14. reqq=Ihrmzsg.addyg(req_data)#发送添加员工请求
  15. print(desc,reqq.json()) # 查看请求结果
  16. common_assert(reqq,status_code,success,code,message)#断言响应

9)根目录下建立report文件夹用于存放测试报告

10)根目录下建立测试报告路径文件名等代码pytest.ini

  1. [pytest]
  2. addopts=-s --html=report/test01_report.html
  3. testpaths=./scripts
  4. python_files=test*.py
  5. python_classes=Test*
  6. python_functions=test*