admin 管理员组文章数量: 887021
软件
软件
1.软件的三要素
程序(实行特定功能的代码) 文档(支持代码运行) 数据(支持程序运行一切有关)
2.软件的产品质量
我以为是功能性 性能 安全性 可维护性 兼容性
但是链接里的回答是,质量是指实体特性的综合,表示实体满足 明确的 或 隐含要求的能力。
测试
产品设计-》开发编码-》软件测试
1.软件测试目的
软件测试是在一个可控的环境中分析或执行程序(或系统)的过程。 其根本目的是以尽可能少的时间和人力发现并改正软件中潜在的各种缺陷,最终提高软件的质量。
2.软件测试原则
1. 可追溯性
2. 应尽早地不断地进行测试
3. 不可能完全测试
4. 投入/产出原则
5. 充分关注测试中的集群现象/“二八”定理
6. 避免测试自己的程序
7. 尽量避免测试的随意性
8. 回归测试
9. 重视文档,妥善保管一切测试过程文档。
3.软件测试的标准4个过程,以及对应的解释
1)测试策划:主要是进行测试的需求分析 和 测试计划的编写
2)测试设计:依据测试需求,分析并选用,已有的测试用例或者设计新的测试用例,在进入下一个阶段工作之前,应该通过测试就绪评审
3)测试执行:执行测试用例,获取测试结果,分析并判定设计结果
4)测试总结:整理和分析测试数据 ,评价测试效果和被测软件项,描述 测试状态 最后完成软件测试报告并通过测试评审
4.软件测试过程模型对比
嘛,记忆方法V模型一个人 一个级别对一个开发
w模型 两个V 测试开发同步进行 串行不迭代
探索性测试
测试活动完全独立啦
5.测试用例设计的基本原则
1)基于测试需求的原则
2)基于测试方法的原则
3)兼顾 测试充分性 和 效率的原则
4)执行用例的可再现性原则
6.测试用例实战
如何设计一个测试用例
测试用例(Test Case)是为了实施测试而向被测试的系统提供的一组集合,这组集合包含:测试环境、操作步骤、测试数据、预期结果等要素。
好的测试用例是一个不熟悉业务的人也能依据用例来很快的进行测试
评价测试用例的标准:对比好坏用例的评价标准
- 用例表达清楚,无二义性。。
- 用例可操作性强。
- 用例的输入与输出明确。一条用例只有一个预期结果。
- 用例的可维护性好。
- 用例对需求的覆盖率高
测试用例的给我们带来的好处
- 测试执行者的依据
- 使得工作可重复,自动化测试的基础
- 评估需求覆盖率
- 用例的复用
- 积累测试的方法思路以供后续借鉴
测试用例的设计是费时费力的工作,往往设计测试用例所花费的时间比执行所花费的时间还多
测试用例的设计解决如下问题:
- 不知道是否较全面的测试了所有功能
- 测试的覆盖率无法衡量
- 对新版本的重复测试很难实施
- 存在大量冗余测试影响测试效率
二、设计测试用例的万能公式 (在没有需求文档的情况下)
功能测试:产品是否实现了预期的功能
性能测试:功能测试没有问题,不代表性能好(网站速度、流畅的)
界面测试:布局、每个元素的大小、颜色、材质
兼容性测试:软件的不同版本、打开网站所用的不同浏览器
不同的系统版本、数据兼容性(不同版本数据是否展示正确且相同)
易用性测试:产品是否容易上手、提升文字(登陆时)、打开软件的操作步骤提示
安全测试:产品网站系统,用户信息,页面数据展示的是是否恰当和合适
(用户的隐式数据)
登录时候是否加密
接口返回值—SQL注入
越权问题(垂直越权和水平越权):权限、管理员、普通用户
不同的角色对应不同的功能
1)水杯的测试用例
2.1)一个网站的登录测试用例
分析:
1.功能测试
正常的登录功能:输入正确的账号密码,结果登录成功
异常登录功能》账号错误 密码正确》用户名为空
异常登录功能》账号错误 密码正确》用户包含特殊字符(防止sql注入)
异常登录功能》账号错误 密码正确》用户名不存在
异常登录功能》账号错误 密码正确》用户名太长或者太短
异常登录功能》账号正确 密码错误》密码为空
异常登录功能》账号正确 密码错误》密码太长或者太短
异常登录功能》账号正确 密码错误》密码错误
异常登录功能》不输入账号密码
登录成功后能否正确跳转到主页
输入账号密码能否提交
登录请求次数限制》同一个账号每天限制多少次
登录请求次数限制》同一台机器每天限制多少次
记住用户和密码
。。。
2.性能测试
打开页面需要多久
登录成功跳转需要多久
1000万人同时打开登录页面,页面响应时间需要多久
1000万人同时登录,页面响应时间需要多久
。。。
3.界面测试 (美观 习惯 需求 遮挡 交互啥的
登录界面是否美观
文字是否存在错别字、折行、重叠等
输入框的大小是否符合需求
文字能不能支持语言转换
密码隐藏展示效果是否符合要求
错误提示功能的展示是否符合要求
是否存在环境模式功能
登录按钮位置是否符合要求
登录框会不会挡住背景图片中的重要信息
4.安全测试
是否存在SQL注入 详细sql注入讲解(尚未看)
登录接口是否要对用户密码加密
界面是否对密码输入加密
密码输入框是否不支持复制黏贴
。。。
5.易用性测试(其实吧,就是输入提示 错误提示 更方便的跳转 清空和记忆
密码和账号存在输入规则的提示
使用enter键能否跳转到下一个输入框
使用enter键可以直接登录
输入错误时有正确的提示
信息填写错误后输入框可以自动清空
是否有大小写转换提示
能不能支持一键清除账号密码
修改账号会不会密码自动清除
记住账号功能
。。。
6.兼容性测试
不同的浏览器打开显示是否正常
不同的浏览器版本打开是否正常
不同的系统打开
测试点设计
2.2)QQ的登录测试用例 app
3)基于需求进行测试用例的设计
1、功能需求测试分析
2、非功能需求测试分析
基于需求进行用例的设计(已看完)(对理解方面有所帮助)
3.如何描述一个bug?
测试的版本号
测试环境
测试数据
测试步骤
测试的实际结果
附件(错误日志或截图)
其他
详细描述的原因是为了让开发人员更好 的复现bug,从而根据bug的现象,分析是哪段代码出现问题,并且处理它。
4.测试用例可以衡量需求的覆盖率
首先,我们的测试用例是根据需求来写的,有了测试用例之后,你对照着需求,就可以进行查漏补缺。
简单来说:就是查看 需要测试的需求,是否都被被测试了。
如果你不写测试用例,东一测,西一测,你很容就把自己给测昏了。
有了测试用例,你测完一项,就标记一项,这样你侧漏的概率非常低。
检查起来,也很快!直接看测试项后面有没有已测试的标记就可以了
5.测试用例的设计方法
黑白灰 其中等价类划分 边界值 因果图 基于需求的设计方法比较重要
6.评价测试用例的标准:对比好坏用例的评价标准
用例表达清楚,无二义性。。
用例可操作性强。
用例的输入与输出明确。一条用例只有一个预期结果。
用例的可维护性好。
用例对需求的覆盖率高。
4)软件测试基本流程
1.如何测试 (单功能)
1.分析需求
2.设计测试点 覆盖需求(维度参考质量模型)
3.将测试点转为可执行用例文档
4.执行测试
5.缺陷管理(提交 验证 关闭)
2.分析需求(AI赋能软测)
作用:速效 缺陷分析预测
AI互动指令格式 角色 指令 上下文(例子,输入,输出)
学习网站链接
角色:你是一名测试工程师
指示:需要针对以下需求,设计测试用例需求:
1、账号密码登录
系统验证账号和密码的正确性。
验证通过,用户录成功,进入个人中心﹔验证失败,提示错误信息并允许用户重新输入。2、短信验证码登录
用户输入手机号,点击获取验证码,系统向用户手机发送验证码。用户输入验证码,点击量录,系统验证验证码的正确性。
验证通过,用户登录成功,进入个人中心;验证失败,提示错误信息并允许用户重新输入。3、第三方授权叠录
用户点击第三方登录按钮(如微信、QQ、支付宝),系统跳转至第三方授权页面,用户进行授权操作。第三方返回授权信息至系统,系统验证授权信息的有效性,创建或梆定用户账号。
验证通过,用户登录成功,进入个人中心。
输入:功能测试、兼容性测试、SQL注入
输出:使用EXCEL表格形式输出,并且格式参考用例设计八大要素
3.质量模型
衡量一个软件质量的维度(目的)
功能性(单用户)——》
性能(多用户 时间、资源、并发、速度...功能程度)——》
兼容(异地 不同设备/平台)(浏览器 分辨率 操作系统 网络 品牌 其他软件冲突)——》
易用性(易学 易用 用户粘性好) (用户角度)(明确需求 ——》验证 )
可靠性(长时间运行稳定,不出现异常) (无响应,死机,卡顿)
可移植性(应用系统升级/数据迁移方便)
可维护性(运行过程中出现问题维护操作是否方便)
如何验证某系统质量?以微信为例
(功性兼用安靠移)
功能性:与需求数量一致,功能正确
性能:响应快,占用资源少
兼容性:不同设备平台正常使用
易用性:用户体验好
安全性:敏感信息无泄密,存储有保障
可靠性:持久无异常
可移植性:升级迁移数据不丢失
可维护性:出现异常恢复简单,可扩展功能,升级更便捷
4.软件测试分类
生产阶段:
1.单(源码)
2.集(模块与模块)
3.统(将已经集成好的软件系统与计算机硬件、外设、网络、数据等其他元素结合在一起,一般使用黑盒测试技术,独立的测试人员)
(系统测试的内容:功能性测试+非功能性测试)
功能性
功能测试、用户界面的测试、安装/卸载测试、可使用性测试;
非功能性
性能测试(目的是验证能够达到用户提出的性能指标,发现性能瓶颈,优化软件,最终起到优化系统的目的。并发数、响应时间、吞吐量、TPS、点击率、资源利用率。客户感受到的响应时间其实是等于客户端响应时间+服务器端响应时间+网络响应时间)
负载测试
其中,负载测试是指在一定的软、硬件及网络环境下,模拟大量的用户运行一种或多种业务,测试服务器的性能指标是否在用户可接受的范围内,以此来确定系统所承受的最大负载数和不同用户数下系统的性能指标以及服务器的资源利用率。 通常在编码全部完成后进行。(也就是限制条件下模拟大量用户运行,来测试性能指标是否在用户可接受范围内 体验)
压力测试
压力测试,也成为强度测试。 是指在一定软、硬件及网络环境下,模拟大量的虚拟用户向服务器产生负载,使得服务器的资源处在极限状态下并长时间连续运行,以此测试系统所承受的最大负载数和不同用户数下系统的性能指标。 压力测试强调的是在高负载情况下是否能稳定工作,此时处理能力以及不重要了。 (服务器极限 稳定性)
并发测试
并发测试,是指通过模拟多用户并发访问同一个应用、模块、数据以及其他并发操作,来测试是否存在内存泄露、线程锁、数据库死锁、数据错误以及资源争用等问题。 并发测试介入时间较早,在基本功能实现之后就可以针对每个模块进行并发测试。其目的是可以提前发现数据库或函数在并发下的一些错误。
基准测试(Benchmark Testing)
是指在一定的软、硬件环境下,模拟一定数量的用户(也可是单用户)运行一种或多种业务,获取系统的关键指标,并把它作为基准,供其他版本做对比或者参考,有时也可以将类似的产品的性能指标做参考。 可测量、可重复、可对比是基准测试的三大原则。
稳定性测试
这里指的是和性能测试有关的稳定性测试,即测试系统在一定负载下长时间运行是否会发生问题。 软件系统的有些问题不能一下子就暴露出来,或者说是需要时间积累才能达到能够度量的程度。例如内存泄漏就是经过一段时间积累才会慢慢变得显著
安全测试
安全测试是在IT软件产品的生命周期中,特别是产品开发基本完成到发布阶段,对产品进行检验以验证产品符合安全定义和产品质量标准的过程。
疲劳测试
恢复测试
兼容性测试
可靠性测试
强度测试
容量测试
配置测试等。
4.验(交付测试,用户,系统测试之后,产品发布之前,一般根据产品规格说明书严格检查产品)
测试方法:黑白灰
是否执行程序:静态 动态
静态:不运行被测程序,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性
动态:通过运行被测程序,检查运行结果与预期结果的差异,并分析运行效率、正确性和健壮性等性能指标
其他:
冒烟测试(快速验证功能)
回归测试:对已修复bug\更新后对已测内容再次测试
作用:保证bug修复、确保新功能对旧功能没有影响
5.黑盒测试
黑盒测试
1)等价类划分法
定义:
等价类划分 是在 分析 需求规格说明 基础上,把程序的输入域 划分成 若干个部分,然后再每部分中选取 代表性数据 形成测试用例
步骤:
a) 划分有效等价类,对规格说明 是 有意义 合理的 输入数据 所构成的集合
b) 划分无效等价类,对 规格说明 是 无意义 不合理的 输入数据 所构成的集合
c) 为每一个等价类 定义一个唯一的编号
d) 为每一个等价类 设计一组测试用例 确保 覆盖相应的等价类
测试原则
2)边界值分析法
定义:边界值分析方法就是对输入或输出的边界值进行测试的一种黑盒测试方法。
步骤:
a) 通过分析 规格说明 找出 所有 可能的 边界条件
b) 对每一个边界条件 给出 满足 和 不满足的输入数据
c) 设计相应的 测试用例
对于满足边界值的 输入 可以发现 计算差错,对不满足的输入 可以发现 域差错
边界值分析法需要考虑3个点的选择:
上点。就是边界上的点,它不区分开区间还是闭区间。 离点。离点是离上点最近的点。如果输入域是封闭的,则离点在域的范围外;如果输入域是开区间,则离点在域的范围内。 内点。顾名思义就是输入域内任意一点。
3)决策表
4)场景法
软件系统中流程的控制由事件触发决定, 事件不同的触发顺序和处理结果形成事件流, 每个事件流触发的情景便形成了场景。
基本流:是指程序的主流程 是实现业务流程最简单的路径
备选流:是指在实现业务流程时,因错误操作或异常操作导致最终未达到预期流程的结果
6.白盒测试
1)代码审查/走查
2)逻辑覆盖测试法
3)基本路径测试法
基本路径测试法是在程序控制流图的基础上,通过分析构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法。
网络
重点:TCP/IP cookie、session
# 网站的基本概念
互联网上,根据一定的规则,使用HTML、PHP等代码语言制作的用于展示特定内容的相关
网页的集合,有可供管理人员操作的后台及用户使用的前台。
# 静态网站特点
1.静态网页是真实保存在服务器上的文件,每个网页都是一个独立的文件;
2.内容相对稳定,因此容易被搜索引擎检索;
3.没有数据库的支持,在网站制作和维护方面工作量较大,因此当网站信息量很大时完全依靠静态网页制作方式比较困难;
4.交互性较差,在功能方面有较大的限制。
## 动态网站特点
1.交互性:**网页会根据用户的要求和选择**而**动态地改变和响应**,**浏览器作为客户端**,成为一个动态交流的桥梁,动态网页的交互性也是今后Web 发展的潮流。
⒉.**自动更新**:即无须手动更新HTM文档,便会自动生成新页面,可以大大节省工作量o3.因3.时因人而变:即当不同时间、不同用户访问同一网址时会出现不同页面。
3.此外动态网页是与静态网页相对应的,也就是说,网页URL的后缀不是. htm、.html、. shtml、.xml等静态网页的常见形式,而是**以.asp、jsp、.php、.perl.、.cgi等形式为后缀**。在动态网页网址中有一个标志性的符号——“?”
## 服务器概念
用来提供服务的设备。根据服务不同分为文件服务器,数据库服务器,用程序服务器,WEB服务器等。
由处理器、硬盘、内存、系统总线等构成。
由于需要提供高可靠的服务,因此在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面要求较高。
**服务器**:能够提供服务的机器,取决于机器上所安装的软件(服务软件)
Web服务器:提供 web服务(网站访问),就需要安装web服务软件,Apache,tomcat,iis.等
Web服务器专门处理HTTP请求、解析HTTP协议。
接收到HTTP请求后 返回HTTP响应,为了处理一个请求。
Web服务器可以响应一个静态页面、图片或者进行页面跳转,或者把动态响应的产生委托给一些其他的应用程序,例如**PHP脚本**、CGI、JSP脚本、Servlet、ASP脚本,或者一些其他的服务器端技术。
# IP概念
计算机网络相互连接进行通信而设计的协议
# 域名
域名(Domain Name),是类似www.itcast的 Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位。
# DNS
Domain Name System域名系统
因特网上作为域名和IP地址相互映射的一个**分布式数据库**,能够使用户更方便的访问互联网,而**不用去记住**能够被机器直接读取的**IP数串**。通过主机名,最终得到该主机名对应的ip地址的过程叫做域名解析(或者主机名解析)
用户输入域名localhost——>DNS(localhost 127.0.0。1)——>服务器**电脑**
# 端口
(找软件)
设备与外界通讯交流的出口
**虚拟端口**:计算机内部或交换机路由器内的端口,不可见。
**物理端口**:又称为接口,是可见端口,计算机背板的RJ45网口,交换机路由器集线器等RJ45端口。
用户输入域名localhost——>DNS(localhost 127.0.0。1)——>服务器电脑——>软件(服务)
# web程序访问流程
web:
静态网站
动态网站
浏览器发起访问——》DNS域名解析——》服务器电脑—端口—》服务软件
# 静态网站的访问
1)动态网站的访问
动态网站访问流程与静态差不多,但是会多出几个内容:服务器端解析、数据库
2)TCP/IP协议
TCP/IP
3)Cookie和Session
# cookie
Cookie:
将网站的资料记录在客户端的技术,这种技术让Web服务器能将一些资料,存放于客户端(用户的电脑)之中。
比如:
当通过验证,成功登录网站后,在”网页1“的PHP脚本中,会把这个用户有关的信息,设置到客户端电脑的Cookie中,当再次访问同一个网站中的其他脚本时,就会自动携带Cookie中的数据一起访问,在服务器中的每个脚本中都可以接受Cookie中的数据,不需要每访问一个页面就重新输入一次登录者的信息。
自动化测试
框架
测试用例层
页面模型层(提高可维护性)
数据驱动层(测试的业务 元素的定位元素的操作 这些分开 以数据来驱动整个测试用例的执行)
(它允许测试人员通过外部数据源(如CSV文件、数据库等)来定义测试用例的输入和预期结果,从而提高测试的可维护性和可扩展性。)
数据持久层(数据持久层通常包含与数据库交互的组件,如数据访问对象(DAO)和数据库连接池等,它们负责将业务逻辑层的数据存储到数据库中,并在需要时从数据库中检索数据。)
持续集成(通过频繁地将代码集成到共享代码仓库,并自动构建、测试和发布软件,从而提高开发团队的协作效率和软件质量。)
金字塔概念
根据自动化测试的金字塔概念,自动化测试分为三层:
单元测试
接口测试
UI测试
如何进行自动化脚本的研发工作
1.明确脚本的研发需求
2.对需求进行拆分和细化
3.进行相关的技术试验
4.完成脚本的研发
电商项目实战(冒烟
一、本次工作任务
后台商品管理自动化测试
二、任务分解
1.后台登录
1.1打开后台登录页面
http://127.0.0.1:99/admin.php
1.2输入用户名,密码,验证码
admin
123456
万能验证码
1.3点击登录按钮
⒉.添加商品
2.1在后台管理中心,点击商品管理
2.2点击“添加商品”
2.3输入商品名称
2.4.选择商品分类
2.5.选择商品品牌
2.6.点击提交按钮
三、技术方面
处理验证码的方式
1.通过第三方图片识别文字的工具 准确率比较低
2.通过第三方网站识别验证码 准确率很高,几乎100% 收费
3.设置万能验证码
4.在测试环境中屏蔽掉验证码
5.绑定ip地址
6.读取cookie和缓存
7.在输入验证码前,加一个固定时间等待,手动输入验证码
四、编写代码
学生宿舍管理系统自动化测试
文档写问题,误入的小伙伴不要看,不是完全标准的文档,主要是为了给我的看我做过了这个项目。
测试需求说明书
一、概述
1、编写目的
本文档是根据“宿舍管理系统”需求分析说明书编写的测试需求说明书,其目的有以下三点。● 供测试人员使用,作为测试的依据。
● 作为项目验收标准之一。
● 作为软件维护的参考资料。
2、适用范围
本文档为内部资料,读者范围为小组内部测试人员、研发人员和相关负责人。
二、系统说明
1、系统背景
在Java企业级的教学过程中,为了让学生巩固所学的Java知识,掌握Web网站的搭建过程,开发人员结合当前教学趋势开发了用于模拟高校宿舍管理的在线系统,该系统仅用于内部教学使用。本文档主要用于定义“宿舍管理系统”系统测试的测试需求。
2、系统功能
用户(系统管理员/宿舍管理员)登录注销宿舍管理员>记录学生缺寝情况
系统管理员>管理宿管
系统管理员>管理学生
系统管理员>管理楼宇
系统管理员>管理宿舍
3、系统设计和实现要点
(1)宿舍管理系统为Web应用程序,选择B/S系统架构。
(2)开发平台为Windows。
(3)浏览器使用Chrome,因为Chrome浏览器支持VUE和新特性,且提供了很多实用的开发工具,可以方便的对网页进行调试。
(4)Web服务器有很多种,其中Apache具有开源、跨平台、速度快且安全性高的特点,最重要的是它对动态网页非常友好,因此选择Apache作为本项目的Web服务器。
三、系统功能性需求
功能 | 子功能 |
登录 | 登陆注销 |
宿舍管理员>记录学生缺寝情况 | 学生缺寝登记 |
查看学生缺勤记录 | |
系统管理员>管理宿管 | 添加宿管 |
宿管管理 | |
系统管理员>管理学生 | 添加学生 |
学生管理 | |
学生迁出登记 | |
学生迁出记录 | |
|
四、系统非功能性需求
无。
五、环境需求
硬件设备 | 处理器型号 | 内存 | |
计算机 | Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz 2.11 GHz | 8.0GB | |
服务器 | Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz 2.11 GHz | 8.0GB | |
软件名称/类型 | 版本 | ||
windows | Windows 10 家庭中文版 | ||
Google浏览器 | 126.0.6478.127(正式版本) (64 位) | ||
测试工具 | Selenium+Python自动化测试 |
六、测试人员要求与职责本次测试要求测试人员具备以下能力。
● 了解宿舍管理系统的设计架构。
● 熟悉宿舍管理系统的操作过程。
● 掌握Python编程语言基础知识。
● 了解VUE3基础知识。
● 了解java编程语言基础知识。
七、测试完成标准
● 系统实现需求分析中的所有功能。
● 所有测试用例都已经执行。
● 所有重要Bug均已修复并通过回归测试。
● 计算机端测试无误,用户(系统管理员/宿舍管理员)可正常登录注销,宿舍管理员可正常记录学生缺寝情况,系统管理员可正常管理宿管,系统管理员可正常管理学生,系统管理员可正常管理楼宇,
系统管理员可正常管理宿舍。
八、测试提交文档
文档名称 | 主要内容 | 面向对象 | 备注 |
测试需求分析 | 测试要完成的任务及任务分工。 | 小组内部 |
|
测试计划 | 规定测试执行过程,包括环境搭建、人员分配、测试组织和进度要求等。 | 小组内部 |
|
测试用例 | 量化测试输入、执行条件和预期结果,指导测试执行。 | 小组内部 |
|
测试报告 | 说明阶段和总体测试结果,分析结果带来的影响,为产品下一步实施提供依据。 | 小组内部 |
|
测试计划表 | |||
测试活动 | 主要内容 | 周期 | 预期时间 |
编写测试需求 | 明确本次测试的任务。 | 2个工作日 | 2024.06.13-2024.06.14 |
测试需求评审 | 测试负责人组织项目组相关人员评审测试需求是否合理、是否有误。 | 2个工作日 | 2024.06.14-2024.06.15 |
编写测试计划 | 制定整个测试项目的执行计划,包括测试内容、人员分配、环境搭建等。 | 3个工作日 | 2024.06.16-2024.06.18 |
测试计划评审 | 测试负责人组织项目组相关人员评审测试计划是否合理、是否有纰漏。 | 3个工作日 | 2024.06.19-2024.06.2 |
编写测试方案 | 说明本次测试使用的方法和技巧。 | 2个工作日 | 2024.06.22-2024.06.23 |
测试方案评审 | 测试负责人组织项目组相关人员评审测试方案是否合理。 | 2个工作日 | 2024.06.24-2024.06.25 |
编写测试用例 | 编写测试执行的具体内容。 | 自主完成下面进度计划填写 | |
测试用例评审 | 测试负责人组织项目组相关人员评审测试用例的可行性。 |
|
|
编写测试脚本 | 使用指定编程语言编写脚本,用于执行测试用例。 |
|
|
测试执行 | 搭建测试环境,运行测试用例/脚本执行具体的测试工作。 |
|
|
整理缺陷报告 | 整理测试过程中遇到的问题、缺陷。 |
|
|
编写测试报告 | 收集整理测试信息,对本次测试进行汇总并进行评价。 |
|
|
测试项说明+测试策略+测试用例
测试项说明 | |||
序号 | 产品描述 | 测试要点 | 备注 |
1 | 用户登录注销功能 | 系统管理员登录测试 |
|
系统管理员注销测试 |
| ||
宿舍管理员登录测试 |
| ||
宿舍管理员注销测试 |
| ||
2 | 宿舍管理员>记录学生缺寝情况功能 | 学生缺寝登记测试 |
|
查看学生缺勤记录测试 |
| ||
3 | 系统管理员>管理学生功能 | 添加学生测试 |
|
学生管理测试 |
| ||
学生迁出登记测试 |
| ||
学生迁出记录测试 |
| ||
|
| ||
4 | 系统管理员>管理宿管功能 | 添加宿管测试 (非空) |
|
宿管管理测试 搜索功能测试 |
| ||
5
| 兼容性测试(浏览器) | Google浏览器 |
|
Firefox浏览器 |
| ||
IE浏览器 |
| ||
Opera浏览器 |
| ||
Safari浏览器 |
|
测试策略 | |
测试事项 | 内容 |
测试范围 | 用户登录注销功能,宿舍管理员>记录学生缺寝情况功能,系统管理员>管理宿管功能,系统管理员>管理学生功能,系统管理员>管理楼宇功,系统管理员>管理宿舍功能
|
测试目标 | 核实所有功能都已正常实现,即与软件需求一致 |
测试技术 | 采用黑盒测试、等价类划分等方法 |
测试工具 | Selenium、Pycharm等 |
测试方法 | 自动化测试,使用Python脚本语言完成测试脚本 |
完成标准 | 所有测试用例执行完毕,且严重缺陷全部解决并通过回归测试 |
其他事项 | 无 |
测试用例 | |||||
测试功能 | 用例编号 | 执行步骤 | 预期结果 | 实际结果 | 备注 |
用户登录注销功能 |
| 1.以系统管理员(admin1/123123)身份登录系统 2.点击退出登录 3.以宿舍管理员(ll/123123)身份进行登录 4.点击退出登录 | 两次登录退出均成功 | 两次登录退出均成功 |
|
|
| 两次登陆失败,提示用户不存在 | 两次登陆失败,提示用户不存在 |
| |
|
| 两次登陆失败,提示“请确定输入非空” | 两次登陆失败,提示“请确定输入非空” |
| |
|
| 两次登陆失败,提示“请确定输入非空” | 两次登陆失败,提示“请确定输入非空” |
| |
宿舍管理员>记录学生缺寝情况功能 |
|
| 登录成功, 缺寝记录提交成功, (步骤4、5)搜索后成功显示相关数据 (步骤6)提示请选择字段 (步骤7)无提示,显示的数据也不发生改变 | 登录成功, 缺寝记录提交成功, (步骤4、5)搜索后成功显示相关数据 (步骤6)提示请选择字段 (步骤7)无提示,显示的数据也不发生改变 |
|
系统管理员>管理宿管功能 |
|
| 步骤2提示输入项应该非空 步骤3提示添加成功 | 步骤2提示输入项非空 步骤3提示添加成功 | 测试添加宿管子功能 |
|
| 步骤2表单中显示对应数据 步骤3提示请选择字段 步骤4无提示显示的数据也不发生改变, | 步骤2表单中显示对应数据 步骤3提示请选择字段 步骤4无提示显示的数据也不发生改变, | 测试宿管管理的搜索功能 | |
|
| 步骤2提示已取消删除 步骤3提示XX已删除 | 步骤2提示已取消删除 步骤3提示X已删除 | 测试宿舍管理删除,取消,确定功能 | |
系统管理员>管理学生功能
|
|
| 步骤2提示输入项应该非空 步骤3 提示创建成功 | 步骤2提示输入项应该非空 步骤3 提示创建成功 | 添加学生测试 |
| 1.以系统管理员(admin/123123)身份登录系统 2.点击学生管理,字段分别选择(学号、姓名),值对应填入(001,李力),点击(搜索) 3.直接点击搜索 4.选择(学号),直接点击搜索
| 步骤2表单中显示对应数据 步骤3提示请选择字段 步骤4无提示显示的数据也不发生改变, | 步骤2表单中显示对应数据 步骤3提示请选择字段 步骤4无提示显示的数据也不发生改变, | 测试学生管理 | |
| 1.以系统管理员(admin/123123)身份登录系统 2.点击学生迁出登记,字段分别选择(学号、姓名),值对应填入(001,李力),点击(搜索) 3.直接点击搜索 4.选择(学号账号),直接点击搜索 5.选中一个人,点击迁出,输入迁出原因(毕业)点击取消 6.再次选中,点击迁出不输入迁出原因,点击确定 7.再次选中,点击迁出输入迁出原因(毕业),点击确定,点击确定,点击确定 | 步骤2表单中显示对应数据 步骤3提示请选择字段 步骤4无提示显示的数据也不发生改变 步骤5显示已取消迁出 步骤6提示迁出原因不能为空 步骤7提示XX已迁出 | 步骤2表单中显示对应数据 步骤3提示请选择字段 步骤4无提示显示的数据也不发生改变 步骤5显示已取消迁出 步骤6提示迁出原因不能为空 步骤7提示XX已迁出 | 迁出登记测试 | |
| 1.以系统管理员(admin/123123)身份登录系统 2.点击学生迁出记录,字段分别选择(学号、宿舍),值对应填入(小明,322),点击(搜索) 3.直接点击搜索 4.选择(学号),直接点击搜索
| 步骤2表单中显示对应数据 步骤3提示请选择字段 步骤4无提示显示的数据也不发生改变, | 步骤2表单中显示对应数据 步骤3提示请选择字段 步骤4无提示显示的数据也不发生改变, | 测试学生迁出记录 | |
| 编制:XXX 日期:2024.06.25-2024.06.27 |
项目说明报告
项目报告说明书
目录
项目报告说明书
一、 前言
1、 声明
2、 背景说明
3、 目的
4、 适用范围
5、 参考资料
二、 测试环境
1、 测试资源
2、 测试环境拓扑
三、 测试范围说明
四、 测试结果分析
2、兼容性测试
五、 测试过程分析
1、 测试覆盖率分析
2、 缺陷分析
六、 测试汇总
1、 测试问题汇总
2、 差异分析
七、 测试总结和评价
八、 建议
- 前言
- 声明
本方案是针对“宿舍管理系统”编写的系统测试方案,当产品出现更新版本时,更新版本中出现的任何新功能模块都需要进行重新测试,本测试文档不再适用,更不能把本文档中的内容适用于其他版本的同类软件。
- 背景说明
本文档主要用于定义“宿舍管理系统”的测试方法、测试技巧、测试重点、测试过程使用资源和测试用例设计方法等。本次测试主要测试项目的功能完整性、准确性,以及对智能终端和浏览器的兼容性。
- 目的
1、验证软件质量:
确保软件按照需求规格说明书进行开发,满足预定的功能和性能要求。
验证软件在各种条件下的稳定性和可靠性,确保软件在各种环境下都能正常运行。
发现和修复软件中的缺陷和错误,提高软件的质量。
2、提供信息以评估软件的可靠性:
通过测试提供关于软件质量、性能和可靠性的具体数据和信息。
评估软件是否满足用户的期望和需求,以及是否可以在实际环境中使用。
为决策者提供关于软件是否可以发布或交付给用户的依据。
3、预防未来的缺陷:
通过测试,可以发现软件设计、编码和文档中的潜在问题,从而预防未来的缺陷。
- 适用范围
本测试报告适用于宿舍管理系统的开发团队、测试团队、项目管理部门以 及最终用户等相关人员。
- 参考资料
• 需求规格说明书;
• 系统设计文档;
• 测试计划;
• 测试用例;
• 相关标准和规范。
- 测试环境
- 测试资源
- 硬件资源
硬件设备 | 处理器型号 | 内存 |
计算机 | Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz 2.11 GHz | 8.0GB |
服务器 | Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz 2.11 GHz | 8.0GB |
- 软件资源
软件名称/类型 | 版本 |
windows | Windows 10 家庭中文版 |
Google浏览器 | 126.0.6478.127(正式版本) (64 位) |
测试工具 | Selenium+Python自动化测试 |
- 测试环境拓扑
Win10 家庭中文版, Python3.12 Pycharm 2024.1.1 Chrome 126.0.6478.127
- 测试范围说明
- 测试结果分析
1、功能测试
测试功能 | 用例编号 | 执行步骤 | 预期结果 | 实际结果 | 是否通过 |
用户登录注销功能 | 001 | 1.以系统管理员(admin1/123123)身份登录系统 2.点击退出登录 3.以宿舍管理员(ll/123123)身份进行登录 4.点击退出登录 | 两次登录退出均成功 | 两次登录退出均成功 |
T |
002 |
| 两次登陆失败,提示用户不存在 | 两次登陆失败,提示用户不存在 | T | |
003 |
| 两次登陆失败,提示“请确定输入非空” | 两次登陆失败,提示“请确定输入非空” | T | |
004 |
| 两次登陆失败,提示“请确定输入非空” | 两次登陆失败,提示“请确定输入非空” | T | |
宿舍管理员>记录学生缺寝情况功能 | 005 |
| 登录成功, 缺寝记录提交成功, (步骤4、5)搜索后成功显示相关数据 (步骤6)提示请选择字段 (步骤7)无提示,显示的数据也不发生改变 | 登录成功, 缺寝记录提交成功, (步骤4、5)搜索后成功显示相关数据 (步骤6)提示请选择字段 (步骤7)无提示,显示的数据也不发生改变 | T |
系统管理员>管理宿管功能 | 006 |
| 步骤2提示输入项应该非空 步骤3提示添加成功 | 步骤2提示输入项非空 步骤3提示添加成功 | T |
007 |
| 步骤2表单中显示对应数据 步骤3提示请选择字段 步骤4无提示显示的数据也不发生改变, | 步骤2表单中显示对应数据 步骤3提示请选择字段 步骤4无提示显示的数据也不发生改变, | T | |
008 |
| 步骤2提示已取消删除 步骤3提示XX已删除 | 步骤2提示已取消删除 步骤3提示X已删除 | T | |
系统管理员>管理学生功能
| 009 |
| 步骤2提示输入项应该非空 步骤3 提示创建成功 | 步骤2提示输入项应该非空 步骤3 提示创建成功 | T |
010 | 1.以系统管理员(admin/123123)身份登录系统 2.点击学生管理,字段分别选择(学号、姓名),值对应填入(001,李力),点击(搜索) 3.直接点击搜索 4.选择(学号),直接点击搜索
| 步骤2表单中显示对应数据 步骤3提示请选择字段 步骤4无提示显示的数据也不发生改变, | 步骤2表单中显示对应数据 步骤3提示请选择字段 步骤4无提示显示的数据也不发生改变, | T | |
011 | 1.以系统管理员(admin/123123)身份登录系统 2.点击学生迁出登记,字段分别选择(学号、姓名),值对应填入(001,李力),点击(搜索) 3.直接点击搜索 4.选择(学号账号),直接点击搜索 5.选中一个人,点击迁出,输入迁出原因(毕业)点击取消 6.再次选中,点击迁出不输入迁出原因,点击确定 7.再次选中,点击迁出输入迁出原因(毕业),点击确定,点击确定,点击确定 | 步骤2表单中显示对应数据 步骤3提示请选择字段 步骤4无提示显示的数据也不发生改变 步骤5显示已取消迁出 步骤6提示迁出原因不能为空 步骤7提示XX已迁出 | 步骤2表单中显示对应数据 步骤3提示请选择字段 步骤4无提示显示的数据也不发生改变 步骤5显示已取消迁出 步骤6提示迁出原因不能为空 步骤7提示XX已迁出 | T | |
012 | 1.以系统管理员(admin/123123)身份登录系统 2.点击学生迁出记录,字段分别选择(学号、宿舍),值对应填入(小明,322),点击(搜索) 3.直接点击搜索 4.选择(学号),直接点击搜索
| 步骤2表单中显示对应数据 步骤3提示请选择字段 步骤4无提示显示的数据也不发生改变, | 步骤2表单中显示对应数据 步骤3提示请选择字段 步骤4无提示显示的数据也不发生改变, | T |
2、兼容性测试
测试用例 | 浏览器 | 是否兼容 | 备注 |
001 | Google浏览器 | 是 |
|
002 | Firefox浏览器 | 是 |
|
003 | IE浏览器 | 是 |
|
004 | Opera浏览器 | 是 |
|
- 测试过程分析
- 测试覆盖率分析
功能模块 | 测试 轮数 | 开始时间 | 结束时间 | 执行用例数 | 用例通过数 | 用例未通过数 | 用例通过率 | 备注 |
登录 | 20 | 2024.6.13
| 2024.6.14
| 30 | 29 | 1 | 97% | 时间太快 |
学生缺寝登记 | 5 | 2024.6.15 | 2024.6.16 | 20 | 20 | 0 | 100% | 通过 |
查看学生缺勤记录 | 10 | 2024.6.17 | 2024.6.18 | 50 | 50 | 0 | 100% | 通过 |
添加学生 | 30 | 2024.6.19 | 2024.6.20 | 40 | 40 | 0 | 100% | 通过 |
学生管理 | 10 | 2024.6.21 | 2024.6.21 | 20 | 19 | 1 | 95% | 时间太快 |
学生迁出登记 | 40 | 2024.6.21 | 2024.6.22 | 40 | 40 | 0 | 100% | 通过 |
查看学生迁出记录 | 40 | 2024.6.22 | 2024.6.22 | 50 | 50 | 0 | 100% | 通过 |
查看学生缺寝记录 | 10 | 2024.6.23 | 2024.6.23 | 20 | 20 | 0 | 100% | 通过 |
添加宿管 | 10 | 2024.6.24 | 2024.6.24 | 30 | 30 | 0 | 100% | 通过 |
宿管管理 | 10 | 2024.6.25 | 2024.6.25 | 40 | 40 | 0 | 100% | 通过 |
- 缺陷分析
- 缺陷类型汇总
- 缺陷按功能分布
- bug001的缺陷报告
缺陷ID | Bug_001 |
测试软件名称 | 宿舍管理系统 |
测试软件版本 | 1.0 |
缺陷发现日期 | 2024.6.17 |
测试人员 | xxx |
缺陷描述 | 前端访问不到缺寝人员的信息 |
附件 |
|
缺陷类型 | 数据库 |
缺陷严重程度 | 一般 |
缺陷优先级 | 一般 |
测试环境 | Win10 家庭中文版, Python3.12 Pycharm 2024.1.1 Chrome 126.0.6478.127
|
重现步骤 | 宿舍管理员登录 点击学生缺寝记录 在右侧界面查看信息 |
备注 |
|
- 测试汇总
- 测试问题汇总
web 页面会因为网络问题导致无法显示 在涉及 int 类型的输入时未做检测
- 差异分析
1、网络问题处理
清晰的错误提示:应给出明确的错误消息,告知用户网络问题。
友好的重试机制:允许用户轻松重新加载页面,无需复杂的操作。
加载进度指示:提供加载进度的指示,让用户知道应用仍在尝试加载。
2、错误处理和异常管理
非法输入处理:对int输入进行校验和过滤,避免应用崩溃。
友好的错误提示:当出现错误时,应向用户给出用户可理解的提示信息,应该是在原页面上已经存在的信息,或者直接在原页面上添加标记。
异常的分类处理:根据异常类型进行不同的处理,如超时、警告或阻止操作
2、安全性
输入验证:对所有用户输入进行严格的验证和过滤,防止恶意攻击。
SQL注入防护:使用参数化查询或ORM框架,避免SQL注入漏洞。
跨站脚本攻击(XSS)防护:对用户输入进行转义或编码,防止XSS攻击。
跨站请求伪造(CSRF)防护:使用CSRF令牌或验证码,防止CSRF攻击。
- 测试总结和评价
功能测试
• 功能完整性:宿舍管理系统的主要功能已经实现,并且大部分功能能够按照预期工作。
• 功能正确性:在大多数测试场景下,系统的功能表现正确,但在某些边缘 情况下存在异常。
• 易用性:系统界面设计直观,用户操作简便,但在某些功能的使用上可能 需要进一步的优化以提升用户体验。
安全性测试
• 输入验证:系统在输入字段上虽然有验证机制,但是不够严谨,存在潜在的安全风险。
• 权限管理:系统的权限管理功能基本完善
• 数据保护:系统对数据的保护措施基本到位,但加密算法的强度和密钥管理仍需加强,尤其是可以是直接通过路由跳转,应该在后期增加路由守卫强制进行身份验证才能访问。
- 建议
加强输入验证:
对所有用户输入进行严格的验证,确保它们符合预期的格式和范围。对于 int 类型的输入,可以使用正则表达式或其他验证方法来确 保它们只包含数字字符。
使用ORM(对象关系映射):
使用如Hibernate、Entity Framework等ORM框架,它们内部通常实现了参数化查询,减少了SQL注入的风险
编写代码
import unittest
from selenium import webdriver
from seleniummon import NoSuchElementException, TimeoutException
from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdrivermon.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
class MyItemTest(unittest.TestCase):
def setUp(self):
# 初始化WebDriver
self.driver = webdriver.Chrome(service=Service(r'C:\Users\86198\AppData\Local\Programs\Python\Python39\chromedriver-win64\chromedriver.exe'))
self.driver.get('http://localhost:8080')
time.sleep(3) # 等待页面加载完成
def tearDown(self):
self.driver.quit()
# 登录,传递参数方式,系统管理员
def Login1(self,username,password):
username_input = self.driver.find_element(By.XPATH, "//input[@placeholder='用户名']")
password_input = self.driver.find_element(By.XPATH, "//input[@placeholder='密码']")
username_input.clear()
password_input.clear()
username_input.send_keys(username)
password_input.send_keys(password)
role_button = self.driver.find_element(By.XPATH,'//*[@id="app"]/div/form/div[3]/div/label[1]/span[2]')
#选择系统管理员
role_button.click()
time.sleep(3)
login_button = self.driver.find_element(By.XPATH,'//*[@id="app"]/div/form/div[4]/div/button')
# 点击登录
login_button.click()
#宿舍管理员
def Login2(self,username,password):
username_input = self.driver.find_element(By.XPATH, "//input[@placeholder='用户名']")
password_input = self.driver.find_element(By.XPATH, "//input[@placeholder='密码']")
username_input.clear()
password_input.clear()
username_input.send_keys(username)
password_input.send_keys(password)
role_button = self.driver.find_element(By.XPATH, '//*[@id="app"]/div/form/div[3]/div/label[2]/span[2]')
# 选择宿舍管理员
role_button.click()
time.sleep(3)
login_button = self.driver.find_element(By.XPATH,'//*[@id="app"]/div/form/div[4]/div/button')
# 点击登录
login_button.click()
# 验证登录成功(已实现)
def verify_login_success(self,who,name):
time.sleep(3)
try:
# Build the XPath expression dynamically with provided 'who' and 'name'
# xpath_expression = f"//div[contains(text(), '{who}')]//strong[contains(text(), '{name}')]"
#找同级元素是否包含name
xpath_expression = f"//div[contains(text(), '{who}')]/parent::*/div[not(contains(text(), '{name}'))]"
student_info = self.driver.find_element(By.XPATH, xpath_expression)
# Assert that the student info element is found
self.assertIsNotNone(student_info, "登录成功")
except NoSuchElementException:
self.fail("登录失败: 无法找到指定的元素")
except Exception as e:
self.fail(f"登录失败: 发生异常 {e}")
# 验证信息用的,比如跳出一个提示,要验证提示中的信息是否符合要求
def verify_message(self, expected_message):
error_message =self.driver.find_element(By.CLASS_NAME, "el-message-box__content")
self.assertEqual(error_message.text, expected_message, f"服务异常弹窗出现: 期望 '{expected_message}' 但实际是 '{error_message.text}'")
time.sleep(4)
# confirm_button = WebDriverWait(self.driver, 5).until(
# EC.element_to_be_clickable((By.XPATH, "//button[contains(span, '确定')]"))
# )
# confirm_button.click()
# time.sleep(2)
#input下面出现的提示,验证提示信息是否正确(已完成)
def text_message(self,expected_message):
try:
error_message = WebDriverWait(self.driver, 12).until(
EC.presence_of_element_located((By.CLASS_NAME, "el-form-item__error"))
)
self.assertEqual(error_message.text, expected_message, f"错误提示出现: {expected_message}")
except Exception as e:
self.fail(f"错误提示未出现: {e}")
# 登录不成功时,input下面出现的提示,验证提示信息是否正确(已实现)
def test_login_failure_scenarios(self):
# # 用户名不存在时(每个单个执行,不然会有影响)
# self.Login2(' ',123123)
# time.sleep(3)
# self.verify_message('用户名不存在')
# #找弹窗的确定按钮
# confirm_button = WebDriverWait(self.driver, 5).until(
# EC.element_to_be_clickable((By.XPATH, "//button[contains(span, '确定')]"))
# )
# confirm_button.click()
# time.sleep(2)
# # 用户名为空时
# self.Login2('',123123)
# self.text_message('请确定输入非空')
# time.sleep(2)
# # 密码为空时
# self.Login2('ll','')
# self.text_message('请确定输入非空')
# 密码为错误时
self.Login2('ll', '123111')
self.verify_message('密码错误')
#找弹窗的确定按钮
confirm_button = WebDriverWait(self.driver, 5).until(
EC.element_to_be_clickable((By.XPATH, "//button[contains(span, '确定')]"))
)
confirm_button.click()
time.sleep(2)
# #均空时
# self.Login2('','')
# self.text_message('请确定输入非空')
#点击退出登录点击取消/确定(已实现)
def click_and_verify_logout_dialog(self, logout_button, expected_text, confirm=False):
logout_button.click()
print("等待弹窗信息...")
message_element = WebDriverWait(self.driver, 5).until(
lambda driver: driver.find_element(By.XPATH, "//div[@class='el-message-box__message']/p")
)
message_text = message_element.text
self.assertEqual(expected_text, message_text, f"弹窗信息不正确")
if confirm:
confirm_button = WebDriverWait(self.driver, 5).until(
EC.element_to_be_clickable((By.XPATH, "//button[contains(span, '确定')]"))
)
confirm_button.click()
time.sleep(2)
print("已退出")
else:
cancel_button = WebDriverWait(self.driver, 5).until(
EC.element_to_be_clickable((By.XPATH, "//button[contains(span, '取消')]"))
)
cancel_button.click()
print("已取消登录,等待再次退出...")
# 正确的登录以及注销(已实现)
def test_login_module(self):
# 登录操作
self.Login1('admin1', '123123')
time.sleep(2)
# 验证登录成功
self.verify_login_success('DORMS宿舍管理系统-系统管理员', '管理员1')
try:
# 等待悬浮菜单出现
dropdown_menu = WebDriverWait(self.driver, 10).until(
EC.visibility_of_element_located((By.CLASS_NAME, 'el-dropdown'))
)
# 模拟鼠标悬停
action = ActionChains(self.driver)
action.move_to_element(dropdown_menu).perform()
time.sleep(1)
# # 等待并点击退出登录按钮
print("开始等待退出登录按钮出现...")
logout_button = WebDriverWait(self.driver, 10).until(
EC.element_to_be_clickable((By.XPATH, '//li[contains(.,"退出登录")]'))
)
time.sleep(2)
print("退出登录按钮已找到,即将点击取消...")
self.click_and_verify_logout_dialog(logout_button, "注销登录吗?")
time.sleep(2)
# 再次点击退出登录并确认
# 1、模拟鼠标悬停
action = ActionChains(self.driver)
action.move_to_element(dropdown_menu).perform()
time.sleep(1)
# 2、再次等待并点击退出登录按钮
print("开始等待退出登录按钮出现...")
logout_button = WebDriverWait(self.driver, 10).until(
EC.element_to_be_clickable((By.XPATH, '//li[contains(.,"退出登录")]'))
)
time.sleep(1)
print("即将点击点击退出,弹窗内点击退出登录...")
self.click_and_verify_logout_dialog(logout_button, "注销登录吗?", confirm=True)
except (TimeoutException, NoSuchElementException) as e:
print("操作异常:", e)
print("当前页面源码:", self.driver.page_source)
# 宿舍管理员
def test_dorm(self):
self.Login2('ll', '123123')
# 验证登录成功
self.verify_login_success('DORMS宿舍管理系统-宿舍管理员', '宋玉')
time.sleep(1)
# ##############----- 学生缺勤登记() ---#################
try:
input_elems = self.driver.find_elements(By.CLASS_NAME,'el-input__inner')
# 获取填写的表单
buildId = input_elems[0]
dormId = input_elems[1]
name = input_elems[2]
reason = input_elems[3]
date=input_elems[4]
# 日期选择器选择
date.send_keys(Keys.ARROW_DOWN)
date.send_keys(Keys.ENTER)
# 不规范的填写(验证均不能为空,全空覆盖所有测试用例)
submit = self.driver.find_element(By.XPATH,'//*[@id="app"]/section/section/section/main/div[2]/form/div[6]/div/button/span')
submit.click()
time.sleep(1)
self.text_message("请确定输入非空")
# 正确填写信息
for _ in range(2):
buildId.send_keys(Keys.ARROW_DOWN)
buildId.send_keys(Keys.ENTER)
time.sleep(1)
for _ in range(2):
dormId.send_keys(Keys.ARROW_DOWN)
dormId.send_keys(Keys.ENTER)
time.sleep(1)
for _ in range(2):
name.send_keys(Keys.ARROW_DOWN)
name.send_keys(Keys.ENTER)
time.sleep(1)
reason.send_keys("11")
for _ in range(2):
date.send_keys(Keys.ARROW_DOWN)
date.send_keys(Keys.ENTER)
time.sleep(1)
# 提交
submit = self.driver.find_element(By.XPATH,'//*[@id="app"]/section/section/section/main/div[2]/form/div[6]/div/button/span')
print("能找到submit吗")
submit.click()
print("找到submit啦")
time.sleep(1)
# 验证弹窗
self.verify_message("缺寝登记成功")
time.sleep(2)
centain = self.driver.find_element(By.XPATH, "/html/body/div[6]/div/div[3]/button/span")
centain.click()
time.sleep(3)
except Exception as e:
self.fail(f"验证学生缺寝登记功能失败:{e}")
# ##############----- 学生缺勤记录已完成() ---#################
absentListPage=self.driver.find_element(By.XPATH,'//*[@id="app"]/section/section/aside/ul/li[2]')
absentListPage.click()
time.sleep(1)
try:
#直接点搜索,有提示下标
search_button = self.driver.find_element(By.XPATH,
'//*[@id="app"]/section/section/section/main/div[2]/form/div[2]/div/div/button')
search_button.click()
time.sleep(2)
self.text_message("请确定输入非空")
#正确流程
inputs = self.driver.find_elements(By.CLASS_NAME, 'el-input__inner')
select_case=inputs[0]
#选择楼宇
for _ in range(2):
select_case.send_keys(Keys.ARROW_DOWN)
select_case.send_keys(Keys.ENTER)
select_value=inputs[1]
# 选择value
select_value.send_keys(2)
time.sleep(1)
#点击搜索按钮
search_button = self.driver.find_element(By.XPATH,
'//*[@id="app"]/section/section/section/main/div[2]/form/div[2]/div/div/button')
search_button.click()
time.sleep(2)
except Exception as e:
self.fail(f"查询学生缺寝记录操作失败:{e}")
# 系统管理员端
def test_sys(self):
self.Login1('admin1','123123')
# 验证登录成功
self.verify_login_success('DORMS宿舍管理系统-系统管理员', '管理员1')
time.sleep(1)
##############----- 宿管模块 ---#################
dormmode = self.driver.find_element(By.XPATH,'//*[@id="app"]/section/section/aside/ul/li[1]/div')
dormmode.click()
time.sleep(1)
##############----- 添加宿管(已完成) ---#################
addDormPage=self.driver.find_element(By.XPATH,'//*[@id="app"]/section/section/aside/ul/li[1]/ul/li[1]')
addDormPage.click()
time.sleep(1)
# 填写添加宿管
try:
input_elems = self.driver.find_elements(By.CLASS_NAME,'el-input__inner')
# 获取填写的表单
Id = input_elems[0]
pw = input_elems[1]
name = input_elems[2]
#直接选中 女
gender = self.driver.find_element(By.XPATH,'//*[@id="app"]/section/section/section/main/div[2]/form/div[4]/div/div/label[2]/span[2]')
tel=input_elems[3]
# 不规范的填写(验证均不能为空,全空覆盖所有测试用例)
submit = self.driver.find_element(By.XPATH,'//*[@id="app"]/section/section/section/main/div[2]/form/div[6]/div/button')
submit.click()
time.sleep(2)
self.text_message("请确定输入非空")
time.sleep(1)
# 正确填写信息
Id.clear()
pw.clear()
name.clear()
tel.clear()
time.sleep(1)
text1='212106228'
Id.send_keys(text1)
pw.send_keys(111)
name.send_keys("lel")
gender.click()
tel.send_keys(21121212)
time.sleep(1)
# 提交
submit = self.driver.find_element(By.XPATH,'//*[@id="app"]/section/section/section/main/div[2]/form/div[6]/div/button/span')
print("能找到submit吗")
submit.click()
print("找到submit啦")
time.sleep(1)
expected_message=f"{text1}添加成功"
# 验证弹窗
self.verify_message(expected_message)
time.sleep(3)
#点击确定按钮
centain = self.driver.find_element(By.XPATH, "//button[contains(span, '确定')]")
centain.click()
time.sleep(1)
except Exception as e:
self.fail(f"验证添加宿管功能失败:{e}")
# ##############----- 宿管管理(已完成) ---#################
DormManagerPage = self.driver.find_element(By.XPATH, '//*[@id="app"]/section/section/aside/ul/li[1]/ul/li[2]')
DormManagerPage.click()
time.sleep(1)
try:
#直接点搜索,有提示下标
search_button = self.driver.find_element(By.XPATH,
'//*[@id="app"]/section/section/section/main/div[2]/form/div[2]/div/div/button')
search_button.click()
time.sleep(1)
self.text_message("请确定输入非空")
#正确流程
inputs = self.driver.find_elements(By.CLASS_NAME, 'el-input__inner')
select_case=inputs[0]
#选择宿管账号
print("宿管账号搜索。。。")
for _ in range(2):
select_case.send_keys(Keys.ARROW_DOWN)
select_case.send_keys(Keys.ENTER)
select_value=inputs[1]
# 选择value
text1 = '12'
select_value.send_keys(text1)
time.sleep(1)
#点击搜索按钮
search_button=self.driver.find_element(By.XPATH,'//*[@id="app"]/section/section/section/main/div[2]/form/div[2]/div/div/button')
search_button.click()
time.sleep(1)
# 删除
move_button = self.driver.find_element(By.XPATH,
'//*[@id="app"]/section/section/section/main/div[2]/div[1]/div[3]/table/tbody/tr/td[7]/div/button')
move_button.click()
print("move_button.click()")
time.sleep(1)
# 获取弹窗信息
message_text = self.driver.find_element(By.XPATH, "//div[@class='el-message-box__message']/p").text
# self.assertEqual("确认删除", message_text, f"弹窗信息不正确")
expected_message = f"确认删除【212106228】吗?"
# 验证弹窗
self.verify_message(expected_message)
#测试取消
cancel = self.driver.find_element(By.XPATH, "//button[contains(span, '取消')]")
cancel.click()
time.sleep(1)
#测试迁出弹窗的确定按钮(人工)(录屏使用)
move_button = self.driver.find_element(By.XPATH,
'//*[@id="app"]/section/section/section/main/div[2]/div[1]/div[3]/table/tbody/tr/td[7]/div/button')
move_button.click()
time.sleep(2)
centain = self.driver.find_element(By.XPATH, "//button[contains(span, '确定')]")
centain.click()
time.sleep(3)
except Exception as e:
self.fail(f"删除宿管操作失败:{e}")
##############----- 学生模块 ---#################
Stu = self.driver.find_element(By.XPATH, '//*[@id="app"]/section/section/aside/ul/li[2]/div')
Stu.click()
time.sleep(1)
# ##############----- 添加学生(已完成) ---#################
addstuPage = self.driver.find_element(By.XPATH,'//*[@id="app"]/section/section/aside/ul/li[2]/ul/li[1]')
addstuPage.click()
time.sleep(1)
# 填写添加学生
try:
# studentId = self.driver.find_element(By.XPATH,'//*[@id="app"]/section/section/section/main/div[2]/form/div[1]/label')
# self.assertIsNotNone(studentId,'学号存在')
# 01好像用不到
# 填写学生信息
# studentId.click()
# time.sleep(2)
# 01好像用不到
input_elems = self.driver.find_elements(By.CLASS_NAME,'el-input__inner')
# 获取填写的表单
Id = input_elems[0]
name = input_elems[1]
#直接选中 女
gender = self.driver.find_element(By.XPATH,'//*[@id="app"]/section/section/section/main/div[2]/form/div[3]/div/div/label[2]/span[2]')
# dormId = self.driver.find_element(By.XPATH,'//*[@id="app"]/section/section/section/main/div[2]/form/div[4]/div/div/div[1]/input')
dormId=input_elems[2]
# 不规范的填写(验证均不能为空,全空覆盖所有测试用例)
submit = self.driver.find_element(By.XPATH,'//*[@id="app"]/section/section/section/main/div[2]/form/div[5]/div/button')
submit.click()
time.sleep(2)
self.text_message("请确定输入非空")
time.sleep(3)
# 正确填写信息
Id.clear()
name.clear()
time.sleep(1)
Id.send_keys("11")
text1='212106228'
name.send_keys(text1)
gender.click()
time.sleep(2)
# 下拉框选择
for _ in range(2):
dormId.send_keys(Keys.ARROW_DOWN)
dormId.send_keys(Keys.ENTER)
time.sleep(2)
# 提交
submit = self.driver.find_element(By.XPATH,'//*[@id="app"]/section/section/section/main/div[2]/form/div[5]/div/button')
submit.click()
time.sleep(2)
expected_message=f"{text1}添加成功"
# 验证弹窗
self.verify_message(expected_message)
#点击确定按钮
centain = self.driver.find_element(By.XPATH, "//button[contains(span, '确定')]")
centain.click()
time.sleep(3)
except Exception as e:
self.fail(f"验证添加学生功能失败:{e}")
# ##############----- 学生管理(已完成) ---#################
stuManagerPage = self.driver.find_element(By.XPATH, '//*[@id="app"]/section/section/aside/ul/li[2]/ul/li[2]')
stuManagerPage.click()
time.sleep(1)
try:
#直接点搜索,有提示下标
search_button = self.driver.find_element(By.XPATH,
'//*[@id="app"]/section/section/section/main/div[2]/form/div[2]/div/div/button')
search_button.click()
time.sleep(1)
self.text_message("请确定输入非空")
#正确流程
inputs = self.driver.find_elements(By.CLASS_NAME, 'el-input__inner')
select_case=inputs[0]
#选择学号
print("学号搜索。。。")
for _ in range(2):
select_case.send_keys(Keys.ARROW_DOWN)
select_case.send_keys(Keys.ENTER)
select_value=inputs[1]
# 选择value
text1 = '001'
select_value.send_keys(text1)
time.sleep(1)
print("value已选择")
#点击搜索按钮
search_button=self.driver.find_element(By.XPATH,'//*[@id="app"]/section/section/section/main/div[2]/form/div[2]/div/div/button')
search_button.click()
print("searched")
time.sleep(1)
# 删除
move_button = self.driver.find_element(By.XPATH,
'//*[@id="app"]/section/section/section/main/div[2]/div[1]/div[3]/table/tbody/tr/td[8]/div/button')
move_button.click()
print("move_button.click()")
time.sleep(1)
# 获取弹窗信息
message_text = self.driver.find_element(By.XPATH, "//div[@class='el-message-box__message']/p").text
# self.assertEqual("确认删除", message_text, f"弹窗信息不正确")
expected_message = f"确认删除【王伟】吗?"
# 验证弹窗
self.verify_message(expected_message)
#取消
cancel = self.driver.find_element(By.XPATH, "//button[contains(span, '取消')]")
cancel.click()
time.sleep(1)
# #测试删除弹窗的确定按钮(人工)(录屏使用)
move_button = self.driver.find_element(By.XPATH,
'//*[@id="app"]/section/section/section/main/div[2]/div[1]/div[3]/table/tbody/tr/td[8]/div/button')
move_button.click()
time.sleep(2)
centain = self.driver.find_element(By.XPATH, "//button[contains(span, '确定')]")
centain.click()
time.sleep(3)
except Exception as e:
self.fail(f"删除宿管操作失败:{e}")
##############----- 学生迁出登记(已完成) ---#################
remove_option=self.driver.find_element(By.XPATH,'//*[@id="app"]/section/section/aside/ul/li[3]')
remove_option.click()
time.sleep(1)
try:
#直接点搜索,有提示下标
search_button = self.driver.find_element(By.XPATH,
'//*[@id="app"]/section/section/section/main/div[2]/form/div[2]/div/div/button')
search_button.click()
time.sleep(2)
print("直接搜索。。。")
self.text_message("请确定输入非空")
#正确流程
inputs = self.driver.find_elements(By.CLASS_NAME, 'el-input__inner')
select_case=inputs[0]
#选择学号
print("学号姓名搜索。。。")
for _ in range(2):
select_case.send_keys(Keys.ARROW_DOWN)
select_case.send_keys(Keys.ENTER)
select_value=inputs[1]
# 选择value(!!!!注意迁出后信息改变)
select_value.send_keys("002")
time.sleep(2)
#点击搜索按钮
search_button=self.driver.find_element(By.XPATH,'//*[@id="app"]/section/section/section/main/div[2]/form/div[2]/div/div/button')
search_button.click()
time.sleep(2)
# 迁出
move_button = self.driver.find_element(By.XPATH,
'//*[@id="app"]/section/section/section/main/div[2]/div[1]/div[3]/table/tbody/tr[1]/td[8]/div/button')
move_button.click()
time.sleep(2)
# 获取弹窗信息
message_text = self.driver.find_element(By.XPATH, "//div[@class='el-message-box__message']/p").text
self.assertEqual("请输入迁出原因", message_text, f"弹窗信息不正确")
#测试迁出弹窗的取消按钮(人工)
cancel = self.driver.find_element(By.XPATH, "//button[contains(span, '取消')]")
cancel.click()
time.sleep(1)
#取消完再迁出
move_button.click()
time.sleep(2)
#输入迁出原因
wait = WebDriverWait(self.driver, 10) # 等待最多10秒
input_because = wait.until(
EC.presence_of_element_located((By.XPATH, '/html/body/div[3]/div/div[2]/div[2]/div[1]/input')))
input_because.send_keys('毕业啦啦啦')
#测试迁出弹窗的确定按钮(人工)
centain = self.driver.find_element(By.XPATH, "//button[contains(span, '确定')]")
centain.click()
time.sleep(3)
#再次核对信息,点击确定(真实录屏测确定,谨慎使用,会直接删除select_value那一行数据,或导致报错)
centain = self.driver.find_element(By.XPATH, "//button[contains(span, '确定')]")
centain.click()
time.sleep(2)
# 再次核对信息,点击确定
centain = self.driver.find_element(By.XPATH, "//button[contains(span, '确定')]")
centain.click()
time.sleep(3)
except Exception as e:
self.fail(f"迁出学生操作失败:{e}")
##############----- 学生迁出记录(已完成) ---#################
removeListPage=self.driver.find_element(By.XPATH,'//*[@id="app"]/section/section/aside/ul/li[4]')
removeListPage.click()
time.sleep(1)
try:
#直接点搜索,有提示下标
search_button = self.driver.find_element(By.XPATH,
'//*[@id="app"]/section/section/section/main/div[2]/form/div[2]/div/div/button')
search_button.click()
time.sleep(2)
self.text_message("请确定输入非空")
#正确流程
inputs = self.driver.find_elements(By.CLASS_NAME, 'el-input__inner')
select_case=inputs[0]
#选择学生
for _ in range(2):
select_case.send_keys(Keys.ARROW_DOWN)
select_case.send_keys(Keys.ENTER)
select_value=inputs[1]
# 选择value(!!!!注意迁出后信息改变)
select_value.send_keys("小明")
time.sleep(2)
#点击搜索按钮
search_button=self.driver.find_element(By.XPATH,'//*[@id="app"]/section/section/section/main/div[2]/form/div[2]/div/div/button')
search_button.click()
time.sleep(2)
except Exception as e:
self.fail(f"查询迁出记录操作失败:{e}")
if __name__ == "__main__":
unittest.main()
结果演示
MYSQL
mysql
1.数据库、数据表的基本操作
-- 创建一个叫db1的数据库
create database db1;
-- 创建数据库后查看该数据库基本信息MySQL命令:
show create database db1;
-- 删除数据库MySQL命令:
drop database db1;
-- 查询出MySQL中所有的数据库MySQL命令:
show databases;
-- 将数据库的字符集修改为gbk MySQL命令:
alter database db1 character set gbk;
-- 切换数据库 :
use db1;
-- 查看当前使用的数据库 MySQL命令:
select database();
-- 2.数据表的基本操作
-- 数据库创建成功后可在该数据库中创建数据表(简称为表)存储数据。请注意:在操作数据表之前应使用“USE 数据库名;”指定操作是在哪个数据库中进行先关操作,否则会抛出“No database selected”错误。
-- 语法如下:
create table tbl1(
id int,
len double,
tele nvarchar(20),
birth date
);
-- 示例:创建学生表 MySQL命令:
create table student(
id int,
name varchar(20),
gender varchar(10),
birthday date
);
-- 2.2 查看数据表
-- 示例:查看当前数据库中所有表 MySQL命令:
show tables;
-- 示例:查表的基本信息 MySQL命令:
show create table tbl1;
show create table student;
-- 示例:查看表的字段信息 MySQL命令:
desc student;
desc tbl1;
-- 2.3 修改数据表
-- 有时,希望对表中的某些信息进行修改,例如:修改表名、修改字段名、修改字段 数据类型…等等。在MySQL中使用alter table修改数据表.
-- 示例:修改表名 MySQL命令:
alter table student rename to stu;
-- 运行效果展示:
show tables;
show create table stu;
-- 示例:修改字段名 MySQL命令:
alter table stu change name sname varchar(10);
-- 示例:修改字段数据类型 MySQL命令:
alter table stu modify sname int;
-- 运行效果展示:
desc stu;
-- 示例:增加字段 MySQL命令:
alter table stu add address varchar(50);
-- 运行效果展示:
desc stu;
-- 示例:删除字段 MySQL命令:
alter table stu drop address;
-- 运行效果展示:
alter table stu drop address;
-- 2.4 删除数据表
drop table tbl1;
-- 效果
show tables;
2.数据表的约束
-- 设置主键约束(primary key)的第一种方式
create table student(
id int primary key,
stuname varchar(20)
);
-- 运行效果展示:
desc student;
-- 设置主键约束(primary key)的第二·种方式
create table student01(
id int,
stuname varchar(20),
primary key(id)
);
-- 运行效果展示:
desc student01;
-- 2.非空约束
-- 非空约束即 NOT NULL指的是字段的值不能为空,基本的语法格式如下所示:
-- 字段名 数据类型 NOT NULL;
create table student02(
id int,
stuname varchar(20) not null
);
desc student02;
-- 3.默认值约束
-- 默认值约束即DEFAULT用于给数据表中的字段指定默认值,即当在表中插入一条新记录时若未给该字段赋值,那么,数据库系统会自动为这个字段插入默认值;其基本的语法格式如下所示:
-- 字段名 数据类型 DEFAULT 默认值;
-- 示例:MySQL命令:
create table student03(
id int,
name varchar(20),
gender varchar(10) default 'male'
);
desc student03;
-- 5.唯一性约束
-- 唯一性约束即UNIQUE用于保证数据表中字段的唯一性,即表中字段的值不能重复出现,其基本的语法格式如下所示:
create table student04(
id int,
name varchar(20) unique
);
desc student04;
-- 6.外键约束
-- 外键约束即FOREIGN KEY常用于多张表之间的约束。基本语法如下:
-- 在创建数据表时语法如下:
-- CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段)
-- 将创建数据表创号后语法如下:
-- ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段);
-- 示例:创建一个学生表 MySQL命令:
create table student05(
id int primary key,
name varchar(20)
);
desc student05;
create table student05(
id int primary key,
name varchar(20)
);
desc student05;
-- 示例:创建一个班级表 MySQL命令:
create table class(
classid int primary key,
studentid int
);
-- 示例:学生表作为主表,班级表作为副表设置外键, MySQL命令:
alter table class add constraint fk_class_studentid foreign key(studentid) references student05(id);
-- 6.1 数据一致性概念
-- 大家知道:建立外键是为了保证数据的完整和统一性。但是,如果主表中的数据被删除或修改从表中对应的数据该怎么办呢?很明显,从表中对应的数据也应该被删除,否则数据库中会存在很多无意义的垃圾数据。
-- 6.2 删除外键
-- 语法如下:
-- alter table 从表名 drop foreign key 外键名;
-- 示例:删除外键 MySQL命令:
alter table class drop foreign key fk_class_studentid;
-- 6.3 关于外键约束需要注意的细节
-- 1、从表里的外键通常为主表的主键
-- 2、从表里外键的数据类型必须与主表中主键的数据类型一致
-- 3、主表发生变化时应注意主表与从表的数据一致性问题
3.数据表插入数据
-- 六、数据表插入数据
-- 在MySQL通过INSERT语句向数据表中插入数据。在此,我们先准备一张学生表,代码如下:
desc student;
-- 1. 为表中所有字段插入数据
insert into student values (1,'stu');
insert into student values (2,'tzz');
-- 运行效果展示:
select * from student;
-- 3. 同时插入多条记录
-- 语法如下:
-- INSERT INTO 表名 [(字段名1,字段名2,...)]VALUES (值 1,值 2,…),(值 1,值 2,…),...;
-- 在该方式中:(字段名1,字段名2,…)是可选的,它用于指定插入的字段名;(值 1,值 2,…),(值 1,值 2,…)表示要插入的记录,该记录可有多条并且每条记录之间用逗号隔开。
-- 示例:向学生表中插入多条学生信息 MySQL命令:
insert into student (id,stuname) values (3,'组长'),(4,'yaaa'),(5,'qaq');
4.更新数据
-- 七、更新数据
-- 在MySQL通过UPDATE语句更新数据表中的数据。在此,我们将就用六中的student学生表
-- 1. UPDATE基本语法
-- UPDATE 表名 SET 字段名1=值1[,字段名2 =值2,…] [WHERE 条件表达式];
-- 2. UPDATE更新部分数据
-- 示例:将name为tom的记录的age设置为20并将其gender设置为female MySQL命令:
alter table student add age int;
alter table student add gender varchar(20);
insert into student values(6,'tom',18,'male');
alter table student add primary key(id) ;
update student set age=20,gender='female' where stuname='tom'and id>0;
select * from student;
desc student;
update student set age=20,gender='female' where stuname='tom' and id>0;
-- 3. UPDATE更新全部数据
-- 示例:将所有记录的age设置为18 MySQL命令:
update student set age=18;
5.删除数据
-- 八、删除数据
-- 在MySQL通过DELETE语句删除数据表中的数据。在此,我们先准备一张数据表,代码如下s:
update student set age=14 where id=4;
-- 示例:删除age等于14的所有记录 MySQL命令:
delete from student where age=14;
-- 运行效果展示:
select * from student;
-- 3. DELETE删除全部数据
-- 示例:删除student表中的所有记录 MySQL命令:
delete from student;
-- 4. TRUNCATE和DETELE的区别
-- TRUNCATE和DETELE都能实现删除表中的所有数据的功能,但两者也是有区别的:
-- 1、DELETE语句后可跟WHERE子句,可通过指定WHERE子句中的条件表达式只删除满足条件的部分记录;但是,TRUNCATE语句只能用于删除表中的所有记录。
-- 2、使用TRUNCATE语句删除表中的数据后,再次向表中添加记录时自动增加字段的默认初始值重新由1开始;使用DELETE语句删除表中所有记录后,再次向表中添加记录时自动增加字段的值为删除时该字段的最大值加1
-- 3、DELETE语句是DML语句,TRUNCATE语句通常被认为是DDL语句
6.MySQL数据表简单查询
-- 1.简单查询概述
-- 简单查询即不含where的select语句。在此,我们讲解简单查询中最常用的两种查询:查询所有字段和查询指定字段。
-- 在此,先准备测试数据,代码如下:
-- 创建数据库
DROP DATABASE IF EXISTS mydb;
CREATE DATABASE mydb;
USE mydb;
-- 创建student表
CREATE TABLE student (
sid CHAR(6),
sname VARCHAR(50),
age INT,
gender VARCHAR(50) DEFAULT 'male'
);
-- 向student表插入数据
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');
select * from student;
-- 3.查询指定字段(sid、sname)
-- 查询指定字段(sid、sname) MySQL命令:
select sid,sname from student;
-- 4.常数的查询
-- 在SELECT中除了书写列名,还可以书写常数。可以用于标记
-- 常数的查询日期标记 MySQL命令:
select sid,sname,'2024-07-15' from student;
-- 5.从查询结果中过滤重复数据
-- 在使用DISTINCT 时需要注意:
-- 在SELECT查询语句中DISTINCT关键字只能用在第一个所查列名之前。
-- MySQL命令:
select distinct gender from student;
--
-- 6.算术运算符(举例加运算符)
-- 在SELECT查询语句中还可以使用加减乘除运算符。
-- 查询学生10年后的年龄 MySQL命令:
select sname,age+10 from student;
7.条件查询
-- -------------------------------------------------------------------------------------------------
-- 条件查询
-- 创建数据库
DROP DATABASE IF EXISTS mydb;
CREATE DATABASE mydb;
USE mydb;
-- 创建student表
CREATE TABLE student (
sid CHAR(6),
sname VARCHAR(50),
age INT,
gender VARCHAR(50) DEFAULT 'male'
);
-- 向student表插入数据
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1012', 'lili', 14, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1013', 'wang', 15, 'female');
select sname from student where age>17
-- 某个字段的值是否在指定集合内
select * from student where sid in ('S_1002','S_1003');
-- 查询sid为S_1001以外的学生的信息 MySQL命令:
select * from student where sid not in ('S_1001')
-- --3.使用BETWEEN AND关键字查询
-- BETWEEN AND用于判断某个字段的值是否在指定的范围之内。如果字段的值在指定范围内,则将所在的记录将查询出来
-- 查询15到18岁的学生信息 MySQL命令:
select * from student where age >=15 && age <=18
-- 查询不是15到18岁的学生信息 MySQL命令:
select * from student where age not between 15 and 18
-- 4.使用空值查询
-- 在MySQL中,使用 IS NULL关键字判断字段的值是否为空值。请注意:空值NULL不同于0,也不同于空字符串
-- 由于student表没有空值就不演示查询空值的了
-- 查询sname不为空值的学生信息 MySQL命令:
select * from student where sname is not null
select * from student where age>15 and gender='male';
select * from student where age>15 or gender='male';
-- 7.使用LIKE关键字查询
-- MySQL中可使用LIKE关键字可以判断两个字符串是否相匹配
-- 7.1 普通字符串
-- 查询sname中与wang匹配的学生信息 MySQL命令:
select * from student where sname like 'wang';
select * from student where sname like 'li%';
select * from student where sname like '%g';
select * from student where sname like '%s%';
select * from student where sname like 'zx__';
select * from student where sname like '___g';
-- 8.使用LIMIT限制查询结果的数量
-- 当执行查询数据时可能会返回很多条记录,而用户需要的数据可能只是其中的一条或者几条
-- 查询学生表中年纪最小的3位同学 MySQL命令:
select * from student order by age limit 3;
-- 9.使用GROUP BY进行分组查询
-- GROUP BY 子句可像切蛋糕一样将表中的数据进行分组,再进行查询等操作。换言之,可通俗地理解为:通过GROUP BY将原来的表拆分成了几张小表。
-- 接下来,我们通过一个例子开始学习GROUP BY,代码如下
-- 创建数据库
DROP DATABASE IF EXISTS mydb;
CREATE DATABASE mydb;
USE mydb;
-- 创建员工表
CREATE TABLE employee (
id int,
name varchar(50),
salary int,
departmentnumber int
);
-- 向员工表中插入数据
INSERT INTO employee values(1,'tome',2000,1001);
INSERT INTO employee values(2,'lucy',9000,1002);
INSERT INTO employee values(3,'joke',5000,1003);
INSERT INTO employee values(4,'wang',3000,1004);
INSERT INTO employee values(5,'chen',3000,1001);
INSERT INTO employee values(6,'yukt',7000,1002);
INSERT INTO employee values(7,'rett',6000,1003);
INSERT INTO employee values(8,'mujk',4000,1004);
INSERT INTO employee values(9,'poik',3000,1001);
-- 9.1 GROUP BY和聚合函数一起使用
-- 统计各部门员工个数 MySQL命令:
select departmentnumber,count(*) from employee group by departmentnumber;
-- 统计部门编号大于1001的各部门员工个数 MySQL命令:
select departmentnumber,count(*) from employee where departmentnumber>1001 group by departmentnumber ;
-- 9.2 GROUP BY和聚合函数以及HAVING一起使用
-- 统计工资总和大于8000的部门 MySQL命令:
select sum(salary),departmentnumber from employee group by departmentnumber having sum(salary)>8000;
select * from student order by age desc;
错误1
错误1
Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.
翻译过来就是:
错误代码:1175。你正在使用安全更新模式,你试图更新一个没有在哪里使用键列禁用安全模式的表,在首选项中切换选项;SQL编辑器和重新连接。
在delete或者update的时候,都可能会出现这种警告/报错,这主要是因为版本较新的MySQL是在safe-updates模式下进行sql操作的,这个模式会导致在非主键条件下无法执行update或者delete
解决的方案:
update student set age=20,gender='female' where name='tom' and id>0;
一劳永逸
如何对查询命令进行优化?
优化查询命令可以通过多种策略实现,主要包括改进查询语句结构、使用索引、以及调整数据库设计等。12
-
改进查询语句结构:
- **避免使用SELECT ***:只选择需要的字段,减少数据传输量和存储空间的占用。
- 使用JOIN代替子查询: 在适当的情况下,JOIN操作通常比子查询更高效。
- 优化WHERE子句: 避免在WHERE子句中使用非SARGable表达式(如函数或计算),这有助于利用索引。
- 合理使用LIMIT: 当只需要查询结果的一部分时,使用LIMIT可以减少数据传输时间和带宽浪费。
-
使用索引:
- 创建合适的索引: 根据查询需求创建适当的索引,避免全表扫描,从而提高查询性能。
- 避免过度索引: 过多的索引会增加写操作的开销和存储空间。
- 定期维护索引: 定期重建或重新组织索引,保持其性能。
-
调整数据库设计:
- 规范化设计: 避免数据冗余,减少数据不一致的可能性,提高查询效率。
- 选择合适的数据类型: 尽量使用较小的数据类型,减少存储空间和I/O操作。
- 分区表: 对于非常大的表,可以考虑使用分区表来提高查询性能和管理效率。
Linux
产品
产品从需求到上线的过程?
需求规划分析(用户调研、市场分析、竞品调研,文档撰写,需求评审、设计交互、视觉方案)需求开发:开发、测试
需求体验
需求测试:关注bug修改,关注功能质量
需求合流:关注合流后的功能表现和其他功能的耦合
需求发布:产品上线,运营推广,关注用户反馈和数据情况,及时复盘
什么是一款成功产品?
从用户的角度:能持续不断的解决目标用户的需求;
用户操作简单方便:在使用产品后能够快速的有效的解决问题。
从产品的角度:该产品相较于其他竞品有着独特的优势,产品能够持续不断的迭代以满足目标用户的需求。
从商业的角度:公司的技术层面可以实现该产品,井且可以长期维护,
持续完善:该产品可以为公司创造长期的可持续价值,包括但不限于利润,盈利模式,市场价值,战略地位等。
B端产品领域定位
1.以业务发展,商业模式的承载落地为主要服务范围
2.以企业/经济组织,及相关商业角色为核心服务对象
3.通过产品系统,支持一系列业务管理、业务生产、服务支撑等核心领域
4.帮助企业完成商业目标
智能制造数字化工厂制造执行系统(MES)
MES
第1张
大家好!我今天要介绍的主题是:智能制造数字化工厂制造执行系统(MES)一体化平台规划方案
第2张
我们今天主要从以下几个方面展开介绍:
项目背景与目标
MES系统功能模块设计
技术架构与实施方案
用户体验与界面设计
集成应用与拓展性考虑
风险评估与应对措施
第3张
下面介绍项目背景与目标。
第6张
首先,MES系统可以根据订单和生产计划,智能地生成生产工单和调度指令,确保生产始终按计划进行。这就像是工厂的大脑,时刻指引着生产的方向。其次,MES系统还能实时监控生产现场的设备状态、物料消耗、产品质量等信息,确保生产过程的稳定和可控。这就好比是工厂的眼睛和耳朵,时刻关注着生产的每一个细节。再者,MES系统可以收集生产过程中的各种数据,包括设备数据、质量数据、物料数据等,并进行深入分析和挖掘,为生产优化提供决策支持。这就像是工厂的数据分析师,用数据说话,为生产优化提供有力依据。最后,MES系统还能对生产过程中的质量数据进行采集、分析和处理,及时发现并处理质量问题,同时实现产品质量的追溯和召回。这就像是工厂的质量守门员,时刻守护着产品的质量和安全。总的来说,MES系统在数字化工厂中发挥着核心作用,通过智能化、自动化的方式,实现生产的高效、稳定和优质。
第7张
咱们的目标啊,就是要构建一个高效、智能的数字化工厂制造执行系统一体化平台,让生产过程全面实现数字化、网络化和智能化。想想看,这样一来,我们的生产效率会大大提高,成本也会相应降低,还能提升产品质量和企业的市场竞争力。这不光是个技术活,还得靠咱们团队齐心协力,才能把这个项目做得漂亮!
第8张
通过这个平台,我们可以更好地监控生产流程,优化资源配置,及时发现并解决问题,从而实现整个生产过程的智能化、自动化。这将使我们的企业能够更好地应对市场的变化和挑战,提高市场竞争力。这就是我们这个项目的预期成果。
第9张
这个方案的目标非常明确,那就是通过数字化和智能化的手段,提高我们的生产效率,降低运营成本。具体来说,我们希望通过这个方案,将生产效率提高XX%以上,将运营成本降低XX%以上。这样的成果不仅将大大提升我们的竞争力,同时也将为我们的企业带来更大的发展空间。
为了实现这个目标,我们将充分利用现代信息技术,构建一个集生产控制、管理决策、数据分析于一体的智能化制造执行系统。通过这个系统,我们可以实时监控生产过程中的每一个环节,及时发现问题并进行调整,从而确保生产的高效和稳定。同时,我们还将通过数据分析和挖掘,发现生产过程中的瓶颈和问题,为企业的决策提供有力支持。
这个方案的实施,不仅需要我们的技术人员和管理人员的共同努力,也需要各位的积极参与和支持。我相信,通过大家的共同努力,我们一定能够实现这个方案的目标,为企业的发展做出更大的贡献。
第10张
这是一个具有战略意义的项目,旨在推动我们企业的数字化转型,提升生产效率和产品质量。
我们期望通过实施这个方案,产品不良率能够降低XX%以上。这意味着我们的产品质量将得到大幅提升,从而增强企业在市场中的竞争力。
同时,我们希望实现生产过程的可视化、可控制和智能化管理。这意味着我们可以实时监控生产情况,及时调整生产策略,确保生产过程的稳定性和高效性。
最终,我们期望通过这个项目,提升企业的市场竞争力,赢得更多客户的信任和市场份额。这是我们共同的目标,也是我们不断努力的方向。
总之,智能制造数字化工厂制造执行系统(MES)一体化平台规划方案是我们企业未来发展的重要支撑。我们将全力以赴,确保项目的顺利实施,为企业创造更大的价值。
第11张
下面介绍MES系统功能模块设计。
第12张
而生产计划管理模块,则是MES中不可或缺的一部分。首先,我们要根据销售订单、预测和库存情况,来制定详细的生产计划。这就好比厨师要根据菜单、食材库存和客人的需求,来决定今天做什么菜、做多少。其次,对生产计划进行排程,生成生产工单和领料单,确保每个车间都明确自己的任务。这就像餐厅的领班,要根据厨师的菜单,给每个服务员分配任务,确保每道菜都能准时上桌。最后,实时跟踪生产进度,了解生产现场情况,及时调整生产计划。这就像餐厅的经理,要时刻关注客人的用餐情况,一旦发现有菜上得慢了,就要立即调整,确保客人的用餐体验。所以,通过MES的生产计划管理模块,我们可以实现生产的高效、准确和灵活,为企业的智能制造提供有力支持。
第13张
让我们来谈谈智能制造数字化工厂制造执行系统(MES)一体化平台的生产过程监控模块。这一模块涉及到设备的实时监控,我们可以通过系统来观察设备的运行状态和各项参数,一旦有设备出现故障,系统会立刻发现并及时通知我们进行处理。同时,物料监控也是非常重要的一环,我们需要对物料进行实时监控,确保物料供应能够及时、稳定。最后,生产过程可视化也是非常关键的一部分,通过图表、报表等方式,我们可以直观地看到生产过程的各项数据和指标,从而更好地掌握生产情况,做出更明智的决策。
第14张
今天,我将着重为大家介绍一下MES中的质量追溯与品质管理模块。
在智能制造中,质量数据采集是基础中的基础。我们需要全面采集生产过程中的质量数据,包括原料、半成品和成品的质量信息。这样,我们才能准确了解产品在各个环节的质量状况,为后续的质量追溯和品质管理提供有力的数据支持。
有了质量数据,我们就可以进行质量追溯了。当发现质量问题时,通过追溯系统,我们能够迅速查找问题的原因和责任,从而采取有效措施,防止问题再次发生。这不仅提高了生产效率和产品质量,也大大增强了企业的竞争力。
当然,品质管理也是MES一体化平台不可或缺的一部分。我们需要制定严格的品质管理标准和流程,对生产过程中的品质异常进行及时处理和跟踪。这样,我们才能确保产品始终符合高质量标准,赢得客户的信任和满意。
总的来说,质量追溯与品质管理模块是MES一体化平台的核心组成部分。通过实现这些模块的功能,我们能够更好地掌控生产过程中的质量问题,提高产品质量和生产效率,为企业的发展注入强大动力。
第15张
在智能制造数字化工厂中,我们提出了一个一体化平台规划方案,其中包括资源配置与优化模块。这一模块的核心是管理企业的各种资源,包括设备、物料和人力等。通过有效的资源管理,我们可以确保生产过程中的资源需求得到满足,从而提高生产效率和产品质量。
同时,我们还将进行资源调度,根据生产计划和资源情况,合理调配资源,确保生产顺利进行。这就像是一个智能的交通指挥系统,能够根据实时路况调整车辆流动,保证交通的顺畅。
另外,我们还将通过数据分析和挖掘,发现资源使用中的瓶颈和浪费,提出优化建议,降低生产成本。这就像是一个精明的理财顾问,帮助我们找到资金使用中的不合理之处,提出改进方案,让我们的资金运作更加高效。
总之,通过资源配置与优化模块的实施,我们将实现智能制造数字化工厂的高效、智能和可持续发展。
第16张
下面介绍技术架构与实施方案。
第17张
首先,基于微服务架构,我们可以实现高内聚、低耦合的系统设计。这种设计方式可以提高系统的可扩展性和可维护性,使得系统更加灵活和易于管理。其次,我们需要采用分层设计思想,将系统划分为数据访问层、业务逻辑层、服务接口层和展示层。这种分层设计有利于开发人员明确各自的职责,提高开发效率和代码质量。最后,我们可以引入消息队列、缓存等中间件技术,进一步提高系统的异步处理能力和数据访问性能。这些中间件技术可以帮助系统更好地应对高并发、大数据量等挑战,确保系统的稳定运行和高效执行。
第18张
智能制造数字化工厂制造执行系统(MES)一体化平台规划方案,首先我们要考虑数据采集与传输技术选型。为了确保数据的实时性和稳定性,我们将采用工业物联网协议,比如MQTT、OPC UA等,来进行设备数据的采集。这些协议专为工业场景设计,能够确保在各种复杂环境下数据的准确和稳定传输。
接下来,我们要利用高效的数据传输协议,如Kafka、RabbitMQ等,实现数据在各个环节的快速传输和处理。这些协议就像是智能制造中的数据“高速公路”,能够保证数据在各环节间快速流动,不拥堵,不延迟。
同时,我们还会对采集的数据进行清洗、压缩和加密处理,确保数据的质量和安全性。数据清洗可以去除无效和错误的数据,数据压缩可以提高传输效率,而数据加密则能保护数据不被非法获取和使用。这样,我们的MES一体化平台就能够更好地支持智能制造的数字化转型,提高生产效率,降低成本,增强竞争力。
第19张
在这个规划方案中,我们特别关注实时数据处理与存储方案。首先,我们会利用像Flink、Spark Streaming这样的实时计算框架,对采集的大量数据进行实时处理和分析,从中提取出真正有价值的信息。为了高效地存储这些实时数据,我们会采用时序数据库,比如InfluxDB或OpenTSDB,它们特别擅长处理时间序列数据,并且支持快速的数据查询和展示。当然,我们也明白,仅仅依赖时序数据库是不足以满足所有数据存储需求的。因此,我们会结合关系型数据库和非关系型数据库,构建一个混合存储方案,以满足系统对数据存储的多样性需求。这样的规划方案,既能确保数据的实时性和准确性,又能兼顾数据存储的灵活性和扩展性,为智能制造数字化工厂的高效运作提供坚实的技术支持。
第20张
首先,我们需要制定完善的安全管理制度和流程,这些制度和流程必须明确各项安全措施的责任和执行步骤,以确保整个系统的安全可控。其次,我们要运用先进的身份认证、访问控制、数据加密等技术手段来保障数据的安全性和隐私性,防止数据被非法获取或篡改。同时,我们还需要对系统进行定期的漏洞扫描和安全评估,及时发现和修复潜在的安全隐患,确保系统的稳定性和安全性。最后,建立灾备恢复机制也是必不可少的,这可以在系统遭受意外灾害时快速恢复并保障业务的连续性,避免因系统瘫痪而造成的损失。这些措施共同构成了MES一体化平台规划方案的安全保障体系,为企业的智能制造提供了坚实的安全保障。
第21张
下面介绍用户体验与界面设计。
第22张
首先,我们需要根据每个用户在工作中的职责和内容,将他们划分为不同的角色,比如管理员、操作员、监控员等。这样,每个用户都能明确自己的职责和权限,更好地完成自己的工作。
接下来,我们要针对这些角色,设置相应的数据查看、操作、修改等权限。这样一来,既能确保信息的安全,又能保证整个制造执行流程的顺畅。举个例子,管理员可以拥有更高的权限,对数据进行增删改查等操作,而操作员和监控员则只能根据自己的角色,查看和操作相应的数据。
当然,我们的系统也不是一成不变的。在实际运行过程中,用户可能会因为工作职责的变化,或者业务需求的调整,需要调整自己的权限。因此,我们的系统提供了灵活的权限调整功能,可以根据用户的实际需求,随时调整他们的权限,满足业务发展的需求。
总的来说,合理的用户角色及权限设置,是确保智能制造数字化工厂制造执行系统(MES)一体化平台能够顺利运行的重要保障。通过明确的角色划分、权限分配和灵活的权限调整,我们既能保证信息的安全,又能满足实际业务需求,推动整个制造执行流程的高效运行。
第23张
首先,界面风格的选择至关重要。我们应该结合行业特点和用户习惯,选择简洁、直观、易用的界面风格,确保用户能够迅速上手并高效操作。其次,布局规划也是不可忽视的一环。我们应该根据功能模块和使用频率,合理规划界面布局,确保用户能够方便快捷地访问和使用各个功能。最后,为了满足不同用户的个性化需求,我们还提供界面定制化服务,让用户能够根据自己的喜好和习惯来定制界面风格、布局和功能模块。通过这些措施,我们能够为用户提供一个既符合行业标准又具有个性化的操作界面,提高用户的使用体验和操作效率。
第24张
在交互设计方面,我们要坚持以用户为中心,采用图形化、可视化的交互方式,让操作变得更加简单易懂,降低用户的学习成本。同时,我们也要不断优化用户体验,针对用户的反馈和实际操作情况,提供具体的优化建议,持续改进产品的易用性和用户满意度。
在这个快速变化的时代,新技术层出不穷,我们也要紧跟时代潮流,不断引入新技术和交互方式,为用户带来更加新颖、便捷、高效的使用体验。这样,我们才能不断提升企业的竞争力,迎接未来的挑战。
第25张
智能制造数字化工厂制造执行系统(MES)一体化平台规划方案的培训推广策略,是我们确保用户能够高效、准确地使用MES系统的关键。首先,我们将针对系统的各项功能和操作流程,制定详尽的培训计划,帮助用户逐步掌握系统的各项操作技巧,提升他们的操作熟练度。
在推广方式上,我们将采用线上和线下相结合的方式,通过视频教程、现场培训、操作指导等多种手段,满足不同用户的学习需求。线上教学便于用户随时随地学习,而线下教学则能够提供更加直接的指导和帮助,让用户更快地掌握系统操作。
当然,我们的培训推广工作不会止步于此。我们还将对培训效果进行跟踪评估,通过收集用户反馈和观察用户操作,了解培训效果,并根据实际情况及时调整培训策略,确保每一位用户都能够得到最佳的学习体验,充分发挥MES系统的优势,提升企业的生产效率和质量。
第26张
下面介绍集成应用与拓展性考虑。
第27张
那么,MES系统如何与其他系统集成呢?
首先,我们要将MES与企业资源计划(ERP)系统集成。这样,生产计划、物料需求、销售订单等数据就能实时同步,让生产管理更加协同、准确。
其次,我们还要与设备管理系统(EAM)集成。这样,设备运行状态、维修保养等信息就能实时传递至MES系统,让设备管理与生产调度紧密结合,从而提高设备利用率和维护效率。
最后,MES系统还要与质量管理系统(QMS)集成。通过这一集成,我们就能实现质量数据采集、分析、处理、反馈的闭环管理,从而提升产品质量水平,提高客户满意度。
总的来说,MES系统的集成,是我们实现智能制造、数字化转型的关键步骤。通过与其他系统的紧密配合,我们可以全面提升生产效率、产品质量和客户满意度,为我们的企业发展注入新的动力。
第28张
为了确保各个系统之间的数据能够顺畅交换和共享,我们需要制定一套统一的数据格式和接口标准。比如说,我们可以采用国际上通用的数据交换标准,让数据交流更加顺畅无阻。
接下来,我们要建立一个数据共享机制。这个机制要能够明确数据的所有权、使用权和管理权,让数据流动起来,而且是有序、合理的流动,实现数据的高效利用。
当然,在数据共享的过程中,数据安全也是我们必须要重视的问题。我们需要加强对数据的保护和管理,确保数据的安全性、完整性和可用性。只有这样,我们才能真正实现智能制造数字化工厂制造执行系统(MES)一体化平台的高效运作。
第29张
这意味着我们需要密切关注企业未来的发展战略和市场趋势,以预测未来业务发展对MES系统的需求。比如,新业务模式的出现可能需要MES系统提供新的功能支持,或者随着企业规模的扩大,我们需要对MES系统进行功能模块的扩展。
同时,我们也要充分评估系统的性能需求。随着业务规模的扩大和数据量的增加,MES系统需要处理更多的数据,完成更复杂的任务。因此,我们需要确保MES系统具有足够的处理能力、存储容量和网络带宽,以满足这些需求。
另外,我们不能忽视系统的可维护性和可升级性。为了确保MES系统的长期稳定运行和持续升级,我们需要考虑采用模块化设计,预留扩展接口等策略,使系统易于维护和升级。这样,当企业有新的需求或者市场有新的变化时,我们就能迅速地对MES系统进行调整和优化,以适应新的环境和需求。
第30张
智能制造数字化工厂制造执行系统(MES)一体化平台规划方案,对于版本迭代升级策略,我有三点建议。首先,我们要根据业务需求和技术发展趋势,制定MES系统的版本迭代计划。这样不仅能明确每个版本的功能特点、优化内容,还能确保发布时间的准确性。其次,加强版本测试与验证工作至关重要。在新版本发布前,我们必须进行充分的测试与验证,保证新版本的稳定性和可靠性,从而降低升级风险。最后,提供持续的技术支持与服务是我们应尽的责任。在版本迭代升级过程中,我们要及时解决用户反馈的问题和需求,提高用户满意度和忠诚度,为智能制造数字化工厂制造执行系统(MES)一体化平台的发展贡献力量。
第31张
下面介绍风险评估与应对措施。
第32张
首先,我们需要对MES系统所涉及的技术进行全面的成熟度评估,这样可以及时发现潜在的技术风险,为后续的决策提供依据。其次,为了确保项目的顺利进行,我们必须对MES系统的技术方案进行可行性分析,坚决避免采用不成熟或不可靠的技术。最后,为了更加精准地掌握技术风险的情况,我们还需要建立一个完善的技术风险评估模型,对MES系统的技术风险进行量化和定性评估。这样一来,我们就能够更加清晰地了解每个技术环节的风险大小,从而制定出更加科学、合理的风险应对策略。
第33张
为了确保智能制造数字化工厂制造执行系统(MES)一体化平台的稳定运行,我们需要采取一系列操作风险防范措施。首先,制定详细的MES系统操作规程是至关重要的,这能够规范用户的操作行为,减少误操作的可能性。其次,对用户进行MES系统操作培训也是必不可少的,通过定期的培训与考核,我们可以提高用户的操作技能和安全意识,让他们更加熟悉系统的操作流程和安全要求。最后,建立严格的权限管理制度也是非常关键的,这能够确保用户只能访问其权限范围内的数据和功能,避免数据泄露和非法操作的发生。通过这些操作风险防范措施的实施,我们可以确保MES系统的稳定性和安全性,为智能制造数字化工厂的高效运行提供坚实的保障。
第34张
在规划这样一个平台时,数据安全保障策略是至关重要的。首先,我们需要确保MES系统中的敏感数据在传输过程中进行加密,以防止任何潜在的数据泄露。其次,建立完善的数据备份和恢复机制至关重要,这样在遭遇系统故障或其他突发情况时,我们能够迅速恢复数据,确保生产线的顺畅运行。最后,实施严格的数据访问控制是必要的,确保只有经过授权的用户才能访问MES系统中的数据,从而保障数据的安全和完整。这些策略共同构成了我们MES一体化平台规划方案中的数据安全保障基石。
第35张
亲爱的朋友们,今天我们来讲讲智能制造数字化工厂制造执行系统(MES)一体化平台的应急预案制定。在数字化工厂的日常运行中,可能会遇到各种预料之外的情况,如系统故障、安全事件等。为了确保这些突发情况得到迅速、有效的处理,我们需要制定一套完善的应急预案。
首先,我们要明确MES系统故障应急响应流程。这包括故障报告、处理、恢复等各个环节,每个环节都有明确的职责和要求,确保问题能够迅速得到解决。
其次,我们要针对可能发生的安全事件制定应急处理预案。这包括事件报告、处置、调查等环节,确保在发生安全事件时,我们能够迅速做出反应,将损失降到最低。
同时,为了确保在发生故障时能够及时恢复系统运行,我们还需要制定MES系统的备份与恢复方案。这样,即使在遇到严重问题时,我们也能迅速恢复到正常状态。
最后,为了确保这些预案的有效性,我们需要定期进行应急预案演练,并对演练效果进行评估。通过不断的演练和评估,我们可以不断完善应急预案,提高应对突发事件的能力。
总的来说,智能制造数字化工厂制造执行系统(MES)一体化平台的应急预案制定是非常重要的。通过制定完善的预案,我们可以确保在突发事件发生时,能够迅速、有效地进行应对,保障数字化工厂的正常运行。
我的AXURE项目
OC联谊软件
1.需求分析
项目背景:
oc源于日语中的"original character",原意为"原创角色",指的是用户自行创作并分享的角色形象。随着日本二次元文化的发展,oc在国内也逐渐流行开来,成为玩家们在网络平台上进行角色扮演、二次创作等的重要素材之一。它的应用场景十分丰富。最初,它被广泛运用于二次元圈子中。无论是cosplay、漫画、小说、甚至是游戏领域,均可见到oc的身影。随着oc的普及,越来越多的玩家和文化爱好者开始利用oc角色进行自己的二次创作。随着网络的发展,oc的应用范围不断拓宽,逐渐流行至各个领域。
在当今越来越重视用户体验的社会背景下,oc将会在未来的创作中扮演着越来越重要的角色。从根本上看,oc的核心是用户原创,在原创的背景下,它将具备更新换代、多样性、体验性等特点。因此,oc的发展前景十分广阔,其应用领域将会越来越广,同时也将在原创、共享、创新等方面创造更多的机遇和价值。
然而,当前oc爱好者们面临的困境是并没有一个专用于服务oc爱好者们对于oc相关需求的软件广为人知,OC爱好者们约画、约文、约设定以及自己进行oc创作、与别人的oc交互行为往往散布于各种社交媒体软件实行(如lofter、b站、小红书等)以及各种约稿软件(米画师,b站工房,约稿超话,临界,画加,咸鱼,小红,贴吧(约稿吧))中。
因此我想出设计该软件,专门用于服务oc爱好者和创作者。
目标:
a. 产品目标
OC定制:用户能够根据喜好通过表单快速创建属于自己的oc。
OC商铺:提供丰富的角色配置选项,如衣物、跑车等,满足用户为原创角色花钱、打扮、配置财物的成就感。
大众评价:允许其他用户对自己的oc进行评价,能够查看到别人对自己oc的评价
用户交互(朋友圈):提供用户聊天交友的功能
OC交互:允许用户和其他用户的角色进行交互
OC约稿:提供一个约稿的平台。
OC分享:用户可以上传、展示和分享自己的原创角色(OC)。同时,可以浏览其他OC的设定故事等。
界面清爽简单
不断优化用户体验,定时(如隔三个月或隔一年)提供一个问卷入口,供用户反馈和提出新的需求,进行软件更新和改进。
b.产品原则
安全性:保护用户信息安全;
极致化产品核心业务与服务,可以考虑扩展额外功能;
调研:
1、
在同人社区软件lofter中,oc当前的浏览量为1085万,参与量为178.3万。微博#oc标签的单日阅读量为108.6万,讨论量为261。
而在软件lofter中,与oc相关的标签里,又以#oc交友的标签参与量最多,为5.8万参与量,#oc互动(4.3万参与量)其次,接着分别是#oc约稿和#原创oc。
浏览微博的#oc标签,用户的oc行为主要分为设定角色、 完善角色设定、 世界观设定、 产出作品、 oc社交互动、约稿、用户社交互动。
2、关于oc消费的问卷调查如下
目标群体:
oc爱好者。
具体需求:
OC分享:用户希望能够上传和分享自己的原创角色,也能够去浏览和交互别人的oc。
OC定制:用户期待创造一个有独特外貌、性格、喜好和背景的原创角色。可以考虑在角色设计上加入自己的兴趣爱好或者对现实世界中某些事物的思考。部分用户希望能在平台根据自己的喜好和需求定制免费的原创角色,部分用户期待能够在软件上通过约稿的方式向其他用户进行约稿。
OC改设:就像养孩子一样,用户希望可以为自己的oc置办(置换)衣物等。
大众评价:用户期待能够接收到别人对于自己oc的评价。
OC互动:用户期待能够与其他用户的oc进行交流互动。
用户互动:用户期待能够与其他用户进行交流互动,如培养oc的心得等。
世界观设定:用户期待为原创角色设定一个独特的世界观,包括历史背景、地理环境、政治体系、文化传统等等。这有助于让角色更加真实,有血有肉。
产出作品:用户可以通过绘画、写作、动画等方式产出作品,展示原创角色的形象和故事。
创新点:
oc在创作中扮演着十分重要的角色。它代表着原创的思维,同时允许用户自行发挥创造力,塑造自己理想的角色形象。与之相比,流行形象的权值更为分散,oc没有被既定的角色设定局限,因此可以满足玩家们更多的个性化需求。另外,oc也为用户提供了一种更轻松的方式,使得他们可以轻松地将自己的想象、感受和创意分享给别人。
该软件的创新点一是集成了oc人的约稿、创作、分享、定制、交互等等,二是为oc人提供了一个专用性软件,三是oc广场提供了更倾向于oc之间的交互而不是用户之间的交互,能够帮助用户沉浸式带入oc,以全新的身份进行交友互动,对oc交互和用户交互做了一个区分。
- 产品设计思路
[产品定位]
专门为oc爱好者定制,帮助oc爱好者更轻松的定制、装扮、分享和交流自己的原创角色。希望能够为用户提供一个友好的环境,让他们能够与志同道合的人共同探索和创造独特的角色世界。
[功能导图设计]
商铺购买oc衣物等等可以使用虚拟币交易
3.功能介绍
[选取其中3个具体(特色/核心)功能去进行功能介绍
1商品查询设计说明
1.1功能描述
用户通过关键词筛选出需要的商品
1.2功能
1.3性能
灵活性:窗口响应绝大部分的快捷菜单和控制面板操作。
时间特性:响应鼠标单击的时间在3秒之内。
1.5输人项
组合、模糊查询条件。
1.6输出项
标准的SQL语句,发送设置浏览区命令。
1.7测试计划
测试要点:测试各种组合、模糊查询方式。
- 首页加载功能说明
2.1功能描述
系统推送内容并在首页加载。
21.2功能
通过不同的用户信息,推送不同的首页内容。包括智能推荐和地域推荐,算法筛选内容后,呈现在用户的APP上。
2.3性能
灵活性:用户可以上下滑动,当用户滑动超过10个cell,系统则会分步加载新的内容,直至所有内容都加载完毕。
时间特性:首次加载内容不能消耗超过3秒;二次内容不能消耗超过2秒;在WIFI环境下,二次内容加载不能消耗超过1秒。从最热切换到最新内容,不得消耗超过2秒。
2.4输入项
通过LBS信息输入用户的地理信息,通过获取用户网络状态来决定马上加载还是延迟加载内容,通过输入之前的用户习惯等用户习惯信息。
点击爱心按钮
滑动列表
2.5输出项
首页列表,列表中每个cell内含一张图片和内容的标题,以及加载该用户发布内容被浏览次数和被点赞的次数。
用户发布的内容可以在点赞和未点赞两个状态中切换
列表内容会上下滑动
2.6测试计划
(1)最新栏目更新顺序——期望结果:最新tab内容是根据时间倒序的方式呈现
(2)最热栏目更新顺序——期望结果:最热tab内容是根据24小时内浏览数最高的内容倒序呈现,同时考虑点赞数量。由于早期内容的更新速度比较慢,所以最热tab内容是根据7天内最热的内容排序,如果超过这个时间,必须由运营手动置顶。
(3)下拉刷新——期望结果:下拉可以刷新内容,同时在手机记录最新刷新时间,如果刷新间隔少于120秒,则拒绝刷新。如果刷新时间超过10秒,无法连上服务器,则出现无法响应服务器的提示。
(4)点击底部的Tabbar——期望结果:切换当前页面到对应的页面,同时底部的LOGO和LOGO下面的文字同时切换到选中状态。
- OC对话功能
3.1功能描述
聊天对话
3.2功能
叉掉提示信息后,用户可以在对话框输入文字,并发送给对方,对方也能实时接收并显示这些消息。
3.3性能
实时性:聊天系统应确保消息的实时传输,降低延迟。
稳定性:系统应稳定运行,避免因各种原因导致聊天中断或数据丢失。
安全性:确保用户的消息和数据安全,防止信息泄露和恶意攻击。
3.4输入项
用户输入文字
3.5输出项
对方接收到文字
3.6测试计划
- 用户a在对话框输入“aa”——期望结果:对方收到“aa”
(2)用户b在对话框输入“bb”——期望结果:对方收到“bb”
4Tabbar切换功能说明
4.1功能描述
通过底部Tabbar进行页面进行切换。
4.2功能
在iOS系统下,Tabbar可以进行重要的页面进行切换;同时切换后底部的颜色从默认状态切换到选中状态(Default-On)。在Android系统版本下,由于没有Tabbar,所以通过NavgitionDrawer进行内容切换。
4.3性能
灵活性:iOS系统,用户可以通过点击切换Tabbar。响应时间不得超过0.2秒,同时需要有左右滑动的动画切换。动画时长不得超过0.2秒。
灵活性:Android系统,用户可以通过从左往右的滑动,唤出导航抽屉NavgitionDrawer,进行登录或者切换页面的操作。唤出NavgitionDrawer的时间不得超过0.2秒。
4.4输入项
用户点击底部的Tabbar。
4.5输出项
对应界面切换,同时底部的Tabbar状态切换为选中On。
4.6数据有效性
(1)已经连接网络
4.7测试计划
(1)点击我的按钮——期望结果:如果当前页面不是我的,则切换到我的,同时底部Tabbar切换为选中On。
(2)点击聊天按钮——期望结果:如果当前页面不是聊天页面,则切换到聊天页面,同时底部Tabbar切换为选中On。
[完整原型图]
泳道图
约稿业务流程图
用户支付业务流程图
搜索业务流程图
商铺业务流程图
点赞业务流程图
面试准备策划
版权声明:本文标题:产品测试文档 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1725918953h892667.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论