在公司测试管理体系的演变过程中,从禅道过渡到devops再到云效平台,我们已经实现了对bug和用例的有效集中管理。然而,在实际操作中发现,尽管用例管理得到了初步整合,但在面对不同系统和测试类型时,缺乏一套完善的公共用例库体系,导致每次进行新系统测试时都需要大量重复编写测试用例。即使在一定程度上参考了以往项目的用例,但复用程度并不理想,这不仅浪费了宝贵的测试资源,也不利于经验总结与传承。
因此,本次计划的核心任务是开发一个,个人版的公共用例库,旨在将各系统和各类测试场景下的通用、基础以及关键功能的测试用例进行系统性地归纳整理,并以提高用例的复用率为目标,力求最大限度地减少重复劳动,提升测试效率。通过搭建并维护这个公共用例库,能够更好地积累和分享测试经验,降低由于人为疏忽或遗漏而产生的漏测风险,确保产品质量得到持续稳定的保障。同时,这一举措也将有助于团队内部知识共享和标准化建设,为今后的测试工作打下坚实的基础。
工作内容包括:完成公共用例库的开发实施工作,包括需求分析、系统设计、开发、测试、打包、运行维护等工作。
开发流程:使用Qt Disinger设计UI,PyUIC把Qt Designer生成的.ui文件换成.py文件
环境:
win10+pycharm
Python3.9
sqlite3
PyQt6 6.6.1
PyQt6-Qt6 6.6.1
PyQt6-sip 13.6.0
pyqt6-tools 6.4.2.3.3
Qt Designer软件 5.11.1
环境配置参考:
环境安装pyqt下载一直很慢,国内源也是。PyQt6与PyQt6-Qt6必须安装版本一致,不然会报错dll找不到运行程序。
使用SQLite数据库存储用例及模块数据,SQLite 的使用下面这篇文章讲的很好。后面的封装示例直接拿来用了。
Python操作SQLite数据库(非常详细):https://c.biancheng.net/view/vb3b93m.html
表一:testcase(测试用例表)
表二:module(模块表)
至此,数据库层面的代码基本实现,后续需要设计GUI界面,与功能需求的代码实现
# !/usr/bin/env python
# -*- coding:utf-8 -*-
import sqlite3
import datetime
class casedb:
'''用例库操作,增删改查'''
def __init__(self):
'''初始化,连接数据库,建表'''
try:
self.connect()
# 创建模块表
self.cursor.execute(f"""
CREATE TABLE IF NOT EXISTS module (
moduleid INTEGER PRIMARY KEY AUTOINCREMENT,--模块编号
parent_id TEXT NOT NULL,--父id
level TEXT,--层级
parent_path TEXT,--路径
modulename TEXT NOT NULL,--名称
status TEXT,--是否启用 1/0
order_num TEXT--顺序
)""")
# 创建用例表
self.cursor.execute("""
CREATE TABLE IF NOT EXISTS testcase (
caseid INTEGER PRIMARY KEY AUTOINCREMENT, --用例编号
moduleid INTEGER NOT NULL, --所属模块
title TEXT NOT NULL, --用例标题
preconditions TEXT, --前置条件
step TEXT NOT NULL, --步骤
expect TEXT, --预期
keyword TEXT, --关键词
priority TEXT, --优先级
types TEXT, --用例类型
status TEXT, --用例状态
modificationdate TEXT default TIMESTAMP, --修改日期
counts TEXT, --导出次数
remarks TEXT --备注
)""")
self.conn.commit()
self.over()
print("[数据库连接成功]")
except Exception as e:
print("[create table error]", e)
def connect(self):
'''连接数据库'''
self.conn=sqlite3.connect('testcaes.db') # 连接数据库
self.cursor=self.conn.cursor() # 创建游标
# 插入或更新表数据,一次插入或更新一条数据
def operate_one(self, sql: str, value: tuple):
"""
插入或更新单条表记录
:param sql: insert语句或update语句
:param value: 插入或更新的值,形如()
:return: True表示插入或更新成功
"""
try:
self.cursor.execute(sql, value)
self.conn.commit()
if 'INSERT' in sql.upper():
print("[insert one record success]")
if 'UPDATE' in sql.upper():
print("[update one record success]")
return True
except Exception as e:
print("[insert/update one record error]", e)
self.conn.rollback()
return False
# 插入或更新表数据,一次插入或更新多条数据
def operate_many(self, sql: str, value: list):
"""
插入或更新多条表记录
:param sql: insert语句或update语句
:param value: 插入或更新的字段的具体值,列表形式为list:[(),()]
:return: True表示插入或更新成功
"""
try:
# 调用executemany()方法
self.cursor.executemany(sql, value)
self.conn.commit()
if 'INSERT' in sql.upper():
print("[insert many records success]")
if 'UPDATE' in sql.upper():
print("[update many records success]")
return True
except Exception as e:
print("[insert/update many records error]", e)
self.conn.rollback()
return False
# 查询一条数据
def query_one(self, sql: str, params=None):
"""
查询单条数据
:param sql: select语句
:param params: 查询参数,形如()
:return: 语句查询单条结果
"""
try:
if params:
self.cursor.execute(sql, params)
else:
self.cursor.execute(sql)
# 调用fetchone()方法
r=self.cursor.fetchone()
print("[select one record success]")
return r
except Exception as e:
print("[select one record error]", e)
# 查询多条数据
def query_many(self, sql: str, params=None):
"""
查询多条数据
:param sql: select语句
:param params: 查询参数,形如()
:return: 语句查询多条结果
"""
try:
if params:
self.cursor.execute(sql, params)
else:
self.cursor.execute(sql)
# 调用fetchall()方法
r=self.cursor.fetchall()
print(f"[select many records success]")
return r
except Exception as e:
print("[select many records error]", e)
# 删除表数据
def delete_record(self, sql: str):
"""
删除表记录
:param sql: 删除记录SQL语句
:return: True表示删除成功
"""
try:
if 'DELETE' in sql.upper():
self.cursor.execute(sql)
self.conn.commit()
print("[detele record success]")
return True
else:
print("[sql is not delete]")
return False
except Exception as e:
print("[detele record error]", e)
return False
def over(self):
'''关闭连接'''
self.cursor.close()
self.conn.close()
def main(self):
#插入数据
self.operate_one(('INSERT INTO module VALUES (NULL,?,?,?,?,?,?)'),('1','1','0/1','更多查询','1','1'))
# self.operate_many(('INSERT INTO testcase VALUES (NULL,?,?,?,?,?,?,?,?,?,?,?,?,?)'),[
# ('1', '选择查询日期', '无', '1、打开页面,选择日期,点击查询', '查询出相应日期结果', '日期查询', '', '', '', '', '', '', ''),
# ('1', '选择下拉', '无', '1、打开页面,选择下拉,点击查询', '查询出相应结果', '下拉查询', '', '', '', '', '', '', '')])
# 更新数据SQL语句
current_time=datetime.datetime.now()# 获取当前时间
update_sql="update testcase set modificationdate=? where caseid=?"
update_value=(current_time, '2')
update_values=[(current_time, '1'), (current_time, '3')]
self.operate_one(update_sql, update_value)# 一次更新一条数据
self.operate_many(update_sql, update_values)# 一次更新多条数据
#查询数据
row=self.query_many(("select * from testcase where moduleid=?"),'1')
print(row)
#删除数据
delete_sql="delete from module where moduleid = '7'"
self.delete_record(delete_sql)
self.over()
if __name__ == '__main__':
a=casedb()
a.connect()
row=a.query_many(("select * from module"))
print(row)
a.over()