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

news2025/4/21 19:48:31

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.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

环境配置参考:

  • 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 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()

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

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

相关文章

List集合格式转换

最近遇到一个任务: 需要把A集合数据转成 B集合的形式: A集合: B集合: 代码: package com.example.juc.test;import com.example.juc.entity.Ld; import com.example.juc.entity.Student;import java.lang.reflect.F…

跨境电商迎来综合竞争力比拼时代 五大趋势解读跨境2024

过去几年,跨境电商成为外贸出口增长的一大亮点,随着年底国务院办公厅《关于加快内外贸一体化发展的若干措施》的发布,跨境电商在促进经济发展、助力内外贸一体化发展方面的价值更加凸显。 这是跨境电商变化最快的时代,也是跨境电…

C练习——判断三角形并求面积

题目:从健盘任意输入三角形的三边长为a,b,c,编程判断a,b,c的值能否构成一个三角形,若能构成三角形,则计算并输出三角形的面积,否则提示不能构成三角形。 已知构成三角形的条件是:任意两边之和大于第三边。 解析&#…

多输入多输出 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入多输出预测

多输入多输出 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入多输出预测 目录 多输入多输出 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入多输出预测预测效果基本介绍模型背景程序设计参考资料 预测效果 基本介绍 MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入…

学习体系结构 - AArch64 异常模型

学习体系结构 - AArch64 异常模型 Learn the architecture - AArch64 Exception Model version 1.3 根据DeepL翻译 校准 1、Overview AArch64异常模型指南,介绍了Armv8-A和Armv9-A中的异常和特权模型。它涵盖了Arm架构中不同类型的异常以及处理器在处理异常时的行…

Github项目推荐-vocal-separate

项目地址 vocal-separate: 项目简述 这是一个音乐和人声分离的项目,基于python开发。有图形化操作界面,看起来还不错。 项目截图

windows PE文件都包含哪些信息【详细汇总介绍】

目录 1. DOS头 DOS头的作用 DOS头的结构 C代码判断PE文件 2. PE文件签名 PE文件签名的位置和作用 PE文件签名的结构 COFF(Common Object File Format)头 COFF头的结构 COFF头的作用 代码 3. 标准PE头&可选PE头 标准PE头 可选PE头 4. …

年底离职了?2024普通人失业怎么创业?2024创业风口!

有多少人会在12月份离职?这是近期热门的话题,年底了,离职潮也来了。是工作压力大?是跟同事相处不好?是公司发展没前景?不,统统都不是。离职无外乎一个原因:工资低! 我们除了打工还…

数据结构,题目笔记

哈希表 线性探测再散列 【算法数据结构|哈希查找|哈希冲突|除留余数法|线形探测法|例题讲解】https://www.bilibili.com/video/BV1514y1P7BK?vd_source1a684a3a1b9d05485b3d6277aeeb705d 【二次探测再散列法】 【【…

pygame学习(一)——pygame库的导包、初始化、窗口的设置、打印文字

导语 pygame是一个跨平台Python库(pygame news),专门用来开发游戏。pygame主要为开发、设计2D电子游戏而生,提供图像模块(image)、声音模块(mixer)、输入/输出(鼠标、键盘、显示屏)…

华为HCIE-Datacom课程介绍

厦门微思网络HCIE-Datacom课程介绍 一、认证简介 HCIE-Datacom(Huawei Certified ICT Expert-Datacom)认证是华为认证体系中的顶级认证,HCIE-Datacom认证定位具备坚实的企业网络跨场景融合解决方案理论知识,能够使用华为数通产品…

Go语言中的HTTP重定向

大家好,我是你们可爱的编程小助手,今天我们要一起探讨如何使用Go语言实现HTTP重定向,让我们开始吧! 大家都知道,网站开发中有时候需要将用户的请求从一个URL导向到另一个URL。比如说,你可能想将旧的URL结构…

【Java开发岗面试】八股文—Java框架(Spring+SpringMVC+MyBatis+SpringBoot)

声明: 背景:本人为24届双非硕校招生,已经完整经历了一次秋招,拿到了三个offer。本专题旨在分享自己的一些Java开发岗面试经验(主要是校招),包括我自己总结的八股文、算法、项目介绍、HR面和面试…

分库分表之Mycat应用学习一

1 为什么要分库分表 1.1 数据库性能瓶颈的出现 对于应用来说,如果数据库性能出现问题,要么是无法获取连接,是因为在高并发的情况下连接数不够了。要么是操作数据变慢,数据库处理数据的效率除了问题。要么是存储出现问题&#xf…

考研后SpringBoot复习1

考研后SpringBoot复习 Hello World入门 复习的版本为SpringBoot2的版本 创建maven项目 在pom文件中导入SpringBoot的依赖同时引入web开发的启动器 <!--声明springboot父项目--><parent><groupId>org.springframework.boot</groupId><artifactId>…

桶排序 BucketSort

桶排序 桶排序是将数组分散到有限的桶中&#xff0c;然后每个桶再分别排序&#xff0c;而每个桶的排序又可以使用其他排序方式进行排序&#xff0c;可以是桶排序也可以是其他排序。一句话就是: 划分多个范围相同的区间&#xff0c;每个子区间自排序最后合并。 桶的大小可以随…

U-ViT:A ViT Backbone for Diffusion Models

文章目录 Abstract1. Introduction2. Background3. Method3.1. Implementation Details3.2. Effect of Depth, Width and Patch Size 4. Related Work5. Experiments5.1. Experimental Setup5.2. Unconditional and Class-Conditional Image Generation5.3. Text-to-Image Gene…

黑马程序员SSM框架-SpringMVC

课程链接&#xff1a;SpringMVC-01-SpringMVC简介_哔哩哔哩_bilibili SpringMVC简介 表现层框架 概述 入门案例 入门案例工作流程 SpringMVC对应的bean加载和Spring对应的bean加载 我们发现SpringMVC要加载controller的bean对象&#xff0c;Spring容器要加载除了controller类…

[大厂实践] Chick-fil-A的服务API流程实践

本文介绍了美国快餐连锁巨头Chick-fil-A在技术团队中引入Buf和Connect解耦API依赖并实现了良好的API定义模式。原文: Connect(ing) Chick-fil-A 背景 2018年&#xff0c;Chick-fil-A的客户技术团队遇到了一些API问题。该团队擅长构建API&#xff0c;这些API可以实现一些了不起的…

什么是阿里云负载均衡SLB?

目录 硬件或软件负载均衡的区别是什么&#xff1f; 什么是阿里云负载均衡SLB&#xff1f; 阿里云传统型负载均衡CLB 硬件或软件负载均衡的区别是什么&#xff1f; 通过专用硬件实现负载均衡&#xff0c;那么整体成本会较高&#xff0c;而且设备容易出现单点故障&#xff0c;…