1.先了解项目目录架构
测试框架
目录结构
python package类文件夹:1.api 2.scripts 3.common
directory类文件夹:1.data 2.report
项目根目录文件:1.config.py 2.pytest.ini
2.参数化步骤
1)api文件夹中封装登录.py
- #登录
- import requests#导包
- class Ihrmlogin(object):#封装登录类
- @classmethod#类方法
- def login(cls,json):#封装登录方法
- rep= requests.post("http://ihrm-test.itheima.net/api/sys/login",json= json)
- return rep#发送登录请求返回登录数据
2)data文件夹中放参数化数据.json
- [
- {
- "desc": "登陆成功",
- "req_data": {
- "mobile": "13800000002",
- "password": "123456"
- },
- "status_code": 200,
- "success": true,
- "code": 10000,
- "message": "操作成功"
- },
- {
- "desc": "手机号未注册",
- "req_data": {
- "mobile": "11777771111",
- "password": "123456"
- },
- "status_code": 200,
- "success": false,
- "code": 20001,
- "message": "用户名或密码错误"
- },
- {
- "desc": "密码错误",
- "req_data": {
- "mobile": "13800000002",
- "password": "12345678"
- },
- "status_code": 200,
- "success": false,
- "code": 20001,
- "message": "用户名或密码错误"
- },
- {
- "desc": "多参",
- "req_data": {
- "mobile": "13800000002",
- "password": "123456",
- "abc": "123"
- },
- "status_code": 200,
- "success": true,
- "code": 10000,
- "message": "操作成功"
- },
- {
- "desc": "少参",
- "req_data": {
- "mobile": "13800000002"
- },
- "status_code": 200,
- "success": false,
- "code": 20001,
- "message": "用户名或密码错误"
- },
- {
- "desc": "无参",
- "req_data": null,
- "status_code": 200,
- "success": false,
- "code": 99999,
- "message": "系统繁忙"
- }
- ]
2.1)data文件夹中也可以用w写入json数据.py
- # my_list = [{"desc": "正确的用户名和密码", "username": "admin", "password": "123456", "code": "8888", "expect": "登录成功"},
- {"desc": "用户名不存在", "username": "root", "password": "123456", "code": "8888", "expect": "登录失败"},
- {"desc": "错误的密码", "username": "admin", "password": "123123", "code": "8888", "expect": "登录失败"}]#定义数据
- # with open(D + '/data/add_data2.json', 'w',encoding='utf-8') as f:
- # json.dump(my_list, f, ensure_ascii=False)#w写入文件
3)根目录下建立绝对路径文件config.py
- import os
- D=os.path.dirname(__file__)
- # D自定义根目录
4)common文件夹中封装共用读取2)json文件.py调用3)路径
- import json#导包json
- from config import D#导包绝对路径D
- #定义读取json的方法定义filename形参用于调用传参
- def Radd_data(filename):
- with open(filename, encoding='utf-8') as file:
- data_list = json.load(file) # json默认r读取文件
- # json.load读取加载的数据赋值给变量名data_list
- new_list = []#创建空列表
- for my_dict in data_list:#for循环遍历列表得到字典
- # 字典.values()得到键值并转元组
- my_tuple = tuple(my_dict.values())
- new_list.append(my_tuple)#将得到数据的元组添加给新空列表
- return new_list#返回得到数据的列表值
- if __name__ == '__main__':
- print(Radd_data(D + '/data/login_data.json')) # 打印调用类并传参
5)common文件夹中封装断言.py
- def common_assert(reps, status_code, success, code, message):
- assert status_code == reps.status_code
- assert success is reps.json().get("success")
- assert code == reps.json().get("code")
- assert message in reps.json().get("message")
6)scripts文件夹中编写测试用例导包封装的文件实现参数化验证和断言创建.py文件
- import pytest#导入测试插件@pytest
- from api.ihrm01_fzdl import Ihrmlogin#导包封装接口
- from common.assert_tool import common_assert#导入共用断言
- from common.readlogin_dataw import Radd_data#导入共用读取json数据工具
- from config import D#导入绝对路径
-
- class Testihrmlogcsh:
- read_json=Radd_data(D + '/data/login_data2.json')#读入存储.json数据
- @pytest.mark.parametrize('desc,req_data,status_code,success,code,message',read_json)
- def test01log(self,desc,req_data,status_code,success,code,message):#登录形参
- reps = Ihrmlogin.login(req_data) # 发送登录请求方法reps
- print(desc,reps.json()) # 查看请求结果
- common_assert(reps,status_code,success,code,message)#断言响应
1)api文件夹中封装增删改查操作.py文件
- #增删改查
- import requests
- from common.Tonken import logintoken
- zsgheader = {"Authorization": logintoken()} # 定义请求头
- class Ihrmzsg(object):
- @classmethod
- def addyg(cls,ttbody):
- ttresp = requests.post(url="http://ihrm-test.itheima.net/api/sys/user", headers=zsgheader, json=ttbody)
- return ttresp
- # print("添加员工", ttresp.json())
-
- @classmethod
- def xgyg(cls,zsgid,xgbody):
- xgresp = requests.put(url="http://ihrm-test.itheima.net/api/sys/user/"+zsgid, headers=zsgheader, json=xgbody)
- return xgresp
- # print("修改员工", xgresp.json())
-
- @classmethod
- def cxyg(cls,zsgid):
- cxresp = requests.get(url="http://ihrm-test.itheima.net/api/sys/user/"+zsgid, headers=zsgheader)
- return cxresp
- # print("查询员工", cxresp.json())
-
- @classmethod
- def scyg(cls,zsgid):
- scresp = requests.delete("http://ihrm-test.itheima.net/api/sys/user/"+zsgid, headers=zsgheader)
- return scresp
- # print("删除员工", scresp.json())
2)common文件夹中封装断言.py文件
- def common_assert(reps, status_code, success, code, message):
- assert status_code == reps.status_code
- assert success is reps.json().get("success")
- assert code == reps.json().get("code")
- assert message in reps.json().get("message")
3)common文件夹中封装登录后生成的用户令牌.py文件调用登录封装1)
- from api.ihrm01_fzdl import Ihrmlogin
-
- def logintoken():
- dl_body = {"mobile": "13800000002", "password": "123456"} # 定义请求体
- dlreq = Ihrmlogin.login(dl_body) # 发送登录请求
- return dlreq.json().get("data") # 通过登录拿到令牌值
4)data文件夹中放添加员工参数化数据.json
- [
- {
- "desc": "新增成功",
- "req_data":{"username": "hzb", "mobile": "18888966698", "workNumber": "123412412412"},
- "status_code": 200,
- "success": true,
- "code": 10000,
- "message": "操作成功"
- },
- {
- "desc": "手机号空",
- "req_data": {"username": "hzb", "mobile": null, "workNumber": "123412412412"},
- "status_code": 200,
- "success": false,
- "code": 20002,
- "message": "新增员工失败"
- },
- {
- "desc": "无参",
- "req_data": null,
- "status_code": 200,
- "success": false,
- "code": 99999,
- "message": "系统繁忙"
- }]
5)根目录下建立绝对路径文件config.py
- import os
- D=os.path.dirname(__file__)
- # D自定义根目录
6)common文件夹中封装共用读取4)json文件.py调用5)路径
- import json#导包json
- from config import D#导包绝对路径D
- #定义读取json的方法定义filename形参用于调用传参
- def Radd_data(filename):
- with open(filename, encoding='utf-8') as file:
- data_list = json.load(file) # json默认r读取文件
- # json.load读取加载的数据赋值给变量名data_list
- new_list = []#创建空列表
- for my_dict in data_list:#for循环遍历列表得到字典
- # 字典.values()得到键值并转元组
- my_tuple = tuple(my_dict.values())
- new_list.append(my_tuple)#将得到数据的元组添加给新空列表
- return new_list#返回得到数据的列表值
- if __name__ == '__main__':
- print(Radd_data(D + '/data/login_data.json')) # 打印调用类并传参
7) api文件夹中封装数据库接口增删改查操作.py文件
- import pymysql
-
-
- class DBUtil(object):
- @classmethod
- def get_conn(cls):#定义连接
- conn = pymysql.connect(host='211.103.136.244', port=7061, user='student', password='iHRM_student_2021',database='ihrm', charset='utf8')
- return conn
- @classmethod
-
- def select_one(cls,sql):#查询一条
- conn= None
- cursor= None
- res= None
- try:
- conn=cls.get_conn()#创建连接
- cursor = conn.cursor()#获取游标
- cursor.execute(sql)#执行程序sql
- res = cursor.fetchone()#获取结果
- except Exception as e:#异常捕捉
- print(e)#打印异常
- finally:
- cursor.close() # 6.关闭游标
- conn.close()# 7.关闭连接
- return res#返回res数据
-
- @classmethod
- def select_many(cls,sql,i):#查询多条
- cls.i=i
- conn = None
- cursor = None
- res = None
- try:
- conn = cls.get_conn() # 创建连接
- cursor = conn.cursor() # 获取游标
- cursor.execute(sql) # 执行程序sql
- res = cursor.fetchmany(i) # 获取结果
- except Exception as e: # 异常捕捉
- print(e) # 打印异常
- finally:
- cursor.close() # 6.关闭游标
- conn.close() # 7.关闭连接
- return res # 返回res数据
-
- @classmethod
- def uid_db(cls,sql):
- conn = None
- cursor = None
- try:
- conn = cls.get_conn() # 创建连接
- cursor = conn.cursor() # 获取游标
- cursor.execute(sql) # 执行程序sql
- conn.commit()
- print("提交事务成功")
- print("影响⾏数:", conn.affected_rows())
- except Exception as e: # 异常捕捉
- print(e) # 打印异常
- conn.rollback()
- print("回滚事务")
- finally:
- cursor.close() # 6.关闭游标
- conn.close() # 7.关闭连接
8)scripts文件夹中编写测试用例导包封装的文件实现参数化验证和断言创建.py文件
- import pytest#导入测试插件@pytest
- from api.sql_05fzihrm import DBUtil#导包mysql数据库uid
- from common.assert_tool import common_assert#导入共用断言
- from api.ihrm02_fzzsg import Ihrmzsg#导包增删改员工接口
- from common.readlogin_dataw import Radd_data#导入共用读取json数据工具
- from config import D#导入绝对路径
-
- class Testihrmput:
- def setup_class(self):
- print('1.走在测试类class前面删除记录')#类前删除一条记录
- DBUtil.uid_db("delete from bs_user where mobile='18888966698'")
- read_json = Radd_data(D + '/data/ihrmygtt.json')#读入存储.json数据
- @pytest.mark.parametrize('desc,req_data,status_code,success,code,message', read_json)
- def testput01(self,desc,req_data,status_code,success,code,message):#添加形参
- reqq=Ihrmzsg.addyg(req_data)#发送添加员工请求
- print(desc,reqq.json()) # 查看请求结果
- common_assert(reqq,status_code,success,code,message)#断言响应
9)根目录下建立report文件夹用于存放测试报告
10)根目录下建立测试报告路径文件名等代码pytest.ini
- [pytest]
- addopts=-s --html=report/test01_report.html
- testpaths=./scripts
- python_files=test*.py
- python_classes=Test*
- python_functions=test*