公共用例库计划--个人版(一)

1、公共用例库计划

1.1、目标

在公司测试管理体系的演变过程中,从禅道过渡到devops再到云效平台,我们已经实现了对bug和用例的有效集中管理。然而,在实际操作中发现,尽管用例管理得到了初步整合,但在面对不同系统和测试类型时,缺乏一套完善的公共用例库体系,导致每次进行新系统测试时都需要大量重复编写测试用例。即使在一定程度上参考了以往项目的用例,但复用程度并不理想,这不仅浪费了宝贵的测试资源,也不利于经验总结与传承。

因此,本次计划的核心任务是开发一个,个人版的公共用例库,旨在将各系统和各类测试场景下的通用、基础以及关键功能的测试用例进行系统性地归纳整理,并以提高用例的复用率为目标,力求最大限度地减少重复劳动,提升测试效率。通过搭建并维护这个公共用例库,能够更好地积累和分享测试经验,降低由于人为疏忽或遗漏而产生的漏测风险,确保产品质量得到持续稳定的保障。同时,这一举措也将有助于团队内部知识共享和标准化建设,为今后的测试工作打下坚实的基础。

1.2、任务概述

工作内容包括:完成公共用例库的开发实施工作,包括需求分析、系统设计、开发、测试、打包、运行维护等工作。

2、分析与设计

2.1、功能性需求

2.1.1 主页
  • 主页作为系统的入口和概览界面,主要展示关键的统计信息:
    • 模块总数:展示当前系统内所有模块的数量。
    • 用例总数:显示所有已创建的测试用例数量。
    • 各用例类型数:列出并统计各类测试用例(如功能测试、性能测试、兼容性测试等)的数量。
2.1.2 用例库
  • 模块管理
    • 模块新增:创建新的测试模块,用于归类和组织相关联的测试用例,支持3级目录。
    • 模块编辑:更改模块名称、描述或其他属性,以适应业务需求的变化。
    • 模块查询:搜索特定的测试模块,便于查看该模块下的所有测试用例。
    • 模块删除:将不再需要的模块移至回收站,保持用例库结构清晰有序。
  • 用例管理
    • 新增:先选择模块,再创建新的测试用例,填写详细的用例标题、前置条件、操作步骤、预期结果等信息。
    • 编辑:提供对已有用例进行修改的功能,可以更新用例的各种属性或内容。
    • 复制:支持复制现有用例在原模块下创建一个相同的新用例,便于快速生成类似的测试场景。
    • 查询:通过关键字搜索、过滤器等方式查找所需的测试用例。
    • 删除:从用例库中移除不再需要的测试用例,放入回收站而非直接永久删除。
2.1.3 导入导出
  • 下载模版:为用户提供标准的Excel模版文件,方便按照统一格式编写和导入用例数据。
  • 导入用例Excel:支持用户上传已经填写好的Excel模版文件,自动解析并导入到用例库中。
  • 导出用例:选择特定的模块,将该模块下的所有用例数据导出为Excel文件。
2.1.4 回收站
  • 恢复:对于被删除的用例或模块,允许用户在一定时间内将其恢复到原始位置。
  • 彻底删除:若确定不再需要某项已放入回收站的内容,可执行彻底删除操作,使其无法再被恢复。
2.1.5 关于
  • 提供系统版本信息、版权声明、使用帮助文档等相关信息,帮助用户更好地理解和使用公共用例库系统。

在这里插入图片描述

2.3、环境准备

开发流程:使用Qt Disinger设计UI,PyUIC把Qt Designer生成的.ui文件换成.py文件
环境:

win10+pycharm
Python3.9sqlite3PyQt6		6.6.1PyQt6-Qt6	6.6.1PyQt6-sip	13.6.0pyqt6-tools	6.4.2.3.3
Qt Designer软件	5.11.1

环境配置参考:

  • Python GUI编程:https://www.kancloud.cn/ay66544/pygui/3044831
  • PyQt窗口设计之Qt
    Designer:https://blog.csdn.net/Itsme_MrJJ/article/details/122668802

