Commit 957ebcd3 by Annuo

上传接口自动化框架代码

parent d79c88e6
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_test
# FileName: __init__.py
# Author: xxxxxxx
# Datetime: 2023/11/4 9:14
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_test
# FileName: __init__.py
# Author: xxxxxxx
# Datetime: 2023/11/4 9:14
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
from InterfaceAutoTest01.common.log import write_log
log = write_log()
\ No newline at end of file
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_test
# FileName: db.py
# Author: xxxxxxx
# Datetime: 2023/11/4 11:11
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
import pymysql
from InterfaceAutoTest01.common import log
from InterfaceAutoTest01.common.read_ini import ReadIni
class DB:
def __init__(self):
"""链接数据库"""
read_ini = ReadIni()
try:
self.conn = pymysql.Connect(
host=read_ini.get_sql("host"),
port=int(read_ini.get_sql("port")),
user=read_ini.get_sql("user"),
password=read_ini.get_sql("password"),
database=read_ini.get_sql("database"),
charset="utf8"
)
self.cursor = self.conn.cursor()
except:
log.error("链接数据库是吧,请查看配置文件sql节点下key和值是否正确")
raise ValueError("链接数据库是吧,请查看配置文件sql节点下key和值是否正确")
def close(self):
"""关闭连接数据库对象和游标对象"""
self.conn.close()
self.cursor.close()
def select(self, sql):
"""查询"""
try:
self.cursor.execute(sql)
select_result = self.cursor.fetchall()
return select_result[0][0]
except:
log.error("执行查询sql语句错误,请查看sql_data文件内传入的查询sql语句是否错误")
raise pymysql.MySQLError("执行查询sql语句错误,请查看sql_data文件内传入的查询sql语句是否错误")
def delete(self, sql):
"""删除"""
try:
self.cursor.execute(sql)
self.conn.commit()
except:
log.error("执行删除sql语句错误,请查看sql_data文件内传入的删除sql语句是否错误")
raise pymysql.MySQLError("执行删除sql语句错误,请查看sql_data文件内传入的删除sql语句是否错误")
\ No newline at end of file
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_test
# FileName: log.py
# Author: xxxxxxx
# Datetime: 2023/11/4 9:24
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
import logging
import os
def write_log():
"""写入日志"""
logger = logging.getLogger()
logger.level = logging.NOTSET
log_path = os.path.join(os.path.join(os.path.join(os.path.dirname(os.path.dirname(__file__)), "report", "log")), "bpm_all_log.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
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_test
# FileName: read_excel.py
# Author: xxxxxxx
# Datetime: 2023/11/4 11:26
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
import os
import openpyxl
from InterfaceAutoTest01.common import log
from InterfaceAutoTest01.common.read_ini import ReadIni
from InterfaceAutoTest01.common.read_json import read_json
class ReadExcel:
def __init__(self, table_name, testers_name):
self.read_ini = ReadIni()
# excel_path = self.read_ini.get_file("excel")
# case_path = self.read_ini.get_file("case")
# expect_path = self.read_ini.get_file("expect")
# sql_path = self.read_ini.get_file("sql")
# table_name = self.read_ini.get_table("table_name")
data_path = os.path.join(self.read_ini.data_path, testers_name)
excel_path = os.path.join(data_path, "APIAutoTest.xlsx")
if not os.path.isfile(excel_path):
log.error("获取文件不合法,请查看文件路径或data_config文件夹内文件是否正确")
raise FileNotFoundError("获取文件不合法,请查看文件路径或data_config文件夹内文件是否正确")
case_path = os.path.join(data_path, "case_data.json")
expect_path = os.path.join(data_path, "expect_data.json")
sql_path = os.path.join(data_path, "sql_data.json")
try:
wb = openpyxl.load_workbook(excel_path)
self.ws = wb[table_name]
except:
log.error("打开excel表失败,请查看excel表工作表名是否正确")
raise KeyError("打开excel表失败,请查看excel表工作表名是否正确")
self.case_data_dict = read_json(case_path)
self.expect_data_dict = read_json(expect_path)
self.sql_data_dict = read_json(sql_path)
def __get_excel_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 get_module_name(self, row):
"""根据行号获取模块模块名称"""
return self.__get_excel_value("b", row)
def get_api_name(self, row):
"""根据行号获取接口名称"""
return self.__get_excel_value("c", row)
def get_title(self, row):
"""根据行号获取用例名称"""
return self.__get_excel_value("d", row)
def get_level(self, row):
"""根据行号,获取用例等级"""
return self.__get_excel_value("e", row)
def get_url(self, row):
"""根据行号获取url"""
host = self.read_ini.get_host("host")
return os.path.join(host + self.__get_excel_value("f", row))
def get_method(self, row):
"""根据行号获取请求方式"""
value = self.__get_excel_value("g", row)
if value:
return value.upper()
def get_mime(self, row):
"""根据行号获取传参方式"""
value = self.__get_excel_value("h", row)
if value:
return value.lower()
def get_case_data(self, row):
"""根据行号获取用例数据"""
case_key = self.__get_excel_value("i", row)
if case_key:
module_name = self.get_module_name(row)
api_name = self.get_api_name(row)
return self.case_data_dict[module_name][api_name][case_key]
def get_expect_data(self, row):
"""根据行号获取期望数据"""
expect_key = self.__get_excel_value("j", row)
if expect_key:
module_name = self.get_module_name(row)
api_name = self.get_api_name(row)
return self.expect_data_dict[module_name][api_name][expect_key]
def get_sql_type(self, row):
"""根据行号获取sql语句类型"""
value = self.__get_excel_value("k", row)
if value:
return value.lower()
def get_sql_data(self, row):
"""根据行号获取sql语句"""
sql_key = self.__get_excel_value("l", row)
if sql_key:
module_name = self.get_module_name(row)
api_name = self.get_api_name(row)
return self.sql_data_dict[module_name][api_name][sql_key]
def get_update_key(self, row):
return self.__get_excel_value("m", row)
def all_data(self):
"""获取所有需要的数据存在一个二维列表中,并返回"""
list_data = []
for row in range(2, self.ws.max_row + 1):
module_name = self.get_module_name(row)
api_name = self.get_api_name(row)
title = self.get_title(row)
level = self.get_level(row)
url = self.get_url(row)
method = self.get_method(row)
mime = self.get_mime(row)
case_data = self.get_case_data(row)
expect_data = self.get_expect_data(row)
sql_type = self.get_sql_type(row)
sql_data = self.get_sql_data(row)
update_key = self.get_update_key(row)
list_data.append([row, module_name, api_name, title, level, url, method, mime, case_data, expect_data, sql_type, sql_data, update_key])
return list_data
if __name__ == '__main__':
r = ReadExcel("BPM", "hexi")
# D:\hexi\python_test\InterfaceAutoTest01\data_config\hexi\APIAutoTest.xlsx
# D:\hexi\python_test\InterfaceAutoTest01\data_config\hexi\APIAutoTest.xlsx
# D:\hexi\python_test\InterfaceAutoTest01\data_config\hexi\case_data.json
# D:\hexi\python_test\InterfaceAutoTest01\data_config\hexi\expect_data.json
# D:\hexi\python_test\InterfaceAutoTest01\data_config\hexi\sql_data.json
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_test
# FileName: read_ini.py
# Author: xxxxxxx
# Datetime: 2023/11/4 10:14
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
import configparser
import os
from InterfaceAutoTest01.common import log
class ReadIni:
def __init__(self):
self.data_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), "data_config")
config_path = os.path.join(self.data_path, "config.ini")
self.conf = configparser.ConfigParser()
self.conf.read(config_path, encoding="utf-8")
def get_file(self, key):
"""根据key获取file节点下的值"""
try:
file_path = os.path.join(self.data_path, self.conf.get("file", key))
except:
log.error("获取配置文件file节点下值错误,请查看配置文件或传入key是否正确")
raise KeyError("获取配置文件file节点下值错误,请查看配置文件或传入key是否正确")
if os.path.isfile(file_path):
return file_path
else:
log.error("获取文件不合法,请查看配置文件file节点下key或data_config文件夹内文件是否正确")
raise FileNotFoundError("获取文件不合法,请查看配置文件file节点下key或data_config文件夹内文件是否正确")
def get_host(self, key):
"""根据key获取table节点下的值"""
try:
return self.conf.get("host", key)
except:
log.error("获取配置文件host节点下值错误,请查看配置文件或传入key是否正确")
raise KeyError("获取配置文件host节点下值错误,请查看配置文件或传入key是否正确")
def get_table(self, key):
"""根据key获取table节点下的值"""
try:
return self.conf.get("table", key)
except:
log.error("获取配置文件table节点下值错误,请查看配置文件或传入key是否正确")
raise KeyError("获取配置文件table节点下值错误,请查看配置文件或传入key是否正确")
def get_sql(self, key):
"""根据key获取sql节点下的值"""
try:
return self.conf.get("sql", key)
except:
log.error("获取配置文件sql节点下值错误,请查看配置文件或传入key是否正确")
raise KeyError("获取配置文件sql节点下值错误,请查看配置文件或传入key是否正确")
def get_login_url(self, key):
try:
return self.get_host("host") + self.conf.get("login", key)
except:
log.error("获取配置文件login节点下值错误,请查看配置文件或传入key是否正确")
raise KeyError("获取配置文件login节点下值错误,请查看配置文件或传入key是否正确")
if __name__ == '__main__':
r = ReadIni()
print(r.get_table("table_name"))
print(r.get_sql("host"))
print(r.get_file("excel"))
print(r.get_host("host"))
print(r.get_login_url("address"))
#D:\hexi\python_test\InterfaceAutoTest01\data_config\APIAutoTest1.xlsx
#D:\hexi\python_test\InterfaceAutoTest01\data_config\APIAutoTest1.xlsx
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_test
# FileName: read_json.py
# Author: xxxxxxx
# Datetime: 2023/11/4 10:55
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
import json
import os
from InterfaceAutoTest01.common import log
def read_json(json_path):
"""打开json文件,获取里面数据并返回"""
if type(json_path) == str:
if json_path.endswith(".json") and os.path.isfile(json_path):
try:
with open(json_path, mode="r", encoding="utf-8") as f:
return json.load(f)
except:
log.error("打开json文件错误,请查看json文件内容是否正确")
raise FileExistsError("打开json文件错误,请查看json文件内容是否正确")
else:
log.error("传入json文件路径错误,请查看传入json文件路径是否正确")
raise FileNotFoundError("传入json文件路径错误,请查看传入json文件路径是否正确")
else:
log.error("传入json文件路径格式错误,请查看传入json文件路径是否为字符串")
raise FileNotFoundError("传入json文件路径格式错误,请查看传入json文件路径是否为字符串")
if __name__ == '__main__':
print(read_json("D:\hexi\python_test\InterfaceAutoTest01\data_config\case_dataq.json"))
[host]
host=http://120.46.172.186:8080
[table]
table_name=BPM
[login]
address=/auth
[sql]
host=120.46.172.186
port=3306
user=root
password=root@2023
database=eipsaas
{
"认证接口": {
"登录系统": {
"LoginSuccess": {"username": "admin", "password": "MTIzNDU2"},
"LoginUsernameEmpty": {"username": "", "password": "MTIzNDU2"},
"LoginUsernameLong": {"username": "adminadminadminadminadminadminadmin", "password": "MTIzNDU2"},
"LoginUsernameSpecial": {"username": "►◄▧▨♨◐◑", "password": "MTIzNDU2"},
"LoginPasswordEmpty": {"username": "admin", "password": ""},
"LoginPasswordSpecial": {"username": "admin", "password": "►◄▧▨♨◐◑"},
"LoginPasswordLong": {"username": "admin", "password": "MTIzNDU2MTIzNDU2MTIzNDU2MTIzNDU2MTIzNDU2MTIzNDU2"},
"LoginUsernameParameterEmpty": {"": "admin", "password": "MTIzNDU2"},
"LoginUsernameParameterKeywords": {"class": "admin", "password": "MTIzNDU2"},
"LoginPasswordParameterEmpty": {"username": "admin", "": "MTIzNDU2"},
"LoginPasswordParameterKeywords": {"username": "admin", "class": "MTIzNDU2"}
}
},
"维度管理": {
"添加维度": {
"AddDemSuccess": {
"code": "dem_test57_abc",
"description": "测试维度57",
"isDefault": 0,
"name": "测试57期的维度"
},
"AddDemCodeEmpty": {
"code": "",
"description": "测试维度57",
"isDefault": 0,
"name": "测试57期的维度"
}
},
"根据维度编码获取维度信息": {
"GetDemMessageSuccess": {
"code": "dem_test57_abc"
}
},
"根据维度编码删除维度": {
"DeleteDemSuccess": {
"ids": "不知道"
}
}
},
"组织管理": {
"添加组织": {
"AddOrgSuccess": {
"code": "test_org_57",
"demId": "不知道",
"exceedLimitNum": 0,
"grade": "",
"limitNum": 0,
"name": "测试组织",
"nowNum": 0,
"orderNo": 0,
"parentId": "0"
}
},
"添加组织参数": {
"AddOrgParamsSuccess": {
"query": {
"orgCode": "test_org_57"
},
"body": [
{
"alias": "sz",
"value": 9000
}
]
}
},
"删除组织": {
"DelOrgSuccess": "test_org_57"
}
}
}
\ No newline at end of file
{
"认证接口": {
"登录系统": {
"LoginSuccess": {"username":"超级管理员", "account":"admin"},
"LoginUsernameEmpty": {"state": false, "message":"账号或密码错误"},
"LoginUsernameLong": {"state": false, "message":"账号或密码错误"},
"LoginUsernameSpecial": {"state": false, "message":"账号或密码错误"},
"LoginPasswordEmpty": {"state": false, "message":"账号或密码错误"},
"LoginPasswordSpecial": {"state": false, "message":"账号或密码错误"},
"LoginPasswordLong": {"state": false, "message":"账号或密码错误"},
"LoginUsernameParameterEmpty": {"state": false, "message":"账号或密码错误"},
"LoginUsernameParameterKeywords": {"state": false, "message":"账号或密码错误"},
"LoginPasswordParameterEmpty": {"state": false, "message":"账号或密码错误"},
"LoginPasswordParameterKeywords": {"state": false, "message":"账号或密码错误"}
}
},
"维度管理": {
"添加维度": {
"AddDemSuccess": {
"state": true,
"message": "添加维度成功!"
},
"AddDemCodeEmpty": {
"state": false,
"message": "添加维度失败!"
}
},
"根据维度编码获取维度信息": {
"GetDemMessageSuccess": {
"demCode": "dem_test57_abc",
"name": "测试57期的维度"
}
},
"根据维度编码删除维度": {
"DeleteDemSuccess": {
"state": true,
"message": "删除维度成功!"
}
}
},
"组织管理": {
"添加组织": {
"AddOrgSuccess": {
"state": true,
"message": "添加组织成功!"
}
},
"添加组织参数": {
"AddOrgParamsSuccess": {
"state": true,
"message": "保存组织参数成功!"
}
},
"删除组织": {
"DelOrgSuccess": {
"state": true,
"message": "删除组织成功!"
}
}
}
}
\ No newline at end of file
{
"维度管理": {
"添加维度": {
"AddDemSuccess": "DELETE FROM uc_demension WHERE `CODE_`=\"dem_test57_abc\";"
},
"根据维度编码删除维度": {
"DeleteDemSuccess": "SELECT ID_ from uc_demension WHERE `CODE_`=\"dem_test57_abc\";"
}
},
"组织管理": {
"添加组织": {
"AddOrgSuccess": {
"select": "SELECT ID_ from uc_demension WHERE `CODE_`=\"dem_test57_abc\";",
"delete": "DELETE FROM uc_org WHERE `CODE_`=\"test_org_57\";"
}
}
}
}
\ No newline at end of file
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_test
# FileName: __init__.py
# Author: xxxxxxx
# Datetime: 2023/11/4 9:15
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_test
# FileName: requests_method.py
# Author: xxxxxxx
# Datetime: 2023/11/4 15:22
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
import base64
import requests
from InterfaceAutoTest01.common import log
from InterfaceAutoTest01.common.read_ini import ReadIni
class RequestsMethod:
def __init__(self):
read_ini = ReadIni()
login_url = read_ini.get_login_url("address")
login_data = {"username": "admin", "password": base64.b64encode("123456".encode()).decode()}
self.session = requests.sessions.Session()
res = self.session.request(method="POST", url=login_url, json=login_data)
self.session.headers.update({"Authorization": "Bearer "+res.json()["token"]})
def request_all(self, method, url, mime, data):
if mime == "json" or mime == "application/json":
return self.session.request(method=method, url=url, json=data)
elif mime == "x-www-form-urlencoded" or mime == "application/x-www-form-urlencoded":
return self.session.request(method=method, url=url, data=data)
elif mime == "form-data" or mime == "multipart/form-data":
return self.session.request(method=method, url=url, files=data)
elif mime == "query" or mime == "params" or mime == "param":
return self.session.request(method=method, url=url, params=data)
elif mime is None:
return self.session.request(method=method, url=url)
# 判断媒体类型是否为query|body 或者 body|query 、json|query、query|json
elif mime == "query|body" or mime == "body|query" or mime == "json|query" or mime == "query|json":
return self.session.request(method=method, url=url, params=data["query"], json=data["body"])
else:
log.error("传入的媒体类型的值错误,请察看excel中是否填入正确")
raise NameError("传入的媒体类型的值错误,请察看excel中是否填入正确")
if __name__ == '__main__':
r = RequestsMethod()
\ No newline at end of file
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_test
# FileName: __init__.py
# Author: xxxxxxx
# Datetime: 2023/11/4 9:15
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_test
# FileName: BPM_test.py
# Author: xxxxxxx
# Datetime: 2023/11/4 15:50
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
import allure
import pytest
from InterfaceAutoTest01.common import log
from InterfaceAutoTest01.common.read_excel import ReadExcel
class TestBPM:
@allure.epic("BPM项目-何茜")
# @allure.feature("模块名称")
# @allure.story("接口名称")
# @allure.title("用例标题")
# @allure.severity("用例等级")
@pytest.mark.parametrize("row, module_name, api_name, title, level, url, method, mime, case_data, expect_data, sql_type, sql_data, update_key", ReadExcel("BPM", "hexi").all_data())
def test_bpm(self, req_fix, db_fix, row, module_name, api_name, title, level, url, method, mime, case_data, expect_data, sql_type, sql_data, update_key):
# 影响allure报告的数据,不影响代码流程
allure.dynamic.feature(module_name)
allure.dynamic.story(api_name)
allure.dynamic.title(title)
allure.dynamic.severity(level)
if sql_type == "select":
value = db_fix.select(sql_data)
case_data[update_key] = value
if sql_type == "delete":
db_fix.delete(sql_data)
if sql_type == "delete|select" or sql_type == "select|delete":
db_fix.delete(sql_data["delete"])
value = db_fix.select(sql_data["select"])
case_data[update_key] = value
res = req_fix.request_all(method=method, url=url, mime=mime, data=case_data)
try:
for key in expect_data:
assert res.json().get(key) == expect_data[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_test
# FileName: __init__.py
# Author: xxxxxxx
# Datetime: 2023/11/8 18:38
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName: python_test
# FileName: conftest.py
# Author: xxxxxxx
# Datetime: 2023/11/4 15:51
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# ---------------------------------------------------------------------------
import pytest
from InterfaceAutoTest01.common.db import DB
from InterfaceAutoTest01.requests_method.requests_method import RequestsMethod
@pytest.fixture(scope="session")
def req_fix():
req = RequestsMethod()
return req
@pytest.fixture(scope="session")
def db_fix():
db = DB()
return db
# def pytest_collection_modifyitems(items):
# # item表示每个测试用例,解决用例名称中文显示问题
# for item in items:
# item.name = item.name.encode("utf-8").decode("unicode-escape")
# item._nodeid = item._nodeid.encode("utf-8").decode("unicode-escape")
[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/bpm_log.log
;设置日志保存在文件中的级别
log_file_level=notset
;设置日志在文件中的信息格式
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
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