在conftest中,添加钩子函数
@pytest.hookimpl(tryfirst=True)
def pytest_terminal_summary(terminalreporter):
status_all = ["passed", "failed", "skipped"]
for status in status_all:
result_insert_sqllite(terminalreporter, status)
钩子函数的实现
"""
将pytest运行结果存储到sqllite数据库
1. pytest运行结果存库,
2. 根据文件名称,解析 iussenum 插入
"""
from com.get_filename import parse_filename
def result_insert_sqllite(terminalreporter, status):
"""
:param terminalreporter:
:param status: 用例运行结果,passed,failed,skipped
"""
# 遍历所有测试结果
for test in terminalreporter.stats.get(status, []):
list_name = test.nodeid.split("::")
# 先去查询一下,如果没有就插入.有更新
sql_query = "select count(1) from pytest_result where def_name=?"
def_name = list_name[2].split('[')[0]
arg = (def_name,)
query_result = DBlite().select(sql_query, arg)
if status == "passed":
test.longrepr == ''
if query_result[0][0] == 0:
"""
此时,在pytest_result中未记录,要进行插入
"""
sql = "insert into pytest_result(file_name, class_name, def_name, result, duration, message) values (?,?,?,?,?,?)"
arg = (list_name[0], list_name[1], list_name[2].split('[')[0], status, test.duration, str(test.longrepr))
DBlite().change(sql, arg)
# 2. 更新结果的iussenum
# 文件名 , list_name[0],
jira_case_list = parse_filename(list_name[0])
sql = "UPDATE pytest_result SET jira_num_list=? WHERE def_name = ?"
arg = (str(jira_case_list)[1:-1], list_name[2].split('[')[0])
DBlite().change(sql, arg)
else:
jira_case_list = parse_filename(list_name[0])
sql = "UPDATE pytest_result SET jira_num_list=? WHERE def_name = ?"
arg = (str(jira_case_list)[1:-1], list_name[2].split('[')[0])
DBlite().change(sql, arg)
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
sql = "UPDATE pytest_result SET result = ?, duration = ?, message = ?, result_time=? WHERE def_name = ?"
arg = (status, test.duration, str(test.longrepr), current_time, list_name[2].split('[')[0])
DBlite().change(sql, arg)
表结构
create table pytest_result
(
id INTEGER not null
constraint pytest_result_pk
primary key autoincrement,
file_name varchar(100),
class_name varchar(50),
def_name varchar(60),
result varchar(10),
result_time TIMESTAMP DEFAULT (datetime('now', 'localtime')),
status INT default 0,
create_time TIMESTAMP DEFAULT (datetime('now', 'localtime')),
duration varchar(30),
message TEXT,
cycle_id INTEGER,
jira_num_list TEXT
);