环境安装pyqt下载一直很慢,国内源也是。PyQt6与PyQt6-Qt6必须安装版本一致,不然会报错dll找不到运行程序。

3、数据架构设计

使用SQLite数据库存储用例及模块数据,SQLite 的使用下面这篇文章讲的很好。后面的封装示例直接拿来用了。
Python操作SQLite数据库(非常详细):https://c.biancheng.net/view/vb3b93m.html

3.1、表设计

表一:testcase(测试用例表)
表二:module(模块表)
在这里插入图片描述

3.2、数据库表与操作封装

至此,数据库层面的代码基本实现,后续需要设计GUI界面,与功能需求的代码实现

# !/usr/bin/env python
# -*- coding:utf-8 -*-import sqlite3
import datetimeclass 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,--父idlevel TEXT,--层级parent_path TEXT,--路径modulename TEXT NOT NULL,--名称status TEXT,--是否启用 1/0order_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 Trueexcept 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 Trueexcept 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 rexcept 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 rexcept 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 Trueelse:print("[sql is not delete]")return Falseexcept Exception as e:print("[detele record error]", e)return Falsedef 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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/588495.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python高级并发编程的实例详解

更多Python学习内容:ipengtao.com Python中的高效并发编程,有几个重要的概念和工具可以帮助大家充分利用多核处理器和提高程序性能。本文将介绍一些关键的概念和示例代码,以帮助大家更好地理解Python中的高效并发编程。 多线程 vs. 多进程 在…

计算机网络【HTTP 面试题】

HTTP的请求报文结构和响应报文结构 HTTP请求报文主要由请求行、请求头、空行、请求正文(Get请求没有请求正文)4部分组成。 1、请求行 由三部分组成,分别为:请求方法、URL以及协议版本,之间由空格分隔;请…

全栈架构:从0开始,Vue的搭建与开发

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中,很多小伙伴拿到一线互联网企业、上市企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 然后,很多小伙伴平时聚焦CRUD,没有亮点项目, 黄金项目。 简历也写得是非常lo…

Generalized Focal Loss V1论文解读

摘要 单级检测器基本上将物体检测表述为密集分类和定位(即边界框回归)。分类通常通过Focal Loss进行优化,而边界框的定位通常根据Dirac delta分布进行学习。单级检测器的最新趋势是引入一个单独的预测分支来估计定位质量,预测质量…

【javaSE】代理并不难

代理: 代理模式最主要的就是在不改变原来代码(就是目标对象)的情况下实现功能的增强 在学习AOP之前先了解代理,代理有两种:一种是动态代理,一类是静态代理。 静态代理 相当于是自己写了一个代理类&#…

力扣(leetcode)第257题二叉树的所有路径(Python)

257.二叉树的所有路径 题目链接:257.二叉树的所有路径 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [1,2,3,null,5] 输出…

win10和win11上解决乱码的一个优点偏门的方法,不算很完美

左下角搜索控制面板,进入控制面板之后,点击时钟和区域下面的更改日期、时间或数字格式 点击顶上的“管理”选项,然后找到更改系统区域设置,把下方的Beta版:使用Unicode UTF-8提供全球语言支持(U&#xff…

视频批量转码:一键转换多个视频mp4格式到FLV视频

在数字媒体时代,视频格式的多样性给处理工作带来了诸多不便。满足不同的播放需求,经常要视频从一种格式转换为另一种格式。其中,将mp4格式转换为FLV格式的需求很常见。现在一起来看下云炫AI智剪如何高效的将视频批量转码方法,一键…

[Angular] 笔记 21:@ViewChild

chatgpt: 在 Angular 中,ViewChild 是一个装饰器,用于在组件类中获取对模板中子元素、指令或组件的引用。它允许你在组件类中访问模板中的特定元素,以便可以直接操作或与其交互。 例如,如果你在模板中有一个子组件或一个具有本地…

\r\n和缓冲区/进度条小程序

一 前置知识 带有\n就会立马刷新缓冲区(因为显示器是行刷新),\r不会刷新缓冲区 刷新的2个场景: 1 ~fflush 缓冲区中存在\r或\n --> \r fflush --> 不换行的\n) 2 ~ 文件关闭自动刷新缓冲区 倒计时小程序0-9 %-d是左对齐,%d是右对齐 倒计时小程序0-99 …

在Go中使用Goroutines和Channels发送电子邮件

学习如何使用Goroutines和Channels在Go中发送电子邮件 在现代软件开发的世界中,通信是一个关键元素。发送电子邮件是各种目的的常见实践,例如用户通知、报告等。Go是一种静态类型和编译语言,为处理此类任务提供了高效和并发的方式。在本文中&…

BED 文件格式 chip-seq m6a数据可视化会用到

General usage — bedtools 2.31.0 documentationhttps://bedtools.readthedocs.io/en/latest/content/general-usage.html BED格式(Browser Extensible Data format)是一种在生物信息学中广泛使用的文本文件格式,用于描述基因组上的特征和…

机器人中的数值优化之线性共轭梯度法

欢迎大家关注我的B站: 偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com) 本文ppt来自深蓝学院《机器人中的数值优化》 目录 1.无约束优化方法对比 2.Hessian-vec product 3.线性共轭梯度方法的步长​编辑 4.共轭梯度…

7.10非递减子序列(LC491-M)

算法: 在90.子集II (opens new window)中我们是通过排序,再去重来达到去重的目的。 而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。 肯定还是回溯算法。 画树: 树里面其实有两个注意…

[python]python利用pyaudio录制系统声音没有立体声混音怎么录制系统音频

当电脑没有立体声混音导致Python写代码无法使用pyaudio进行录制系统声音怎么办?查阅资料和安装驱动等方法都不行,难道没办法了吗?那为什么电脑其他软件可以做到呢?因此研究了一下pyaudio在没有立体声混音情况下确实无法录制声音&a…

SpringBoot发布项目到docker

Dockerfile FROM openjdk:11 # 作者 MAINTAINER chenxiaodong<2774398338qq.com># 安装 vim # RUN yum -y install vim# 环境变量 # 进入容器后的默认工作目录 ENV WORKPATH /usr/local/webapp ENV EXECFILE Docker2Application-0.0.1-SNAPSHOT.jarRUN mkdir -p $WORKPA…

Android Matrix画布Canvas旋转Rotate,Kotlin

Android Matrix画布Canvas旋转Rotate&#xff0c;Kotlin private fun f1() {val originBmp BitmapFactory.decodeResource(resources, R.mipmap.pic).copy(Bitmap.Config.ARGB_8888, true)val newBmp Bitmap.createBitmap(originBmp.width, originBmp.height, Bitmap.Config.…

软件开发新手用哪个IDE比较好?软件开发最好的IDE都在这!

目录 IDES 的优点 最佳编程 IDE 列表 Java 开发的流行集成开发环境 JetBrains 的 IntelliJ IDEA NetBeans 适用于 C/ C、C# 编程语言的最佳 IDE Visual Studio 和 Visual Studio 代码 Eclipse PHP 开发的最佳 IDE PHPStorm Sublime Text Atom JavaScript 的顶级 I…

Python:正则表达式速通,码上上手!

1前言 正则表达式&#xff08;Regular Expression&#xff09;是一种用来描述字符串模式的表达式。它是一种强大的文本匹配工具&#xff0c;可以用来搜索、替换和提取符合特定模式的文本。 正则表达式由普通字符&#xff08;例如字母、数字、符号等&#xff09;和元字符&#…

2023 AI开发者生态报告

随着人工智能技术的飞速发展&#xff0c;全球IT市场对AI的投入持续增长&#xff0c;预计到2027年将达到4236亿美元。中国作为AI领域的重要参与者&#xff0c;其投资规模预计将占全球的9%。在这样的背景下&#xff0c;2023年的《AI开发者生态报告》为我们揭示了人工智能时代的技…