Commit edd031e0 by cym

接口自动化框架-v1.0.0

parent 2c550f5d
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_study
# FileName: __init__.py
# Author: xxxxxxx
# Datetime: 2023/11/4 9:15
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_study
# FileName: __init__.py
# Author: xxxxxxx
# Datetime: 2023/11/4 9:15
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
from InterfaceAutoTest.common.log import write_log
log = write_log()
\ No newline at end of file
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_study
# FileName: db.py
# Author: xxxxxxx
# Datetime: 2023/11/4 11:09
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
import pymysql
from InterfaceAutoTest.common import log
from InterfaceAutoTest.common.read_ini import ReadIni
from InterfaceAutoTest.data_config.settings import *
class DB:
def __init__(self):
read_ini = ReadIni()
try:
self.conn = pymysql.connect(
host=read_ini.get_sql_mess(HOST),
port=int(read_ini.get_sql_mess(PORT)),
user=read_ini.get_sql_mess(USER),
password=read_ini.get_sql_mess(PWD),
database=read_ini.get_sql_mess(DATABASE),
charset="utf8"
)
self.cursor = self.conn.cursor()
except:
log.error("链接数据库错误或者获取游标对象失败,请察看数据库的链接配置!!!")
raise pymysql.MySQLError("链接数据库错误或者获取游标对象失败,请察看数据库的链接配置!!!")
def close(self):
self.cursor.close()
self.conn.close()
def delete(self, sql):
try:
self.cursor.execute(sql)
self.conn.commit()
except:
log.error("执行删除的sql语句错误,请察看对应的删除的sql语句!!!")
raise ValueError("执行删除的sql语句错误,请察看对应的删除的sql语句!!!")
def select(self, sql, num=1):
try:
self.cursor.execute(sql)
select_result = self.cursor.fetchall()
if select_result and num == 1:
return select_result[0][0]
elif select_result and num == 2:
return select_result[0][0], select_result[0][1]
elif select_result and num > 2:
return select_result
except:
log.error("执行查询的sql语句错误,请察看对应的查询的sql语句!!!")
raise ValueError("执行查询的sql语句错误,请察看对应的查询的sql语句!!!")
\ No newline at end of file
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_study
# FileName: log.py
# Author: xxxxxxx
# Datetime: 2023/11/4 10:30
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
import os
import logging
def write_log():
logger = logging.getLogger(name="ccc")
logger.level = logging.NOTSET
log_path = os.path.join(os.path.dirname(os.getcwd()), "report/log/ccc.log")
handler = logging.FileHandler(log_path, mode="a", encoding="utf-8")
format = logging.Formatter('%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s - %(name)s')
handler.setFormatter(format)
logger.addHandler(handler)
return logger
\ No newline at end of file
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_study
# FileName: read_excel.py
# Author: xxxxxxx
# Datetime: 2023/11/4 11:09
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
import openpyxl
from InterfaceAutoTest.common import log
from InterfaceAutoTest.common.read_ini import ReadIni
from InterfaceAutoTest.common.read_json import read_json
from InterfaceAutoTest.data_config.settings import *
class ReadExcel:
def __init__(self, table_name):
self.read_ini = ReadIni()
excel_path = self.read_ini.get_file_path(EXCEL)
case_data_path = self.read_ini.get_file_path(CASE)
expect_data_path = self.read_ini.get_file_path(EXPECT)
sql_data_path = self.read_ini.get_file_path(SQL)
table_name = table_name
wb = openpyxl.load_workbook(excel_path)
try:
self.ws = wb[table_name]
except:
log.error("获取工作表失败,请察看工作表名称是否配置正确!!!")
raise KeyError("获取工作表失败,请察看工作表名称是否配置正确!!!")
self.case_data_dict = read_json(case_data_path)
self.expect_data_dict = read_json(expect_data_path)
self.sql_data_dict = read_json(sql_data_path)
def __get_cell_value(self, column, row):
try:
value = self.ws[column+str(row)].value
if value is None:
return None
elif value.strip():
return value.strip()
except:
log.error("获取指定单元格数据失败,请察看输入的列号和行号是否正确!!!")
raise KeyError("获取指定单元格数据失败,请察看输入的列号和行号是否正确!!!")
def module_name(self, row):
return self.__get_cell_value(MODULE, row)
def api_name(self, row):
return self.__get_cell_value(API, row)
def case_method(self, row):
return self.__get_cell_value(METHOD, row)
def case_url(self, row):
return self.read_ini.get_host(URL_HOST_CUSTOM) + self.__get_cell_value(URL, row)
def case_mime(self, row):
return self.__get_cell_value(MIME, row).lower()
def case_data(self, row):
case_data_key = self.__get_cell_value(CASE_DATA, row)
if case_data_key:
module_name = self.module_name(row)
api_name = self.api_name(row)
try:
return self.case_data_dict[module_name][api_name][case_data_key]
except:
log.error("请察看是否配置了用例数据!!!")
raise KeyError("请察看是否配置了用例数据!!!")
def expect_data(self, row):
expect_data_key = self.__get_cell_value(EXPECT_DATA, row)
module_name = self.module_name(row)
api_name = self.api_name(row)
try:
return self.expect_data_dict[module_name][api_name][expect_data_key]
except:
log.error("请察看是否配置了期望数据!!!")
raise KeyError("请察看是否配置了期望数据!!!")
def sql_type(self, row):
sql_type_value = self.__get_cell_value(SQL_TYPE, row)
if sql_type_value:
return sql_type_value.lower()
def sql_data(self, row):
sql_data_key = self.__get_cell_value(SQL_DATA, row)
if sql_data_key:
module_name = self.module_name(row)
api_name = self.api_name(row)
try:
return self.sql_data_dict[module_name][api_name][sql_data_key]
except:
log.error("请察看是否配置了sql数据!!!")
raise KeyError("请察看是否配置了sql数据!!!")
def update_key(self, row):
return self.__get_cell_value(UPDATE_KEY, row)
def get_data(self):
list_data = []
try:
for row in range(2, self.ws.max_row+1):
case_method = self.case_method(row)
case_url = self.case_url(row)
case_mime = self.case_mime(row)
case_data = self.case_data(row)
expect_data = self.expect_data(row)
sql_type = self.sql_type(row)
sql_data = self.sql_data(row)
update_key = self.update_key(row)
list_data.append([case_method, case_url, case_mime, case_data, expect_data, sql_type, sql_data, update_key])
else:
return list_data
except:
log.error("请察看excel中是否存在空行,如果存在,请删除空行!!!")
raise TypeError("请察看excel中是否存在空行,如果存在,请删除空行!!!")
if __name__ == '__main__':
excel = ReadExcel()
print(excel.get_data())
\ No newline at end of file
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_study
# FileName: read_ini.py
# Author: xxxxxxx
# Datetime: 2023/11/4 10:30
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
import configparser
import os
from InterfaceAutoTest.common import log
from InterfaceAutoTest.data_config.settings import *
class ReadIni:
def __init__(self):
self.data_config_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), "data_config")
ini_path = os.path.join(self.data_config_path, "config.ini")
self.conf = configparser.ConfigParser()
self.conf.read(ini_path, encoding="utf8")
def get_file_path(self, key):
try:
file_name = self.conf.get(FILE, key)
except:
log.error("输入file节点下的key错误,请察看配置文件!!!")
raise KeyError("输入file节点下的key错误,请察看配置文件!!!")
file_path = os.path.join(self.data_config_path, file_name)
if os.path.isfile(file_path):
return file_path
else:
log.error("获取file节点下,文件的路径错误,请察看配置文件是否配置正确!!!")
raise FileExistsError("获取file节点下,文件的路径错误,请察看配置文件是否配置正确!!!")
def get_host(self, key):
try:
return self.conf.get(URL_HOST, key)
except:
log.error("输入host节点下的key,错误,请察看配置文件!!!")
raise KeyError("输入host节点下的key,错误,请察看配置文件!!!")
def get_sql_mess(self, key):
try:
return self.conf.get(CONN_SQL, key)
except:
log.error("输入sql节点下的key,错误,请察看配置文件!!!")
raise KeyError("输入sql节点下的key,错误,请察看配置文件!!!")
def get_table_name(self, key):
try:
return self.conf.get(TABLE, key)
except:
log.error("输入table节点下的key,错误,请察看配置文件!!!")
raise KeyError("输入table节点下的key,错误,请察看配置文件!!!")
if __name__ == '__main__':
read_ini = ReadIni()
print(read_ini.get_file_path("excel"))
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_study
# FileName: read_json.py
# Author: xxxxxxx
# Datetime: 2023/11/4 11:09
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
import json
import os
from InterfaceAutoTest.common import log
def read_json(filename):
if os.path.isfile(filename) and filename.endswith(".json"):
try:
with open(filename, mode="r", encoding="utf-8") as f:
return json.load(f)
except:
log.error("打开json文件获取json文件的内容序列化为python对象失败,请察看json文件是否有错误!!!")
raise FileExistsError("打开json文件获取json文件的内容序列化为python对象失败,请察看json文件是否有错误!!!")
else:
log.error("json文件的路径不合法")
raise FileNotFoundError("json文件的路径不合法")
\ No newline at end of file
{
"认证接口": {
"登录系统": {
"LoginSuccess": {"password": "MTIzNDU2","username": "admin"},
"LoginErrorUsernameNone": {"password": "MTIzNDU2","username": ""},
"LoginErrorPasswordNone": {"password": "","username": "admin"}
}
},
"维度管理": {
"添加维度": {
"AddDemSuccess": {"code": "test_add_dem_ccc","description": "test_ccc的添加维度测试","isDefault": 0,"name": "test_ccc的添加维度"},
"AddDemErrorCodeNone": {"code": "","description": "test_ccc的添加维度测试","isDefault": 0,"name": "test_ccc的添加维度1"},
"AddDemErrorNameNone": {"code": "test_add_dem_ccc1","description": "test_ccc的添加维度测试","isDefault": 0,"name": ""}
},
"根据维度编码获取维度信息": {
"GetDemSuccess": {"code": "test_add_dem_ccc"}
}
},
"组织管理": {
"添加组织": {
"AddOrgSuccess": {"code": "test_add_org_ccc","demId": "不知道","exceedLimitNum": 0,"grade": "","limitNum": 0,"name": "test_ccc的添加组织","nowNum": 0,"orderNo": 0,"parentId": "0"},
"AddOrgErrorCodeNone": {"code": "","demId": "不知道","exceedLimitNum": 0,"grade": "","limitNum": 0,"name": "test_ccc的添加组织1","nowNum": 0,"orderNo": 0,"parentId": "0"},
"AddOrgErrorNameNone": {"code": "test_add_org_ccc1","demId": "不知道","exceedLimitNum": 0,"grade": "","limitNum": 0,"name": "","nowNum": 0,"orderNo": 0,"parentId": "0"},
"AddOrgErrorDemIdNone": {"code": "test_add_org_ccc2","demId": "","exceedLimitNum": 0,"grade": "","limitNum": 0,"name": "test_ccc的添加组织2","nowNum": 0,"orderNo": 0,"parentId": "0"}
},
"添加组织参数": {
"AddOrgParamsSuccess": {"query": {"orgCode": "test_add_org_ccc"}, "body": [{"alias":"sz","value":90}]}
},
"根据组织编码删除组织": {
"DeleteOrgSuccess": "test_add_org_ccc"
}
}
}
\ No newline at end of file
[file]
case=case_data.json
expect=expect_data.json
sql=sql_data.json
excel=APIAutoTest.xlsx
[sql]
host=120.46.172.186
port=3306
user=root
pwd=root@2023
database=eipsaas
[table]
table_name1=登录
table_name2=维度
table_name3=组织
[host]
host=http://120.46.172.186:8080
\ No newline at end of file
{
"认证接口": {
"登录系统": {
"LoginSuccess": {"username": "超级管理员","account": "admin", "loginStatus": true},
"LoginErrorUsernameNone": {"state": false, "message":"账号或密码错误"},
"LoginErrorPasswordNone": {"state": false, "message":"账号或密码错误"}
}
},
"维度管理": {
"添加维度": {
"AddDemSuccess": {"state": true, "message": "添加维度成功!"},
"AddDemErrorCodeNone": {"state": false, "message": "添加维度失败!"},
"AddDemErrorNameNone": {"state": false, "message": "添加维度失败!"}
},
"根据维度编码获取维度信息": {
"GetDemSuccess": {"demDesc": "test_ccc的添加维度测试"}
}
},
"组织管理": {
"添加组织": {
"AddOrgSuccess": {"state": true, "message": "添加组织成功!"},
"AddOrgErrorCodeNone": {"state": false, "message": "添加组织失败!"},
"AddOrgErrorNameNone": {"state": false, "message": "添加组织失败!"},
"AddOrgErrorDemIdNone": {"state": false, "message": "添加组织失败!"}
},
"添加组织参数": {
"AddOrgParamsSuccess": {"state":true,"message":"保存组织参数成功!"}
},
"根据组织编码删除组织": {
"DeleteOrgSuccess": {"state":true,"message":"删除组织成功!"}
}
}
}
\ No newline at end of file
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_study
# FileName: settings.py
# Author: xxxxxxx
# Datetime: 2023/11/4 10:29
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
# file节点名称====================
FILE = "file"
# file节点名称=key的名称===================
CASE = "case"
EXPECT = "expect"
EXCEL = "excel"
SQL = "sql"
# table节点名称========================
TABLE = "table"
# table节点名称=key的名称=======================
TABLE_NAME1 = "table_name1"
TABLE_NAME2 = "table_name2"
TABLE_NAME3 = "table_name3"
# host节点名称=================
URL_HOST = "host"
# host节点名称=key的名称================
URL_HOST_CUSTOM = "host"
# sql节点名称==========================
CONN_SQL = "sql"
# sql节点名称=key的名称=========================
HOST = "host"
PORT = "port"
USER = "user"
PWD = "pwd"
DATABASE = "database"
# excel文件中的列号
NUMBER = "A"
MODULE = "B"
API = "C"
TITLE = "D"
LEVEL = "E"
URL = "G"
METHOD = "F"
MIME = "H"
CASE_DATA = "I"
EXPECT_DATA = "J"
SQL_TYPE = "K"
SQL_DATA = "L"
UPDATE_KEY = "M"
\ No newline at end of file
{
"维度管理": {
"添加维度": {
"AddDemSuccess": "DELETE FROM uc_demension WHERE `CODE_`=\"test_add_dem_ccc\";"
},
"根据维度编码删除维度": {
"DeleteDemByIdsSuccess": "SELECT ID_ from uc_demension WHERE `CODE_`=\"test_add_dem_ccc\";"
}
},
"组织管理": {
"添加组织": {
"AddOrgSuccess": {
"select": "SELECT ID_ from uc_demension WHERE `CODE_`=\"test_add_dem_ccc\";",
"delete": "DELETE FROM uc_org WHERE `CODE_`=\"test_add_org_ccc\";"
},
"AddOrgErrorCodeNone": "SELECT ID_ from uc_demension WHERE `CODE_`=\"test_add_dem_ccc\";",
"AddOrgErrorNameNone": "SELECT ID_ from uc_demension WHERE `CODE_`=\"test_add_dem_ccc\";"
}
}
}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
2023-11-06 10:49:53 - test_bpm.py[line:38] - ERROR: 断言失败,用例数据为:{'code': '', 'description': 'test_ccc的添加维度测试', 'isDefault': 0, 'name': 'test_ccc的添加维度1'},期望数据为:{'state': False, 'message': '添加维度失败!'},服务器返回的数据为:{"state":false,"message":"添加维度信息失败,维度编码【code】必填!","logId":"1721359215349481472"}
2023-11-06 10:49:53 - test_bpm.py[line:38] - ERROR: 断言失败,用例数据为:{'code': 'test_add_dem_ccc1', 'description': 'test_ccc的添加维度测试', 'isDefault': 0, 'name': ''},期望数据为:{'state': False, 'message': '添加维度失败!'},服务器返回的数据为:{"state":false,"message":"添加维度信息失败,维度名称【name】必填!","logId":"1721359216163176448"}
2023-11-06 10:49:54 - test_bpm.py[line:38] - ERROR: 断言失败,用例数据为:{'code': '', 'demId': '1721359215122989056', 'exceedLimitNum': 0, 'grade': '', 'limitNum': 0, 'name': 'test_ccc的添加组织1', 'nowNum': 0, 'orderNo': 0, 'parentId': '0'},期望数据为:{'state': False, 'message': '添加组织失败!'},服务器返回的数据为:{"state":false,"message":"添加组织失败,组织编码【code】不能为空!","value":"保存失败"}
2023-11-06 10:49:54 - test_bpm.py[line:38] - ERROR: 断言失败,用例数据为:{'code': 'test_add_org_ccc1', 'demId': '1721359215122989056', 'exceedLimitNum': 0, 'grade': '', 'limitNum': 0, 'name': '', 'nowNum': 0, 'orderNo': 0, 'parentId': '0'},期望数据为:{'state': False, 'message': '添加组织失败!'},服务器返回的数据为:{"state":false,"message":"添加组织失败,组织名称【name】不能为空!","value":"保存失败"}
2023-11-06 10:49:54 - test_bpm.py[line:38] - ERROR: 断言失败,用例数据为:{'code': 'test_add_org_ccc2', 'demId': '', 'exceedLimitNum': 0, 'grade': '', 'limitNum': 0, 'name': 'test_ccc的添加组织2', 'nowNum': 0, 'orderNo': 0, 'parentId': '0'},期望数据为:{'state': False, 'message': '添加组织失败!'},服务器返回的数据为:{"state":false,"message":"添加组织失败,维度id【demId】不能为空!","value":"保存失败"}
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_study
# FileName: __init__.py
# Author: xxxxxxx
# Datetime: 2023/11/4 9:16
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_study
# FileName: requests_method.py
# Author: xxxxxxx
# Datetime: 2023/11/4 14:09
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
import base64
import requests
from InterfaceAutoTest.common import log
from InterfaceAutoTest.common.read_ini import ReadIni
from InterfaceAutoTest.data_config.settings import *
class RequestsMethod:
def __init__(self):
login_url = ReadIni().get_host(URL_HOST_CUSTOM) + "/auth"
login_data = {"username": "admin", "password": base64.b64encode("123456".encode()).decode()}
self.bpm_session = requests.sessions.Session()
self.bpm_session.headers.update({"Authorization": "Bearer "+self.bpm_session.request(method="post", url=login_url, json=login_data).json().get("token")})
def request_all(self, req_method, req_url, req_mime=None, case_data=None):
if req_mime == "json" or req_mime == "application/json":
return self.bpm_session.request(method=req_method, url=req_url, json=case_data)
elif req_mime == "x-www-form-urlencoded" or req_mime == "application/x-www-form-urlencoded" or req_mime == "body":
return self.bpm_session.request(method=req_method, url=req_url, data=case_data)
elif req_mime == "form-data" or req_mime == "multipart/form-data":
return self.bpm_session.request(method=req_method, url=req_url, files=case_data)
elif req_mime == "query" or req_mime == "param" or req_mime == "params":
return self.bpm_session.request(method=req_method, url=req_url, params=case_data)
elif req_mime is None:
return self.bpm_session.request(method=req_method, url=req_url)
elif req_mime == "query|body" or req_mime == "body|query" or req_mime == "query|json":
return self.bpm_session.request(method=req_method, url=req_url, params=case_data["query"], json=case_data["body"])
else:
log.error("传入的媒体类型的值错误,请察看excel中是否填入正确!!!")
raise NameError("传入的媒体类型的值错误,请察看excel中是否填入正确!!!")
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_study
# FileName: __init__.py
# Author: xxxxxxx
# Datetime: 2023/11/4 9:16
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
[pytest]
;开启日志
;log_cli=true
;设置日志的级别,如果不设置级别的话,可以设置为NOTSET,如果要设置级别,级别可以有debug,info,warning,error,致命
;log_level=NOTSET
;设置日志显示的信息格式
;log_format=%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s
;设置日志中时间显示的格式
;log_date_format=%Y-%m-%d %H:%M:%S
;每个py文件运行的时候追加的命令
;addopts=-vs
;设置日志保存的文件
log_file=./report/log/ccc.log
;设置日志保存在文件中的级别
log_file_level=error
;设置日志在文件中的信息格式
log_file_format=%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s
;设置文件日志中时间显示的格式
log_file_date_format=%Y-%m-%d %H:%M:%S
\ No newline at end of file
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_study
# FileName: __init__.py
# Author: xxxxxxx
# Datetime: 2023/11/4 15:35
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_study
# FileName: conftest.py
# Author: xxxxxxx
# Datetime: 2023/11/4 14:29
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
import pytest
from InterfaceAutoTest.common.db import DB
from InterfaceAutoTest.requesrs_method.requests_method import RequestsMethod
# ==================自定义固件==================
@pytest.fixture(scope="session")
def req_fix():
req = RequestsMethod()
yield req
@pytest.fixture(scope="session")
def db_fix():
db = DB()
yield db
db.close()
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_study
# FileName: test_bpm.py
# Author: xxxxxxx
# Datetime: 2023/11/4 14:30
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
import pytest
from InterfaceAutoTest.common import log
from InterfaceAutoTest.common.read_excel import ReadExcel
from InterfaceAutoTest.common.read_ini import ReadIni
class TestBPM:
@pytest.mark.parametrize("case_method, case_url, case_mime, case_data, expect_data, sql_type, sql_data, update_key", ReadExcel("登录").get_data())
def test_bpm(self, db_fix, req_fix, case_method, case_url, case_mime, case_data, expect_data, sql_type, sql_data, update_key):
if sql_type == "delete":
db_fix.delete(sql_data)
elif sql_type == "select":
select_result = db_fix.select(sql_data)
case_data[update_key] = select_result
elif sql_type == "select|delete" or sql_type == "delete|select":
db_fix.delete(sql_data.get("delete"))
select_result = db_fix.select(sql_data.get("select"))
case_data[update_key] = select_result
res = req_fix.request_all(req_method=case_method, req_url=case_url, req_mime=case_mime, case_data=case_data)
try:
for key in expect_data:
assert expect_data[key] == res.json().get(key)
except:
log.error("断言失败" + ",用例数据为:" + str(case_data) + ",期望数据为:" + str(expect_data) + ",服务器返回的数据为:" + res.text)
raise AssertionError("断言失败")
if __name__ == '__main__':
pytest.main()
\ No newline at end of file
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_study
# FileName: __init__.py
# Author: xxxxxxx
# Datetime: 2023/11/4 15:35
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_study
# FileName: conftest.py
# Author: xxxxxxx
# Datetime: 2023/11/4 14:29
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
import pytest
from InterfaceAutoTest.common.db import DB
from InterfaceAutoTest.requesrs_method.requests_method import RequestsMethod
# ==================自定义固件==================
@pytest.fixture(scope="session")
def req_fix():
req = RequestsMethod()
yield req
@pytest.fixture(scope="session")
def db_fix():
db = DB()
yield db
db.close()
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_study
# FileName: test_bpm.py
# Author: xxxxxxx
# Datetime: 2023/11/4 14:30
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
import pytest
from InterfaceAutoTest.common import log
from InterfaceAutoTest.common.read_excel import ReadExcel
from InterfaceAutoTest.common.read_ini import ReadIni
class TestBPM:
@pytest.mark.parametrize("case_method, case_url, case_mime, case_data, expect_data, sql_type, sql_data, update_key", ReadExcel("维度").get_data())
def test_bpm(self, db_fix, req_fix, case_method, case_url, case_mime, case_data, expect_data, sql_type, sql_data, update_key):
if sql_type == "delete":
db_fix.delete(sql_data)
elif sql_type == "select":
select_result = db_fix.select(sql_data)
case_data[update_key] = select_result
elif sql_type == "select|delete" or sql_type == "delete|select":
db_fix.delete(sql_data.get("delete"))
select_result = db_fix.select(sql_data.get("select"))
case_data[update_key] = select_result
res = req_fix.request_all(req_method=case_method, req_url=case_url, req_mime=case_mime, case_data=case_data)
try:
for key in expect_data:
assert expect_data[key] == res.json().get(key)
except:
log.error("断言失败" + ",用例数据为:" + str(case_data) + ",期望数据为:" + str(expect_data) + ",服务器返回的数据为:" + res.text)
raise AssertionError("断言失败")
if __name__ == '__main__':
pytest.main()
\ No newline at end of file
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_study
# FileName: __init__.py
# Author: xxxxxxx
# Datetime: 2023/11/4 15:35
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_study
# FileName: conftest.py
# Author: xxxxxxx
# Datetime: 2023/11/4 14:29
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
import pytest
from InterfaceAutoTest.common.db import DB
from InterfaceAutoTest.requesrs_method.requests_method import RequestsMethod
# ==================自定义固件==================
@pytest.fixture(scope="session")
def req_fix():
req = RequestsMethod()
yield req
@pytest.fixture(scope="session")
def db_fix():
db = DB()
yield db
db.close()
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_study
# FileName: test_bpm.py
# Author: xxxxxxx
# Datetime: 2023/11/4 14:30
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
import pytest
from InterfaceAutoTest.common import log
from InterfaceAutoTest.common.read_excel import ReadExcel
from InterfaceAutoTest.common.read_ini import ReadIni
class TestBPM:
@pytest.mark.parametrize("case_method, case_url, case_mime, case_data, expect_data, sql_type, sql_data, update_key", ReadExcel("组织").get_data())
def test_bpm(self, db_fix, req_fix, case_method, case_url, case_mime, case_data, expect_data, sql_type, sql_data, update_key):
if sql_type == "delete":
db_fix.delete(sql_data)
elif sql_type == "select":
select_result = db_fix.select(sql_data)
case_data[update_key] = select_result
elif sql_type == "select|delete" or sql_type == "delete|select":
db_fix.delete(sql_data.get("delete"))
select_result = db_fix.select(sql_data.get("select"))
case_data[update_key] = select_result
res = req_fix.request_all(req_method=case_method, req_url=case_url, req_mime=case_mime, case_data=case_data)
try:
for key in expect_data:
assert expect_data[key] == res.json().get(key)
except:
log.error("断言失败" + ",用例数据为:" + str(case_data) + ",期望数据为:" + str(expect_data) + ",服务器返回的数据为:" + res.text)
raise AssertionError("断言失败")
if __name__ == '__main__':
pytest.main()
\ No newline at end of file
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: test_57
# FileName: __init__.py
# Author: xxxxxxx
# Datetime: 2023/11/3 14:01
# Description:
#
# ---------------------------------------------------------------------------
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: test_57
# FileName: test_pytest_func.py
# Author: xxxxxxx
# Datetime: 2023/11/3 9:36
# Description:
#
# ---------------------------------------------------------------------------
import base64
import random
import pytest
import requests
"""
pytest装饰器:
1:@pytest.fixture(scope="指定自定义固件的级别", autouse=False, params=可迭代类型):实现自定义固件
2:@pytest.mark.parametrize("字符串", 可迭代类型): 实现用例的参数化
3: 下载插件,插件为:pytest-dependency, 下载方式为:pip install pytest-dependency
插件:pytest-dependency的功能为实现用例之间的依赖。
使用流程:
先使用装饰器@pytest.mark.dependency()标记依赖的用例
再使用装饰器@pytest.mark.dependency(depends=["用例的名称"])管理依赖的用例,也可以标记用例被后面的用例依赖
4: @pytest.mark.标签名:功能给用例打上标签,在终端运行的时候,使用的命令为:pytest -vs 用例py文件 -m="标签名"
5: @pytest.mark.run(order=num): num为整形,数字越小越先执行。但是需要下载插件,插件为:pip install pytest-ordering
6:@pytest.mark.usefixtures("自定义固件名称"):实现自定义固件的调用
7: @pytest.mark.skip(reason="无条件跳过"): 让用例无条件跳过
8: @pytest.mark.skipif(bool, reason="有条件跳过"):如果bool表达式为True,用例有条件跳过
9:@pytest.mark.xfail(reason="预期失败")
"""
dict1 = {}
class Test01:
def setup_class(self):
login_url = "http://120.46.172.186:8080/auth"
# 配置登录数据
login_data = {"username": "admin", "password": base64.b64encode("123456".encode()).decode()}
self.bpm_sess = requests.sessions.Session()
self.token = self.bpm_sess.post(login_url, json=login_data).json().get("token")
self.bpm_sess.headers.update({"Authorization": "Bearer " + self.token})
@pytest.mark.dependency()
def test1(self):
print("用例1")
# 实现登录,获取服务器返回的token
login_url = "http://120.46.172.186:8080/auth"
# 配置登录数据
login_data = {"username": "admin", "password": base64.b64encode("123456".encode()).decode()}
res = self.bpm_sess.post(url=login_url, json=login_data)
print(res.text)
assert "超级管理员" == res.json().get("username")
@pytest.mark.dependency(depends=["Test01::test1"])
def test2(self):
print("添加维度用例")
add_dem_url = "http://120.46.172.186:8080/api/demension/v1/dem/addDem"
add_dem_data = {
"code": "addDem" + str(random.randrange(1, 100)),
"description": "addDem",
"isDefault": 0,
"name": "addDem"
}
res = self.bpm_sess.request(method="post", url=add_dem_url, json=add_dem_data)
print(res.text)
assert "添加维度成功" in res.text
@pytest.mark.dependency(depends=["test1", "test2"])
def test3(self):
print("用例3")
'''
@pytest.mark.run(order=4)
@pytest.mark.p1
def test1():
print("用例1")
@pytest.mark.dependency(depends=["test4"])
@pytest.mark.run(order=2)
@pytest.mark.p0
def test2():
print("用例2")
@pytest.mark.run(order=3)
@pytest.mark.p0
def test3():
print("用例3")
@pytest.mark.dependency()
@pytest.mark.run(order=1)
@pytest.mark.p1
def test4():
print("用例4")
assert 1 == 2
'''
'''
def test1():
print("用例1")
@pytest.mark.skip(reason="无条件跳过")
def test2():
print("用例2")
@pytest.mark.skipif(1 == 2, reason="无条件跳过")
def test3():
print("用例2")
@pytest.mark.xfail(reason="预期失败")
def test4():
print("预期失败")
assert 1 == 3
'''
if __name__ == '__main__':
pytest.main()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment