1.什么是软件测试
软件测试定义:使用人工或者自动手段来运行或测试某个系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。它是帮助识别开发完成(中间或最终的版本)的计算机软(整体或部分)的正确度(correctness) 、完全度(completeness)和质量(quality)的软件过程;是SQA(software quality assurance)的重要子域。
2.b/s和c/s的区别
B/S:
只用浏览器就能使用,浏览器端通过浏览程序(IE等)访问服务器,显示服务器提供的信息
整个系统的事务处理都要由服务器来完成
浏览器起显示的作用。
C/S:
需要下载专用的客户端
客户端的电脑也可以参与整个系统的事务处理
可以处理一些不需要服务器处理的事务
3.操作系统的功能
文件管理、存储管理、设备管理、进程管理
4.什么是网络协议
定义:计算机在网络中实现通讯时必须遵守的规则和约定
分层使复杂的问题能够很好的解决:
每一层相对独立
对等层完成相应功能
下一层为上一层提供服务
5.常见网络分层
TCP/IP 4层
应用层、传输层、网络层、网络接口层
TCP/IP 5层
应用层、传输层、网络层、数据链路层、物理层
OSI 7层
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
6.常见dos命令
dir、cd+路径、cd+. 、 cd+..、cd+\、md、cls、ping ip、start、exit
cd 切换目录
dir 查询目录
md 创建目录
help 帮助信息
cls 清屏
del 删除文件
rd 删除目录
start 开启一个窗口
exit 关闭一个窗口
shutdown 关机
ping ip 查看两台电脑之间是否可以通信
7.写一个批处理脚本
echo:打开回显或关闭请求回显功能,或显示消息
echo off:从下一行开始关闭回显
@echo off:从本行开始关闭回显
pause:暂停,等待按键继续
rem:注释命令,不执行操作
call:调用其他程序
dir:查看文件列表
md:创建文件夹
del:删除文件
右箭头:重定向,将屏幕上的指定内容输入到文件中
shutdown:用于控制关机,包括定时
8.什么是软件的生命周期
软件生命周期(Software Life Cycle,SLC)是软件的产生直到报废或停止使用的生命周期。软件开发的全周期,是从可行性研究到需求分析、软件设计、编码、 测试软件发布维护的全部过程
9.软件开发过程模型有哪些?它的优点和缺点是什么
瀑布模型:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7AeDVegG-1608274825823)(F:\学习\总结\image\img1.png)]
优点:
开发的各个阶段比较清晰。
当前一阶段完成后,只需关注后续阶段。
缺点:
依赖于早期的需求调查,不适应需求的变化
风险往往延至后期才显露,失去及早纠正的机会
前面未发现的错误会传递并扩散到后面的阶段,可能导致项目失败。
增量模型:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mGvYox6E-1608274825826)(F:\学习\总结\image\img2.png)]
概念:增量模型是把待开发的软件系统模块化,将每个模块作为一个增量组件,从而分批次地分析、设计、编码和测试这些增量组件。
优点:
将待开发的软件系统模块化,可以分批次地提交软件产品,使用户可以及时了解软件项目的进展。
以组件为单位进行开发降低了软件开发的风险。一个开发周期内的错误不会影响到整个软件系统
开发顺序灵活。开发人员可以对组件的实现顺序进行优先级排序,先完成需求稳定的核心组件。当组件的优先级发生变化时,还能及时地对实现顺序进行调整。
缺点:
要求待开发的软件系统可以被模块化。如果待开发的软件系统很难被模块化,那么将会给增量开发带来很多麻烦。
敏捷模型:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hYAR9lGS-1608274825828)(F:\学习\文档\软件测试截图\3测试工程师必须要知道的开发模式–敏捷开发.png)]
概念:
敏捷的含义是快速的或通用的。”敏捷过程模型”是指基于迭代开发的软件开发方法。敏捷方法将任务分解为较小的迭代, 或者部分不直接涉及长期计划。在开发过程的开始就确定了项目范围和要求。事先明确定义了有关迭代次数, 每次迭代的持续时间和范围的计划。
每次迭代都被视为敏捷流程模型中的短时间”框架”, 通常持续一到四个星期。将整个项目分成较小的部分有助于最大程度地降低项目风险, 并减少总体项目交付时间要求。每次迭代都涉及一个团队, 在整个软件开发生命周期中进行工作, 包括计划, 需求分析, 设计, 编码和测试, 然后再向客户展示有效产品。
敏捷四个核心价值观:
个人与互动超越流程和工具、工作良好的软件超越文档、客户合作超越合同谈判、响应变更超越计划
敏捷模型阶段:
需求收集、设计需求、构建/迭代、测试/质量保证、部署方式、反馈
敏捷测试方法:
Scrum、水晶、动态软件开发方法(DSDM)、功能驱动开发(FDD)、精益软件开发、极限编程(XP)
敏捷方法的优点:
1. 频繁交货
2. 与客户面对面的交流。
3. 高效的设计并满足业务需求。
4. 随时可以接受更改。
5. 它减少了总的开发时间。
敏捷模型的缺点:
1. 由于缺少正式文件, 因此会造成混乱, 并且各个团队成员随时可能会误解贯穿各个阶段做出的重要决定。
2. 由于缺乏适当的文档, 一旦项目完成并且开发人员被分配到另一个项目, 完成的项目的维护就会变得很困难。
扩展:
(1)Scrum
SCRUM是一个敏捷开发过程, 主要关注在基于团队的开发条件下管理任务的方式。
其中有三个角色, 它们的职责是:
Scrum Master:Scrum可以组建Master团队, 安排会议并消除流程中的障碍
产品负责人:产品负责人进行产品积压, 确定延迟的优先级, 并负责每次重复的功能分配。
Scrum团队:该团队管理其工作并组织工作以完成冲刺或周期。
(2)极限编程(XP)
当客户不断变化的需求或要求或不确定系统性能时, 可以使用这种方法。
(3)水晶:
此方法有三个概念-
包机:此阶段涉及多项活动, 例如组建开发团队, 进行可行性分析, 制定计划等。
循环交付:在此之下, 又包括两个周期, 分别是:
团队更新发布计划。
集成产品交付给用户。
总结:根据用户环境, 此阶段执行部署, 部署后。
(4)动态软件开发方法(DSDM):
DSDM是用于软件开发的快速应用程序开发策略, 并提供了敏捷的项目分发结构。 DSDM的基本功能是必须积极地联系用户, 并且已赋予团队制定决策的权利。 DSDM中使用的技术是:
时间拳击
MoSCoW规则
原型制作
DSDM项目包含七个阶段:
前期项目
可行性研究
商业研究
功能模型迭代
设计和构建迭代
实作
项目后
(5)功能驱动开发(FDD):
此方法侧重于”设计和构建”功能。与其他智能方法相比, FDD描述了每个功能应分别获得的工作的小步骤。
(6)精益软件开发:
精益软件开发方法遵循”准时生产”的原则。精益方法表明软件开发的速度不断提高, 并且降低了成本。精益开发可以分为七个阶段。
消除浪费
加强学习
推迟承诺(尽早决定)
提早交货
赋予团队权力
建筑诚信
优化整体
何时使用敏捷模型?
需要频繁更改时。
有一支高素质和经验丰富的团队。
当客户准备好一直与软件团队开会时。
当项目规模较小时。
10.软件测试过程模型有哪些 ?它的优点和缺点是什么
V模型:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4YHLAM3W-1608274825832)(F:\学习\总结\image\3.png)]
V模型中,测试过程被夹在开发过程的后半部分
单元测试所检测代码的开发是否符合详细设计的要求。
集成测试所检测此前测试过的各组成部分是否能完好地结合到一起
系统测试所检测已集成在一起的产品是否符合系统规格说明书的要求
验收测试则检测产品是否符合最终用户的需求
优点:
测试V模型即包含了底层测试又包含了高层测试
a.底层测试:检验源代码质量的测试 单元测试
b.高层测试:检验整个系统的需求,如系统测试
(1)V模型清楚地标识出了软件开发的阶段
(2)它采用自顶向下逐步求精的方式把整个开发过程分成不同的阶段,每个阶段的工作都很明确,因此便于控制开发过程
缺点:
(1)V模型一大缺点正是它自身的顺序性所导致的。到了测试阶段,程序已经完成,错误已经产生,很多前期的错误一直到测试阶段才发现,往往无从修改了。
(2)同时实际的开发过程中,在需求阶段很难把用户的需求完全明确下来,因此,当需求变更时将会导致阶段反复,而且都要重复需求、设计、编码、测试等过程,返工量非常大,模型灵活性比较低。
W模型:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5SPEEtw2-1608274825834)(F:\学习\总结\image\img4.png)]
特点1:
测试伴随整个软件开发周期
测试的对象不仅仅是程序,需求、设计等同样要测试
测试与开发是同步进行的
特点2:
需求、设计、编码等活动被视为串行的
测试和开发活动也保持着一种线性的前后关系,上一阶段完全结束,才可正式开始下一个阶段工作。
优点:
W模型有利于尽早地全面的发现问题,有利于降低开发成本
缺点:
无法支持迭代的开发模型
对于当前软件开发复杂多变的情况,W模型并不能解除测试管理面临着困惑。
H模型:
相对于V模型和W模型,H模型将测试活动完全独立出来,形成了一个完全独立的流程,将测试准备活动和测试执行活动清晰地体现出来。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bKnzdlaF-1608274825836)(F:\学习\总结\image\5.png)]
优点
开发的H模型揭示了软件测试除测试执行外,还有很多工作;
软件测试完全独立,贯穿整个生命周期,且与其他流程并发进行;
软件测试活动可以尽早准备、尽早执行,具有很强的灵活性;
软件测试可以根据被测物的不同而分层次、分阶段、分次序的执行,同时也是可以被迭代的。
缺点
管理型要求高:由于模型很灵活,必须要定义清晰的规则和管理制度,否则测试过程将非常难以管理和控制;
技能要求高:H模型要求能够很好的定义每个迭代的规模,不能太大也不能太小;
测试就绪点分析困难:测试很多时候,你并不知道测试准备到什么时候是合适的,就绪点在哪里,就绪点的标准是什么,这就对后续的测试执行的启动带来很大困难;
对于整个项目组的人员要求非常高:在很好的规范制度下,大家都能高效的工作,否则容易混乱。例如:你分了一个小的迭代,但是因为人员技能不足,使得无法有效完成,那么整个项目就会受到很大的干扰。
11.软件测试的目的是什么?
验证产品是否符合用户需求
提高用户的体验(用户角度来测试系统)
用户角度:舒适度、流畅、流程简单、易用性、操作习惯)
确保产品完成了它所承诺或公布的功能
确保产品满足性能和效率的要求
确保产品是健壮的,适应用户环境的
12.软件测试的工作流程 ? *** 测试的原则?
原则:
1.有计划的尽早测试,解决问题的成本越小。
2.成功的测试在于发现迄今未发现的缺陷。
3.测试并不能保证软件100%的没有问题。
4.测试工作的本质都应追溯到用户需求。
5.测试的规模由小而大,从单元测试到系统测试。
6.Good-enough原则,穷举测试是不可能实现的。
自己编写的工作流程:
公司是做英语教育的,产品经理进行需求调研,需求评审后,开始立项,与项目经理、开发进行讨论、确定项目需求说明书,开发进行代码编写,测试经理拿到项目需求,分析后编写测试计划,分配任务给测试工程师,测试工程师编写测试用例 ,测试组内人员与开发进行测试用例评审,执行测试用例,在禅道提交BUG,指派给开发,开发确认并修复BUG,再次回归测试2-3轮没问题,项目上线,上线后在进行生产环境全面功能测试后没有BUG最后写测试总结报告
工作流程:
1.需求分析在测试前拿到产品需求文档,进行需求分析及需求评审前先对需求文档进行详细的阅读,对有疑问的地方进行标注。具体可从以下进行:
a.分析产品功能点
b.产品核心竞争力
c.Kano模型、马斯洛需求分析、多问几个为什么、上下文分析法
2.制订测试用例工欲善其事,必先利其器;对测试而言,测试用例就是器,做好了才能把好关
a.使用思维导图列举测试大纲,尽量发散,想到什么就写什么,;先放后收,对知识点进行总结和归纳,标记重点测试模块,删除冗余及重复测试点。
b.可使用边界值法、等价类划分法、错误推测法、因果图法等设计案例
c.根据测试大纲制定测试用例,需包含模块名、测试优先级、操作步骤、期望结果、测试结果、备注
3.评审测试用例
a.测试作为主导,联合开发、项目经理、PM进行测试用例评审
b.可先讲解测试大纲,让开发、项目经理、PM心中对测试用例有个大概;后再进行详细测试用例讲解
4.执行测试
a.根据测试用例执行测试
b.发现问题保留现场,记录测试方法,通知开发解决问题
c.覆盖测试用例之外若有时间可进行探索性测试
5.提交Bug并推动Bug解决
a.在Bug管理工具上提交Bug,详细记录测试步骤
b.根据Bug严重程度划分Bug等级:致命、严重、一般、提示
c.推动开发解决问题,记录问题进展,一般聊天沟通,若问题严重则需通过邮件推动解决
6.回归测试
a.对已修复的Bug进行验证
b.对Bug所在模块进行基本功能测试;整体进行冒烟测试,确保不会因为修改Bug而引起其他功能出现问题
7.编写并提交测试报告可使用金字塔原理设计测试报告,先总后分,上级统领下级,下级推导出上级,环环相扣
a.对Bug进行汇总,筛选出各个等级的Bug存活情况
b.制订Bug发现及解决曲线图,一般版本正常应是前期多,后期收敛,存活的是级别较低的Bug
c.总结归纳版本情况,评估发布与否
13.参与需求评审的人员都有哪些?
需求评审:产品需求人员、开发人员、测试人员
评审职责:
产品人员提出需求,对需求进行讲解
开发人员考虑功能实现的方案与可行性
测试人员主要是对需求的理解提出疑问,以便准确理解需求,根据需求写用例
测试用例评审的主要内容?
1、测试用例是否按照公司定义的模板进行编写的。
2、测试用例的本身的描述是否清晰,是否存在二义性。
3、测试用例内容是否正确,是否与需求目标一致。
4、测试用例的期望结果是否确定、唯一的。
5、操作步骤应与描述是否一致。
6、测试用例是否覆盖了所有的需求。
7、测试设计是否存在冗余性。
8、测试用例是否具有可执行性。
9、是否从用户层面来设计用户使用场景和业务流程的测试用例。
10、场景测试用例是否覆盖最复杂的业务流程。
11、用例设计是否包含了正面、反面的用例。
12、对于由系统自动生成的输出项是否注明了生成规则。
13、测试用例应包含对中间和后台数据的检查。
14、测试用例应有正确的名称、编号、执行的优先级。
15、测试用例包含相关的配置信息:测试环境、数据、前置测试用例、用户授权等。
16、每个测试用例步骤应<=15 Step。
17、非功能测试需求或不可测试需求是否在用例中列出并说明
14.测试计划里有哪些内容?
内容:
(1)标题、版本信息、测试计划各模块目录、文档目的和阅读人群
(2)测试时间安排、测试人员的分工
(3)测试过程的准入准出标准
(4)测试中需要用到的测试工具和版本号及运行平台、兼容哪些方面
(5)测试环境的说明、风险控制
测试计划:项目简介、项目背景、测试目的、测试范围、测试参考文档、测试提交文档、测试工具、缺陷严重级别、测试环境、测试进度安排、测试方法、测试风险
测试报告:测试情况、遗留缺陷、测试统计、测试评价、测试总结、测试记录
经验:
每个版本需要进行不同测试方法和工作量
(1)对于新产品,测试时首先要验证主功能(冒烟测试),主要能走通以后要进行全面测试,功能点都验证通过后再考虑兼容性测试。
(2)对于迭代产品,首先要测试的是新增功能和该版本的缺陷修复,然后是主要功能。
15.1测试用例里有哪些内容?作用
内容:
用例编号、用例标题、预置条件、执行步骤、输入数据、预期结果、实际结果、缺陷编号、测试人、测试时间
作用:
解决测什么,怎么测,如何衡量的问题
为了有思路不冗余的测试一款产品
通过执行测试用例,使产品达到设定的需求,以及尽量满足用户需求
注意事项:设计用例时一定要思路清晰、描述清晰、使用因果图、等价类、边界值、错误猜测、场景法等方法设计,提高覆盖率,避免冗余,提升工作效率。
好的测试用例可以让我们发现尽可能多的bug,从而改善产品的质量。
⒈指导测试的实施
⒉规划测试数据的准备
⒊编写测试脚本的"设计规格说明书"
⒋评估测试结果的度量基准
⒌分析缺陷的标准
15.2执行测试过程中需要注意的事项
1、精确定位BUG,即逐个排除环境问题、操作问题,确认BUG确实存在,排除自己疏忽或操作不正确造成的“假缺陷”。
2、能够清晰描述出所遇到问题的情况,并且将在不同状况下是否会遇到同样的问题,准确描述给开发。
3、规范bug报告内容,逻辑清晰,简单明了,不对bug做评价。及时和开发做沟通,了解修改BUG的进度。
4、需求没有明确说明的缺陷,跟产品经理进行确认,不要跟开发争辩。
5、某一缺陷优先级、严重性等,开发和测试都无法说服对方,向上反馈或找产品经理确认。
6、不要为了引起开发人员的重视而夸大缺陷
7、小的缺陷也要报告
8、及时报告缺陷
9、不可重现的bug也要报告
16.参考文档有哪些?英文名字是什么?
需求文档
用户手册
开发文档
SRS:需求分析文档;
HLD:概要设计文档;
LLD:详细设计文档;
单元测试 参照 详细设计说明说(LLD)
集成测试 参照 概要设计说明书(HLD)
系统测试 参照 需求规格说明说(SRS)
BD:基本设计;
DD:详细设计;
FD:结构设计;
17.什么是软件缺陷?判断缺陷的原则?缺陷报告组成
软件缺陷(Defect) 常常叫做BUG,可以理解为软件中存在的各种问题,包括
计算机软件或程序中存在的任何一种破坏正常运行能力的问题、错误
隐藏的功能缺陷、瑕疵
判断缺陷的原则:
软件未达到产品说明书标明的功能
软件出现了产品说明书指明不会出现的错误
软件功能超出产品说明书指明范围
软件未到达产品说明书虽未指出但应达到的目标
软件测试员认为软件难以理解、不易使用、运行速度缓慢、或者最终用户认为不好
缺陷报告组成:
缺陷编号、缺陷标题、缺陷描述、缺陷的优先级、缺陷的重要程度、缺陷所述的模块、缺陷所属的版本、缺陷所属的开发人员、输入数据、输出结果、缺陷分析等
缺陷产生的原因:
1、软件本身;
a.需求不清晰,导致设计目标偏离客户的需求,从而引起功能或产品特征上的缺陷。
b.系统结构非常复杂。
c.对程序逻辑路径或数据范围的边界考虑不够周全,漏掉某些边界条件,造成容量或边界错误。
d.对一些实时应用,时间同步问题。
e.系统运行环境的复杂。
f.由于通信端口多、存取和加密手段的矛盾性等,会造成系统的安全性或适用性等问题。
g.新技术的采用,可能涉及技术或系统兼容的问题,事先没有考虑到。
2、团队工作;
a.系统需求分析时对客户的需求理解不清楚,或者和用户的沟通存在一些困难。
b.不同阶段的开发人员相互理解不一致。
c.对于设计或编程上的一些假定或依赖性,相关人员没有充分沟通。
d.项目组成员技术水平参差不齐,新员工较多,或培训不够等原因也容易引起问题。
3、技术问题;
a、算法错误
b、语法错误
c、计算和精度问题
d、系统结构不合理、算法选择不科学,造成系统性能低下。
e、接口参数传递不匹配,导致模块集成出现问题。
4、缺陷管理问题。
a、缺乏质量文化,不重视质量计划,容易挤掉需求分析、评审、测试、等时间,遗留的缺陷会比较多。
b、系统分析时对客户的需求不是十分清楚,或者和用户的沟通存在一些困难。
c、开发周期短,各类开发人员造成太大的压力,引起一些人为的错误。
d、开发流程不够完善,存在太多的随机性和缺乏严谨的内审或评审机制,容易产生问题。
e、文档不完善,风险估计不足等。
软件缺陷分类:
一、系统缺陷:
1.由于程序所引起的死机,异常退出
2.程序死循环
3.程序错误,不能执行正常工作或重要功能,使系统崩溃或资源不足
备注:不能执行正常工作或重要功能,使系统崩溃或资源不足
二、数据缺陷:
1.数据计算错误
2.数据约束错误
3.数据输入、输出错误
备注:严重地影响系统要求或基本功能的实现,且没有办法更正(重新安装或重新岂不更正方法)
三、数据库缺陷:
1.数据库发生死锁
2.数据库的表、缺省值未加约束条件
3.数据库连接错误
4.数据库中的表有过多的空字段
四、接口缺陷:
1.数据通信错误
2.程序接口错误
五、功能缺陷:
1.功能无法实现
2.功能实现错误
六、安全性错误:
1.用户权限无法实现
2.超时限制错误
3.访问控制错误
4.加密错误
七、兼容性缺陷:
与需求规定配置兼容性不符合
八、性能缺陷:
1.未达到预期的性能目标
2.性能测试中出错,导致无法继续进行测试
九、界面缺陷:
1.操作界面错误
2.打印内容、格式错误
3.删除操作未给出提示
4.长时间操作未给出提示
5.界面不规范
备注:操作者不方便或遇到麻烦,但不影响执行工作功能的实现
十、建议:
1.功能建议
2.操作建议
备注:建议性的改进要求
复现步骤正确书写方式:
提供测试的环境信息
简单地一步步引导复现该缺陷,一个步骤包含的操作不要多
每个步骤前使用数字对步骤编号
尽量使用短语或短句,比面复杂句型句式
复现的步骤要完整、准确、简短
讲常见步骤合并为较少步骤
按实际需求决定是否包含步骤执行后的结果
18.bug的处理流程,禅道BUG处理内容
新建(new)-是否是bug-确认(confirmed)-是否延期-延期-回归测试
新建(new)-是否是bug-不是bug-拒绝
新建-是否是bug-确认-是否延期-不延期-是否解决-已解决-回归测试-回归通过-关闭bug
新建-是否是bug-确认-是否延期-不延期-是否解决-已解决-回归测试-回归不通过-重新打开bug
主要内容:缺陷标题、复现步骤、严重级别、优先级、截图、日志、视频等
禅道BUG处理内容:
bug标题、bug描述、优先级、严重级别、附件、关键词、提交人、bug状态、所属项目、影响版本、当前指派,系统、浏览器、抄送给、相关需求、相关任务、所属模块
19.bug的状态
状态:新建(New)、打回(FeedBack)、已确认(Confirmed)、拒绝(Rejected)、延期(Postponed)、已分派(Assigned)、重新打开(Reopen)、已解决(Fixed)、已关闭(Closed)
20.bug的严重级别
严重级别:宕机(Block)、严重(Major)、一般(normal)、小错误(Minor)、建议(Enhance-mental)
21.bug的优先级
严重程度:特急(Immediate)、加急(Urgent)、高(High)、中(Medium)、低(Low)
22.测试报告的内容?
(1)标题、版本信息、测试报告各模块目录、文档目的和阅读人群
(2)项目概述、术语和缩略语、参考和引用的文档
(3)测试情况,测试机构和遗留缺陷
(4)测试统计表和模块统计图
(5)测试评价,测试总结,测试记录
23.软件测试的分类?和测试方法
按是否运行程序划分:
静态测试、动态测试
按阶段划分:
单元测试、集成测试、系统测试
验收测试:
a测试 b测试 y测试
β测试_Beta测试
β测试,英文是Beta testing。又称Beta测试,用户验收测试(UAT)。β测试是软件的多个用户在一个或多个用户的实际使用环境下进行的测试。开发者通常不在测试现场,Beta测试不能由程序员或测试员完成。当开发和测试根本完成时所做的测试,而最终的错误和问题需要在最终发行前找到。这种测试一般由最终用户或其他人员员完成,不能由程序员或测试员完成。
α测试_Alpha测试
α测试,英文是Alpha testing。又称Alpha测试。Alpha测试是由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的受控测试,Alpha测试不能由该系统的程序员或测试员完成。在系统开发接近完成时对应用系统的测试;测试后,仍然会有少量的设计变更。这种测试一般由最终用户或其他人员来完成,不能由程序员或测试员完成。
可移植性测试
可移植性测试,英文是Portability testing。又称兼容性测试。可移植性测试是指测试软件是否可以被成功移植到指定的硬件或软件平台上。
用户界面测试-UI测试
用户界面测试,英文是User interface testing。又称UI测试。
用户界面,英文是User interface。是指软件中的可见外观及其底层与用户交互的部分(菜单、对话框、窗口和其它控件)。
用户界面测试是指测试用户界面的风格是否满足客户要求,文字是否正确,页面是否美观,文字,图片组合是否完美,操作是否友好等等。UI 测试的目标是确保用户界面会通过测试对象的功能来为用户提供相应的访问或浏览功能。确保用户界面符合公司或行业的标准。包括用户友好性、人性化、易操作性测试。
用户界面测试用户分析软件用户界面的设计是否合乎用户期望或要求。它常常包括菜单,对话框及对话框上所有按钮,文字,出错提示,帮助信息 (Menu 和Help content)等方面的测试。比如,测试Microsoft Excel中插入符号功能所用的对话框的大小,所有按钮是否对齐,字符串字体大小,出错信息内容和字体大小,工具栏位置/图标等等。
冒烟测试
冒烟测试,英文是Smoke testing。冒烟测试的名称可以理解为该种测试耗时短,仅用一袋烟功夫足够了。也有人认为是形象地类比新电路板功基本功能检查。任何新电路板焊好后,先通电检查,如果存在设计缺陷,电路板可能会短路,板子冒烟了。冒烟测试的对象是每一个新编译的需要正式测试的软件版本,目的是确认软件基本功能正常,可以进行后续的正式测试工作。冒烟测试的执行者是版本编译人员。
随机测试
随机测试,英文是Ad hoc testing。随机测试没有书面测试用例、记录期望结果、检查列表、脚本或指令的测试。主要是根据测试者的经验对软件进行功能和性能抽查。随机测试是根据测试说明书执行用例测试的重要补充手段,是保证测试覆盖完整性的有效方式和过程。随机测试主要是对被测软件的一些重要功能进行复测,也包括测试那些当前的测试样例(TestCase)没有覆盖到的部分。另外,对于软件更新和新增加的功能要重点测试。重点对一些特殊点情况点、特殊的使用环境、并发性、进行检查。尤其对以前测试发现的重大Bug,进行再次测试,可以结合回归测试 (Regressive testing)一起进行。
本地化测试
本地化测试,英文是Localization testing。本地化就是将软件版本语言进行更改,比如将英文的windows改成中文的windows就是本地化。本地化测试的对象是软件的本地化版本。本地化测试的目的是测试特定目标区域设置的软件本地化质量。本地化测试的环境是在本地化的操作系统上安装本地化的软件。从测试方法上可以分为基本功能测试,安装/卸载测试,当地区域的软硬件兼容性测试。测试的内容主要包括软件本地化后的界面布局和软件翻译的语言质量,包含软件、文档和联机帮助等部分。
本地化能力测试
本地化能力测试,英文是Localizability testing。本地化能力测试是指不需要重新设计或修改代码,将程序的用户界面翻译成任何目标语言的能力。为了降低本地化能力测试的成本,提高测试效率,本地化能力侧是通常在软件的伪本地化版本上进行。本地化能力测试中发现的典型错误包括:字符的硬编码(即软件中需要本地化的字符写在了代码内部),对需要本地化的字符长度设置了国定值,在软件运行时以控件位置定位,图标和位图中包含了需要本地化的文本,软件的用户界面与文档术语不一致等。
国际化测试
国际化测试,英文是International testing。又称国际化支持测试。
国际化测试的目的是测试软件的国际化支持能力,发现软件的国际化的潜在问题,保证软件在世界不同区域都能正常运行。国际化测试使用每种可能的国际输入类型,针对任何区域性或区域设置检查产品的功能是否正常,软件国际化测试的重点在于执行国际字符串的输入/输出功能。国际化测试数据必须包含东亚语言、德语、复杂脚本字符和英语(可选)的混合字符。国际化支持测试是指验证软件程序在不同国家或区域的平台上也能够如预期的那样运行,而且还可以按照原设计尊重和支持使用当地常用的日期,字体,文字表示,特殊格式等等。比如,用英文版的 Windows XP 和 Microsoft Word 能否展示阿拉伯字符串?用阿拉伯版的 Windows XP 和 阿拉伯版的Microsoft Word 能否展示阿拉伯字符串?又比如,日文版的Microsoft Excel对话框是否显示正确翻译的日语?一旦来说执行国际化支持测试的测试人员往往需要基本上了解这些国家或地区的语言要求和期望行为是什么。
安装测试
安装测试,英文是Installing testing。
安装测试是确保软件在正常情况和异常情况下,例如,进行首次安装、升级、完整的或自定义的安装都能进行安装的测试。异常情况包括磁盘空间不足、缺少目录创建权限等场景。核实软件在安装后可立即正常运行。安装测试包括测试安装代码以及安装手册。安装手册提供如何进行安装,安装代码提供安装一些程序能够运行的基础数据。
白盒测试-结构测试-逻辑驱动测试
白盒测试,英文是White Box Testing。又称结构测试或者逻辑驱动测试。白盒测试是把测试对象看作一个打开的盒子。利用白盒测试法进行动态测试时,需要测试软件产品的内部结构和处理过程,不需测试软件产品的功能。白盒测试法的覆盖标准有逻辑覆盖、循环覆盖和基本路径测试。其中逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。白盒测试是知道产品内部工作过程,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作,而不顾它的功能,白盒测试的主要方法有逻辑驱动、基路测试等,主要用于软件验证。白盒测试常用工具有:Jtest、VcSmith、Jcontract、C++ Test、CodeWizard、logiscope。
黑盒测试-功能测试-数据驱动测试
黑盒测试,英文是Black Box Testing。又称功能测试或者数据驱动测试。黑盒测试是根据软件的规格对软件进行的测试,这类测试不考虑软件内部的运作原理,因此软件对用户来说就像一个黑盒子。软件测试人员以用户的角度,通过各种输入和观察软件的各种输出结果来发现软件存在的缺陷,而不关心程序具体如何实现的一种软件测试方法。
黑盒测试常用工具有:AutoRunner、winrunner、loadrunner。
自动化测试
自动化测试,英文是Automated Testing。
使用自动化测试工具来进行测试,这类测试一般不需要人干预,通常在GUI、性能等测试和功能测试中用得较多。通过录制测试脚本,然后执行这个测试脚本来实现测试过程的自动化。国内领先的自动化测试服务提供商是泽众软件。自动化测试工具有AutoRunner和TAR等。
回归测试*
回归测试,英文是Regression testing。
回归测试是指在发生修改之后重新测试先前的测试以保证修改的正确性。理论上,软件产生新版本,都需要进行回归测试,验证以前发现和修复的错误是否在新软件版本上再次出现。根据修复好了的缺陷再重新进行测试。回归测试的目的在于验证以前出现过但已经修复好的缺陷不再重新出现。一般指对某已知修正的缺陷再次围绕它原来出现时的步骤重新测试。通常确定所需的再测试的范围时是比较困难的,特别当临近产品发布日期时。因为为了修正某缺陷时必需更改源代码,因而就有可能影响这部分源代码所控制的功能。所以在验证修好的缺陷时不仅要服从缺陷原来出现时的步骤重新测试,而且还要测试有可能受影响的所有功能。因此应当鼓励对所有回归测试用例进行自动化测试。
验收测试*
验收测试,英文是Acceptance testing。验收测试是指系统开发生命周期方法论的一个阶段,这时相关的用户或独立测试人员根据测试计划和结果对系统进行测试和接收。它让系统用户决定是否接收系统。它是一项确定产品是否能够满足合同或用户所规定需求的测试。验收测试一般有三种策略:正式验收、非正式验收活Alpha 测试、Beta 测试。
动态测试
动态测试,英文是Moment Testing。
动态测试是指通过运行软件来检验软件的动态行为和运行结果的正确性。根据动态测试在软件开发过程中所处的阶段和作用,动态测试可分为如下几个步骤:
1、单元测试
2、集成测试
3、系统测试
4、验收测试
5、回归测试
探索测试
探索测试,英文是Exploratory Testing。探索测试是指通常用于没有产品说明书的测试,这需要把软件当作产品说明书来看待,分步骤逐项探索软件特性,记录软件执行情况,详细描述功能,综合利用静态和动态技术来进行测试。探索测试人员只靠智能、洞察力和经验来对bug的位置进行判断,所以探索测试又被称为自由形式测试。
单元测试
单元测试,英文是Unit Testing。单元测试是最微小规模的测试;以测试某个功能或代码块。典型地由程序员而非测试员来做,因为它需要知道内部程序设计和编码的细节知识。这个工作不容易做好,除非应用系统有一个设计很好的体系结构; 还可能需要开发测试驱动器模块或测试套具。
集成测试*
集成测试,英文是Integration Testing。
集成测试是指一个应用系统的各个部件的联合测试,以决定他们能否在一起共同工作并没有冲突。部件可以是代码块、独立的应用、网络上的客户端或服务器端程序。这种类型的测试尤其与客户服务器和分布式系统有关。一般集成测试以前,单元测试需要完成。集成测试是单元测试的逻辑扩展。它的最简单的形式是:两个已经测试过的单元组合成一个组件,并且测试它们之间的接口。从这一层意义上讲,组件是指多个单元的集成聚合。在现实方案中,许多单元组合成组件,而这些组件又聚合成程序的更大部分。方法是测试片段的组合,并最终扩展进程,将您的模块与其他组的模块一起测试。最后,将构成进程的所有模块一起测试。此外,如果程序由多个进程组成,应该成对测试它们,而不是同时测试所有进程。集成测试识别组合单元时出现的问题。通过使用要求在组合单元前测试每个单元,并确保每个单元的生存能力的测试计划,可以知道在组合单元时所发现的任何错误很可能与单元之间的接口有关。这种方法将可能发生的情况数量减少到更简单的分析级别。
系统测试
系统测试,英文是System Testing。
系统测试是基于系统整体需求说明书的黑盒类测试,应覆盖系统所有联合的部件。系统测试是针对整个产品系统进行的测试,目的是验证系统是否满足了需求规格的定义,找出与需求规格不相符合或与之矛盾的地方。系统测试的对象不仅仅包括需要测试的产品系统的软件,还要包含软件所依赖的硬件、外设甚至包括某些数据、某些支持软件及其接口等。因此,必须将系统中的软件与各种依赖的资源结合起来,在系统实际运行环境下来进行测试。
端到端测试
端到端测试,英文是End to End Testing。
端到端测试类似于系统测试,测试级的“宏大”的端点,涉及整个应用系统环境在一个现实世界使用时的模拟情形的所有测试。例如与数据库对话,用网络通讯,或与外部硬件、应用系统或适当的系统对话。端到端架构测试包含所有访问点的功能测试及性能测试。端到端架构测试实质上是一种"灰盒"测试,一种集合了白盒测试和黑盒测试的优点的测试方法。
健全测试
健全测试,英文是Sanity testing。
健全测试是指一个初始化的测试工作,以决定一个新的软件版本测试是否足以执行下一步大的测试努力。例如,如果一个新版软件每5分钟与系统冲突,使系统陷于泥潭,说明该软件不够“健全”,目前不具备进一步测试的条件。
衰竭测试
衰竭测试,英文是Failure Testing。衰竭测试是指软件或环境的修复或更正后的“再测试”。可能很难确定需要多少遍再次测试。尤其在接近开发周期结束时。自动测试工具对这类测试尤其有用。
接受测试
接受测试,英文是Accept Testing。接受测试是基于客户或最终用户的规格书的最终测试,或基于用户一段时间的使用后,看软件是否满足客户要求。一般从功能、用户界面、性能、业务关联性进行测试。
负载测试
负载测试,英文是Load testing。负载测试是测试一个应用在重负荷下的表现。例如测试一个 Web 站点在大量的负荷下,何时系统的响应会退化或失败,以发现设计上的错误或验证系统的负载能力。在这种测试中,将使测试对象承担不同的工作量,以评测和评估测试对象在不同工作量条件下的性能行为,以及持续正常运行的能力。负载测试的目标是确定并确保系统在超出最大预期工作量的情况下仍能正常运行。此外,负载测试还要评估性能特征,例如,响应时间、事务处理速率和其他与时间相关的方面。
强迫测试
强迫测试,英文是Force Testing。强迫测试是在交替进行负荷和性能测试时常用的术语。也用于描述象在异乎寻常的重载下的系统功能测试之类的测试,如某个动作或输入大量的重复,大量数据的输入,对一个数据库系统大量的复杂查询等。\
压力测试
压力测试,英文是Stress Testing。和负载测试差不多。
压力测试是一种基本的质量保证行为,它是每个重要软件测试工作的一部分。压力测试的基本思路很简单:不是在常规条件下运行手动或自动测试,而是在计算机数量较少或系统资源匮乏的条件下运行测试。通常要进行压力测试的资源包括内部内存、CPU 可用性、磁盘空间和网络带宽等。一般用并发来做压力测试。
性能测试
性能测试,英文是Performance Testing。性能测试是在交替进行负荷和强迫测试时常用的术语。理想的“性能测试”(和其他类型的测试)应在需求文档或质量保证、测试计划中定义。性能测试一般包括负载测试和压力测试。通常验证软件的性能在正常环境和系统条件下重复使用是否还能满足性能指标。或者执行同样任务时新版本不比旧版本慢。一般还检查系统记忆容量在运行程序时会不会流失(memory leak)。比如,验证程序保存一个巨大的文件新版本不比旧版本慢。
可用性测试
可用性测试,英文是Practical Usability Testing。可用性测试是对“用户友好性”的测试。显然这是主观的,且将取决于目标最终用户或客户。用户面谈、调查、用户对话的录象和其他一些技术都可使用。程序员和测试员通常都不宜作可用性测试员。
卸载测试
卸载测试,英文是Uninstall Testing。卸载测试是对软件的全部、部分或升级卸载处理过程的测试。主要是测试软件能否卸载,卸载是否干净,对系统有无更改,在系统中的残留与后来的生成文件如何处理等。还有原来更改的系统值是否修改回去。
恢复测试
恢复测试,英文是Recovery testing。恢复测试是测试一个系统从如下灾难中能否很好地恢复,如遇到系统崩溃、硬件损坏或其他灾难性问题。恢复测试指通过人为的让软件(或者硬件)出现故障来检测系统是否能正确的恢复,通常关注恢复所需的时间以及恢复的程度。恢复测试主要检查系统的容错能力。当系统出错时,能否在指定时间间隔内修正错误并重新启动系统。恢复测试首先要采用各种办法强迫系统失败,然后验证系统是否能尽快恢复。对于自动恢复需验证重新初始化(reinitialization)、检查点(checkpointing mechanisms)、数据恢复(data recovery)和重新启动 (restart)等机制的正确性;对于人工干预的恢复系统,还需估测平均修复时间,确定其是否在可接受的范围内。
安全测试
安全测试,英文是Security Testing。安全测试是测试系统在防止非授权的内部或外部用户的访问或故意破坏等情况时怎么样。这可能需要复杂的测试技术。安全测试检查系统对非法侵入的防范能力。安全测试期间,测试人员假扮非法入侵者,采用各种办法试图突破防线。例如:①想方设法截取或破译口令;②专门定做软件破坏系统的保护机制;
③故意导致系统失败,企图趁恢复之机非法进入;④试图通过浏览非保密数据,推导所需信息,等等。理论上讲,只要有足够的时间和资源,没有不可进入的系统。因此系统安全设计的准则是,使非法侵入的代价超过被保护信息的价值。此时非法侵入者已无利可图。
兼容性测试
兼容测试,英文是Compatibility Testing。兼容测试是测试软件在一个特定的硬件/软件/操作系统/网络等环境下的性能如何。向上兼容向下兼容,软件兼容硬件兼容。软件的兼容性有很多需要考虑的地方。
比较测试
比较测试,英文是Compare Testing。比较测试是指与竞争伙伴的产品的比较测试,如软件的弱点、优点或实力。来取长补短,以增强产品的竞争力。
可接受性测试
可接受性测试,英文是Acceptability Testing。可接受性测试是在把测试的版本交付测试部门大范围测试以前进行的对最基本功能的简单测试。因为在把测试的版本交付测试部门大范围测试以前应该先验证该版本对于所测试的功能基本上比较稳定。必须满足一些最低要求。比如不会很容易程序就挂起或崩溃。如果一个新版本没通过可测试性的验证,就应该阻拦测试部门花时间在该测试版本上测试。同时还要找到造成该版本不稳定的主要缺陷并督促尽快加以修正。
边界条件测试
边界条件测试,英文是Boudary Testing。又称边界值测试。一种黑盒测试方法,适度等价类分析方法的一种补充,由长期的测试工作经验得知,大量的错误是发生在输入或输出的边界上。因此针对各种边界情况设计测试用例,可以查出更多的错误。边界条件测试是环绕边界值的测试。通常意味着测试软件各功能是否能正确处理最大值,最小值或者所设计软件能够处理的最长的字符串等等。
强力测试
强力测试,英文是Mightiness Testing。强力测试通常验证软件的性能在各种极端的环境和系统条件下是否还能正常工作。或者说是验证软件的性能在各种极端环境和系统条件下的承受能力。比如,在最低的硬盘驱动器空间或系统记忆容量条件下,验证程序重复执行打开和保存一个巨大的文件1000次后也不会崩溃或死机。
装配/安装/配置测试
装配/安装/配置测试是验证软件程序在不同厂家的硬件上,所支持的不同语言的新旧版本平台上,和不同方式安装的软件都能够如预期的那样正确运行。比如,把英文版的 Microsoft Office 2003安装在韩文版 的Windows Me 上,再验证所有功能都正常运行。
静态测试
静态测试,英文是Static Testing。静态测试指测试不运行的部分,例如测试产品说明书,对此进行检查和审阅。静态方法是指不运行被测程序本身,仅通过分析或检查源程序的文法、结构、过程、接口等来检查程序的正确性。静态方法通过程序静态特性的分析,找出欠缺和可疑之处,例如不匹配的参数、不适当的循环嵌套和分支嵌套、不允许
的递归、未使用过的变量、空指针的引用和可疑的计算等。静态测试结果可用于进一步的查错,并为测试用例选取提供指导。静态测试常用工具有:Logiscope、PRQA。
隐藏数据测试
隐藏数据测试在软件验收和确认阶段是十分必要和重要的一部分。程序的质量不仅仅通过用户界面的可视化数据来验证,而且必须包括遍历系统的所有数据。假设一个应用程序要求用户两条信息-----用户名和密码来创建帐户。这个用户输入这两条数据后保存。最后,一个确认窗口将通过数据库中找到这条数据来显示用户名和密码给用户。为了验证所有的数据保存是否正确,一个QA测试人员会在这个确认窗口简单的查看下用户名和密码。如果他们成功了?假设数据库记录了第三条信息----创建日期,它可能不会出现在确认窗口,而只在存档中才出现。如果创建日期保留的不正确,而QA测试人员只验证屏幕上的数据,那么这个问题就不可能被发现。创建日期可能就是一个bug,由于一个用户帐户保存了一个错误的日期到数据库中,这个问题也不可能会被引起注意,因为它被用户界面所隐藏。这只是一个简单的例子,但是它却演化出了一点:隐藏数据测试的重要性。
等价划分测试
等价划分测试的英文是equivalence partition testing。等价划分测试是根据等价类设计测试用例的一种技术。是黑盒测试的典型方法之一,通过把被测试程序所有可能的输入数据域划分成若干部分。从每一部分中选取少数有代表性的数据作为测试用例,可有效减少测试次数,极大提高软件测试效率,缩短软件开发周期.等价类划分测试的目的就是为了在有限的测试资源的情况下,用少量有代表性的数据得到比较好的测试效果。有效等价类盒无效等价类。有效等价类中的数据代表的是一组符合需求文档的正确的有意义数据。无效等价类则正相反。
判定表
判定表的英文是decision table,是指一个表格,用于显示条件和条件导致动作的集合。
定义:判定表是分析和表达多逻辑条件下执行不同操作的情况的工具。
判定表的优点:能够将复杂的问题按照各种可能的情况全部列举出来,简明并避免遗漏。因此,利用判定表能够设计出完整的测试用例集合。在一些数据处理问题当中,某些操作的实施依赖于多个逻辑条件的组合,即:针对不同逻辑条件的组合值,分别执行不同的操作。判定表很适合于处理这类问题。
深度测试
深度测试的英文Depth test ,是指执行一个产品的一个特性的所有细节,但不测试所有特性。当比较函数返回真的时候才显示出效果来。必须启用“#深度测试”,才能执
行测试。不使用的时候需要关闭。
基于设计的测试
基于设计的测试的英文是design-based testing,是根据软件的构架或详细设计引出测试用例的一种方法。一种基于设计模型的测试方法(Model Based TestIng System,MATIS).该方法利用用户界面自动生成方法,把设计模型中的类属性定义和实现中的控件属性组织在一起,构建描述界面的逻辑对照表,辅助测试脚本引擎执行自动测试脚本.借助设计模型中扩展的类定义,MATIS方法可以自动生成测试用例和测试数据。
文档测试
文档测试的英文是documentation testing,测试关注于文档的正确性。文档测试有三大类分别是开发文件、用户文件、管理文件。
1.开发文件:可行性研究报告、软件需求说明书、数据要求说明书、概要设计说明书、详细设计说明书、数据库设计说明书、模块开发卷宗。
2.用户文件:用户手册、操作手册。
3.管理文件:项目开发计划、测试计划、测试分析报告、开发进度月报、项目开发总结报告。
软件测试中的文档测试主要是对相关的设计报告和用户使用说明进行测试,对于设计报告主要是测试程序与设计报告中的设计思想是否一致;对于用户使用说明进行测试时,主要是测试用户使用说明书中对程序操作方法的描述是否正确,重点是用户使用说明中提到的操作例子要进行测试,保证采用的例子能够在程序中正确完成操作。
域测试
域测试的英文是domain testing,定义参考等价划分测试(equivalence partition testing);一般分为单域测试和多域测试,其中单域测试包括设备测试和业务测试,设备
测试包括测试某个系统的软交换设备、中继媒体网关设备、信令网关设备、接入媒体网关和IAD等设备。
等价类划分有两种不同的情况:有效等价类和无效等价类。设计时要同时考虑这两种等价类,因为软件不仅要能接收合理的数据,也要能经受意外的考验。
一有效等价类:是指对于程序的规格说明来说是合理的、有意义的输入数据构成的集合。利用有效等价类可检验程序是否实现了规格说明中所规定的功能和性能。
二无效等价类:与有效等价类的定义恰巧相反。
接口测试
接口测试的英文是interface testing,接口测试测试系统组件间接口的一种测试。接口测试的好处:由于接口测试代码本身就是用junit(当然接口的类型不同,不一定是Junit来实现)来实现的,是属于自动化测试的范畴,因此必定也包含自动化测试所固有的优势。
1)提高测试质量
软件开发的过程是一个持续集成和改进的过程,而每一次的改进都可能引进新bug,因此当软件的一部,或者全部修改时,都需要对软件产品重新进行测试。
其目的是要验证修改后的产品是符合需求的,而当没有自动化测试代码时,往往会由于各种各样的原因,回归不充分,导致bug遗漏。
2)提高测试效率
软件系统的规模越来越大,功能点越来越多,开发人员的自测或者测试人员的人工测试非常耗时和繁琐,势必导致测试效率的低下,而自动化测试正好解决这些耗时繁琐的任务,在对外接口功能不变的情况下,达到了一次编写,永久使用的效果。
3)提高测试覆盖
通过手工测试很难测试到一些更深层次的异常和安全的问题,通过一些辅助的一些测试工具,能分析出代码的覆盖率,通过覆盖率的提高来提高测试的深度。
4)更好地重现软件缺陷
由于每次执行都是相同的代码,一旦代码出错,必定回归出错;
5)更好定位错误
由于接口测试是一种自下向上的测试,因此一量出错,非常容易定位出错,不向系统测试那样了,一旦有Bug,需要几层验证之后才能确定出错位置;
6)降低修改bug的成本接口测试
基本和开发人员的编码平行工作,因此发现问题会比系统测试早很多,因此减少了修改bug的成本。
7)增进测试人员和开发人员之间的合作关系
测试工程师为了更好地开展工作,需要对开发技术有深入的理解和实践,有了与开发工程师更多的交流。
8)降低了项目不能按时发布的风险
由于接口测试很早就介入,在提交给系统测试前对项目代码的核心模块已经做了详尽的测试,必定加速系统测试的时间,由此来保证项目的按时发布;
9)提升测试人员的技能
做接口测试必须了解开发人员的开发流程和一些开发技能,也需要了解测试工具的一些使用方法和一些测试思想,提升了测试人员的技术附加值,提高了自身的竟争力。
10)促使项目开发过程的规范化要进行接口,需要完善的文档进行保障,没有测试文档,接口测试将寸步难行,接口测试将增加开发过程规范化产出,而规范化产出也保证了项目质量。
负面测试
负面测试(Negative testing)是相对于正面测试(Positive testing)而言的。它们也是测试设计时的两个非常重要的划分。简单点说,正面测试就是测试系统是否完成了它应该完成的工作;而负面测试就是测试系统是否不执行它不应该完成的操作。形象一点,正面测试就象一个毕恭毕敬的小学生,老师叫我做什么,我就做什么;而负面测试就象一个调皮捣蛋的孩子,你叫我这样做,我偏不这样做,而且和你对着干。开发人员也是最讨厌修改此类bug的。
非功能性需求测试
非功能性需求测试的英文是non-functional requirements testing ,是与功能不相关的需求测试,如:性能测试、可用性测试等。
为什么非功能性需求很重要?在您设计解决方案的过程中满足功能性需求当然是很重要的。但是,如果没有考虑非功能性需求,您的解决方案则很难取得实效。
非功能性需求特点:
1.不要脱离实际环境;
2.可靠性;
3.可用性;
4.有效性;
5.可维护性;
6.可移植性。
测试方法:
24.如何 测试一个水杯?笔?页面?
按照测试策略划分
功能性测试
可靠性测试
易用性测试
性能测试
可移植性测试
文档测试
兼容性测试
安全测试
安全卸载测试
本地化、国际化测试
大数据测试
A/B测试
测试水杯:
需求测试:查看杯子使用说明书
界面测试:查看杯子外观
功能性:用水杯装水看漏不漏;水能不能被喝到
安全性:杯子有没有毒或细菌
可靠性:杯子从不同高度落下的损坏程度
可移植性:杯子在不同的地方、温度等环境下是否都可以正常使用
兼容性:杯子是否能够容纳果汁、白水、酒精、汽油等
易用性:杯子是否烫手、是否有防滑措施、是否方便饮用
用户文档:使用手册是否对杯子的用法、限制、使用条件等有详细描述
负载测试:将杯子盛上水放24小时检查泄漏时间和情况;盛上汽油放24小时检查泄漏时间和情况等
压力测试:用根针并在针上面不断加重量,看压强多大时会穿透
跌落测试: 杯子加包装(有填充物),在多高的情况摔下不破损
震动测试: 杯子加包装(有填充物),六面震动,检查产品是否能应对恶劣的铁路\公路\航空运输
1.功能性
水倒水杯容量的一般、水倒水杯的安全险、水倒满且流出来、水杯容量刻度与其他水杯不一致、盖子宁进水倒不出来、烫手验证、水能不能被喝到
2.兼容性
杯子能够容纳果汁、白水、酒精、汽油等
3.易用性
倒水方便、喝水方便、携带方便、使用简单、容易操作、防滑措施
4.可移植性
杯子在不同地方、温度环境下都可以正常使用
5.性能
使用最大次数或时间、掉地上不易损坏、盖子拧到什么程度水倒不出来、保温时间长、杯子的耐热性、杯子的耐寒性、长时间放置水不会漏
6.界面
外观完整、美观、大小与设计一样(高,宽,容量,直径)、拿着舒服、材质与设计一样、杯子上的图案掉落、图案遇水溶解
7.安全
杯子使用的材质、杯子的细菌验证、高温材质释放毒性、低温材质释放毒性
8.震动性
杯子加包装有填充物,六面震动,检查产品是否能应对铁路、公路、航空运输
9.疲劳测试
将杯子盛上水放24消失检查泄露时间和情况
10.压力测试
用根针并在针上面不断加重量,看压强多大时会穿透
测试笔:
1、需求测试:查看使用说明书。
2、功能测试:能不能写字 。
3、界面测试:查看笔的外观 。
4、可靠性:笔从不同高度落下摔坏的程度。
5、安全性:笔有没有毒或细菌 。
6、可移植性:笔在不同的纸质、温度等环境下是否可以使用。
7、兼容性:笔是否可以装不同颜色、大小的笔芯 。
8、易用性:是否方便使用、方便携带 。
9、压力测试:给笔不断的增加重力,观察压力多大时压坏。
10、震动测试:笔在包装时,各面震动,检查是否能应对恶劣的公路、铁路、航空运输。
11、跌落测试:笔包装时,在多高的情况下摔不坏。
测试网站:
首先,查找需求说明、网站设计等相关文档,分析测试需求。
制定测试计划, 确定测试范围和测试策略,一般包括以下几个部分:功能性测试;界面测试;性能测试;数据库测试;安全性测试;兼容性测试
设计测试用例:
功能性测试可以包括,但不限于以下几个方面:
链接测试。链接是否正确跳转,是否存在空页面和无效页面,是否有不正确的出错信息返回。
提交功能的测试。
多媒体元素是否可以正确加载和显示。
多语言支持是否能够正确显示选择的语言等。
界面测试可以包括但不限于以下几个方面:
页面是否风格统一,美观
页面布局是否合理,重点内容和热点内容是否突出
控件是否正常使用
对于必须但未安装的控件,是否提供自动下载并安装的功能
文字检查
性能测试一般从以下两个方面考虑:
压力测试;负载测试;强度测试
数据库测试要具体决定是否需要开展。数据库一般需要考虑连结性,对数据的存取操作,数据内容的验证等方面。
安全性测试:
基本的登录功能的检查
是否存在溢出错误,导致系统崩溃或者权限泄露
相关开发语言的常见安全性问题检查,例如SQL注入等
如果需要高级的安全性测试,确定获得专业安全公司的帮助,外包测试,或者获取支持
兼容性测试,根据需求说明的内容,确定支持的平台组合:
浏览器的兼容性;
操作系统的兼容性;
软件平台的兼容性;
数据库的兼容性
测试电梯:
- 功能测试-单个功能
1、电梯内分楼层键是否正常
2、电梯内开关门键是否正常
3、电梯内的报警键是否正常使用
4、电梯外的上下键是否正常
5、同时关注显示屏,电梯内外的显示屏显示的电梯层数和运行方向
6、有障碍物时,电梯门的感应系统有效情况
123456
2.功能测试-模块交互
单个功能测试完成后,再将单个功能组合起来测试,称为集成测试,集成测试可以根据电梯的运行状态来设计测试用例,采用等价类划分的思想。
电梯当前状态是上行时,有人在X楼按下上升/下降键,电梯是否会停止
电梯当前状态是下行时,有人在X楼按下上升/下降键,电梯是否会停止
在搭载满员的情况下,如有人在X楼按下上升/下降键,电梯是否会停止
123
3.接口测试
1、电梯和大楼层
2、梯和摄像头
3、电梯与空调
4、电梯和对讲机(报警装置)
5、电梯与显示屏
6、电梯与其他电梯的协作能力
123456
例如:一栋楼有2部电梯,一部停在2楼,一部停在4楼,有人1楼按电梯,是否2楼的电梯下降到1楼开
\4. 界面测试
1、查看电梯的外观
2、按钮的图标显示,大小
3、电梯内部张贴的说明(比如报警装置的说明、称重量等)
123
4.易用性测试
1、楼层按键高度(小孩和一些身高矮的用户会按键不方便)
2、电梯是否有地毯、夏天是否有空调、通风条件、照明条件、手机信号是否通畅
3、电梯是否有扶手,是否有专针对残疾人的扶手等等
123
5.安全性测试
1、下坠时是否有制动装置
2、暴力破坏电梯时是否报警,
3、超重是否报警
4、超时自动开门
5、火灾报警后,允许就近停靠
6、停电情况下电梯是否有应急电源装置
123456
6.兼容性测试
1、电梯的整体和其他设备的兼容性,与大楼的兼容,与海底隧道的兼容等等
2、不同类型的电压是否兼容
12
7.性能测试
1、测试电梯负载单人时的运行情况(基准测试)
2、多人时的运行情况(负载测试)
3、一定人数下较长时间的运作(稳定性测试)
4、更长时间运作时的运行情况(疲劳测试)
5、不断增加人数导致电梯报警(拐点压力测试)
12345
8.验收测试
设计常见的用户场景并进行相应的测试。
大量用户从1楼上电梯,去向不同的楼层。
大家都不同的楼层上电梯,一起到一楼。
测试微信发红包
1、功能测试
1)发给单个好友
① 正确的金额+无留言+无表情
② 错误的金额+无留言+无表情
③ 正确的金额+有留言+无表情
④ 错误的金额+有留言+无表情
⑤ 正确的金额+无留言+有表情
⑥ 错误的金额+无留言+有表情
⑦ 正确的金额+有留言+有表情
⑧ 错误的金额+有留言+有表情
其中,金额(0.01-200)可以测试以下数据
数字:测试0, 0.009, 0.01,0.011, 01, 199.99, 200, 200.01这些边界值
中文、英文、特殊字符或者这几种的组合
是否支持复制黏贴
为空/包含空格
金额的增删查改
留言可以测试以下数据
数字、中文、英文、特殊字符、表情或者他们的组合
输入超长文本时,是否会给出相应的限制或提示
包含空格
是否支持复制黏贴
留言的增删查改
表情可以测试以下数据
选择收藏的表情测试(动图/静图)
选择下载的表情测试(动图/静图)
录制表情,并添加进行测试
表情的增删查改
⑨ 点击塞钱进红包,选择零钱付款,此时需要考虑金额>零钱,金额<零钱,金额=零钱三种情况
⑩ 点击塞钱进红包,选择已添加的银行卡付款,此时同样需要考虑金额>银行卡余额,金额<银行卡余额,金额=银行卡余额三种情况
⑪ 点击塞钱进红包,选择使用新卡付款,按照流程添加新卡,此时同样需要考虑金额>新卡余额,金额<新卡余额,金额=新卡余额三种情况
⑫ 使用指纹确认付款(正确的/不正确的指纹)
⑬ 使用密码确认付款(正确的/不正确的密码 )
⑭ 发送成功之后,对应的途径会减少相应的金额
⑮ 发送者/接受者可以点击红包查看到红包的具体信息,且金额,留言,表情均能正确显示
⑯ 好友点击红包之后,零钱中将增加相应的金额,再次点击之后,只能查看到红包的信息
⑰ 24小时之内没有领取的红包,将退回原账户,此时原账户的零钱将增加相应金额的金钱。24小时后好友点击红包,显示红包已过期,无法查看到红包的余额
⑱ 右上角的红包记录中,可以查看刚刚发出的红包的金额
⑲ 检测帮助中心中链接是否均可以正常跳转,查看
20 当红包超过24小时之后,则无法查看红包被每个人领取的详细信息
2)发送群红包(与发给好友的测试点相似,以下仅写出不同的部分)
① 选择为拼手气红包时,群中每个人收到的金额随机(但加起来为红包的总金额),为普通红包时,群中每个人收到的金额相同
② 红包个数(1-100):0,1,2,大于群成员人数,小于群成员人数,等于群成员人数,99,100,101,小数,中文、英文、特殊字符、表情或者他们的组合
③ 但红包没有被抢完时,此时首次点击该红包的人可以抢到一定金额的红包,不是首次点击该红包的人只能查看该红包的信息;当红包抢完时,所有人只能查看该红包的信息。
④ 在24小时之内红包的金额被完全抢完,且此时为拼手气红包时,金额最多的人会显示为最佳手气(若有两个人取得红包的最大值时,则只有一个人会显示为最佳手气);若没有被完全抢完,则没有最佳手气,且余额会退还到原账户
⑤ 群中所有人均可以抢红包(包括自己),每个人最多只有一次抢该红包的机会
⑥ 测试当红包个数使得每个红包分到钱小于0.01,即总金额为0.02,而红包个数为3时的情况
2、兼容性测试
1)苹果手机和安卓手机
2)苹果手机的不同版本
3)安卓手机不同的机型
4)不同分辨率
3、性能测试
1)打开红包的响应时间不能超过三秒,高并发场景下不能超过5秒
2)耗电量
3)消耗流量的多少
4)所占内存
等
4、UI测试&易用性测试
1)界面的设计风格是否统一
2)界面中文字是否简洁,没有错别字
3)是否易操作,易学习,易理解
5、中断测试:前后台切换,网络异常,低电量,断电,来电,短信等
6、网络测试
1)网络兼容性:2g/3g/4g,WiFi,热点,移动/联通/电信
2)无网测试
3)弱网:延时&丢包
测试微信朋友圈
功能、界面/易用性、中断、网络、兼容性、安全性、性能测试
功能测试
1、朋友圈发送功能
1)只发送文本
a、考虑文本长度:1-1500字符(该数据为百度数据)、超出最大字符长度
b、考虑文本类型:纯中文、纯数字、纯字母、纯字符、纯表情(微信表情/手机自带表情)、混合类型、包含url链接;因为过长纯类型需要换行很容易出现超出边框问题,所以这里先考虑过长纯类型情况
c、文本是否支持复制粘贴
d、为空验证
2)只发送图片
a、本地相册选择/拍摄
b、图片数量验证:1-9张图片、超出9张
c、图片格式验证:常见图片格式jpg、png(以实际微信需求支持的格式为准)、动态gif图片、不支持的图片格式
d、图片尺寸验证:最大700*800像素(此为百度数据)、超出最大尺寸范围是否压缩
e、图片大小验证:1-300kb(此为百度数据)、超出300kb
f、图片的预览验证:点击支持预览大图、多张图片支持左右滑动预览
g、图片的增删改操作
h、为空验证
3)只发送视频
a、本地相册选择/拍摄
b、视频秒数验证:1-10s,超出10s
c、视频个数验证:1个,超出1个
d、视频格式验证:支持的视频格式,例mp4、不支持的视频格式
e、视频大小验证:苹果400kb以内、Android200-300kb(此为百度数据)、超出规定大小
f、视频预览增删改操作
g、为空验证
4)发送文本+图片:输入满足要求的文本、图片进行一次验证
5)发送文本+视频:输入满足要求的文本、视频进行一次验证
6)发送图片+视频:不支持发送
7)朋友圈发送内容是否有限制,例如涉及黄赌毒等敏感字
8)所在位置
a、不显示位置:发送到朋友圈动态不显示位置
b、选择对应位置:搜索支持、自动定位、手动编辑
C、点击取消,返回上一级页面
9)谁可以看
a、设置公开:所有朋友可见
b、设置私密(仅自己可见):自己查看朋友圈-可见、好友查看朋友圈-不可见
c、设置部分可见(部分朋友可见):选择的部分好友-可见、不被选择的好友-不可见、是否有人数上限
d、设置不给谁看(选中的朋友不可见):不被选中的朋友-可见、被选中的朋友-不可见、是否有人数上限
e、点击取消,返回发送页面
10)提醒谁看
a、提醒单人/提醒多人:被提醒的朋友-收到消息提醒、未被提醒-未有消息提醒
b、是否有人数上限
c、点击取消,返回发送页面
11)同步QQ空间:默认不同步、同步到QQ空间
12)取消发送朋友圈操作
a、选择相机,点击取消,返回朋友圈页面
b、进入朋友圈发送页面,选择文本图片,点击取消
13)朋友圈当天发送次数是否有上限限制
2、朋友圈浏览功能
1)文本查看:
a、过长文本内容是否隐藏,并支持查看全文
b、右键选择复制、收藏、翻译
c、url链接是否支持点击跳转网页
2)图片查看
a、小图右键支持收藏/编辑
b、点击支持大图浏览
c、选择发送给朋友、收藏、保存图片、编辑
d、多张图片支持左右滑动浏览
3)视频查看
a、右键视频支持静音播放/搜藏
b、点击视频播放按键支持播放视频
c、选择发送给朋友、收藏、保存视频、编辑
4)分享动态浏览:QQ空间/公众号文章/非腾讯产品分享后朋友圈是否正常显示
5)赞:点赞、取消点赞
6)评论
a、评论长度:评论字数合理长度、评论超过字数上限
b、评论类型:纯中文、纯数字、纯字母、纯字符、纯表情(微信表情/手机自带表情)、混合类型、包含url链接;
c、评论是否支持复制粘贴
d、为空验证
e、发表评论后删除
f、评论回复操作
7)删除朋友圈动态
8)更换相册封面
9)刷新是否正常获取新动态
10)上滑是否加载更多
界面/易用性测试
1、技术人员角度:页面布局设计是否跟产品原型图/ui效果图一致
2、但除了考虑1之外,我们同样要考虑到用户使用:功能操作是否简便,页面布局排版风格是否美观合理,提示语相关信息是否易于理解
中断测试
1、主要考虑:a)核心功能 b)当前功能存在实时数据交换,例发朋友圈、浏览朋友圈进行中断,是否容易出现崩溃
2、中断包括:前后台切换、锁屏解锁、断网重连、app切换、来电话/来短信中断、插拔耳机线/数据线
网络测试
1、三大运营商不同网络制式测试
2、网络切换测试:WIFI/4G/3G/2G
3、无网测试:对于缓存在本地的数据,部分朋友圈信息是否支持浏览
4、弱网测试:
a、延时:页面响应时间是否可接受、不同网络制式是否区分超时时长、出现请求超时,是否给予相应的提示
b、丢包:有无超时重连机制、如果未响应,是否给予相应提示
c、页面呈现的完整性验证
兼容性测试
1、Android手机端、苹果手机端、pad版(主流)功能界面显示是否正常
2、各平台朋友圈展示数据是否一致
安全测试
发送朋友圈时,文本输入脚本代码,是否出现异常
性能测试
1、服务器性能测试
可通过loadrunner/jmeter工具实现,主要关注TPS、响应时间、吞吐量、CPU、内存等
1
2、app客户端性能测试
可通过GT工具实现,运行时关注cpu、内存、流量、电量等占用率
1
3、app压力稳定性测试
通过monkey工具实现,频繁发送朋友圈,浏览朋友圈请求,是否容易发生崩溃
测试一个http协议
测试用户登录界面
一、功能测试
1.输入正确的用户名和密码,点击提交按钮,验证是否能正确登录。
2.输入错误的用户名或者密码,验证登录会失败,并且提示相应的错误信息。
3.登录成功后能否能否跳转到正确的页面
4.用户名和密码,如果太短或者太长,应该怎么处理
5.用户名和密码,中有特殊字符(比如空格),和其他非英文的情况
6.记住用户名的功能
7.登陆失败后,不能记录密码的功能
8.用户名和密码前后有空格的处理
9.密码是否非明文显示显示,使用星号圆点等符号代替。
10.牵扯到验证码的,还要考虑文字是否扭曲过度导致辨认难度大,考虑颜色(色盲使 用者),刷新或换一个按钮是否好用
11.登录页面中的注册、忘记密码,登出用另一帐号登陆等链接是否正确
12.输入密码的时候,大写键盘开启的时候要有提示信息。
13.什么都不输入,点击提交按钮,检查提示信息。
14.用户名未注册是否会有用户名不存在,请先注册等提示信息。
15.登录中途断网,硬件设备出现故障能否登录。
16.弱网情况下可否登陆成功,加载时间最长是多久,超过加载时间会有什么提示信息。
17.可否登录多个账户
18.登录后用户名密码保存多长时间(在哪个时间内免登录)
19.注销的账号可否登录。
20.已经登陆过的账户可否再登录。
二、界面测试
1.布局是否合理,testbox和按钮是否整齐。
2.testbox和按钮的长度,高度是否复合要求。
界面的设计风格是否与UI的设计风格统一。
界面中的文字简洁易懂,没有错别字。
三、性能测试
1.打开登录页面,需要的时间是否在需求要求的时间内。
2.输入正确的用户名和密码后,检查登录成功跳转到新页面的时间是否在需求要求的时间内。
3.模拟大量用户同时登陆,检查一定压力下能否正常登陆跳转。
四、安全性测试
1.登录成功后生成的Cookie,是否是httponly (否则容易被脚本盗取)。
2.用户名和密码是否通过加密的方式,发送给Web服务器。
3.用户名和密码的验证,应该是用服务器端验证, 而不能单单是在客户端用javascript 验证。
4.用户名和密码的输入框,应该屏蔽SQL注入攻击。
5.用户名和密码的的输入框,应该禁止输入脚本 (防止XSS攻击)。
6.防止暴力破解,检测是否有错误登陆的次数限制。
是否支持多用户在同一机器上登录。
同一用户能否在多台机器上登录。
五、可用性测试
是否可以全用键盘操作,是否有快捷键。
输入用户名,密码后按回车,是否可以登陆。
输入框能否可以以Tab键切换。
是否符合人体学识,是否简单易操作。
六、兼容性测试
1.不同浏览器下能否显示正常且功能正常(IE,6,7,8,9, Firefox, Chrome, Safari,等)。
2.同种浏览器不同版本下能否显示正常且功能正常。
2.不同的平台是否能正常工作,比如Windows, Mac。
3.移动设备上是否正常工作,比如Iphone, Andriod。
4.不同的分辨率下显示是否正常。
七、本地化测试
不同语言环境下,页面的显示是否正确。
测试一个ATM机
25.软件测试方法定义、目的、场景和如何使用?
黑盒测试:
黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能,通过测试来检测每个功能是否都能正常使用,在测试时,把程序看作一个不能打开的黑盆子,在完全不考虑程序内部结构和内部特性的情况下,测试者在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数锯而产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性。
常用的黑盒测试方法有:等价类划分法;边界值分析法;因果图法;场景法;正交实验设计法;判定表驱动分析法;错误推测法;功能图分析法。
白盒测试:
白盒测试也称为结构测试或逻辑驱动测试,是针对被测单元内部是如何进行工作的测试。它根据程序的控制结构设计测试用例,主要用于软件或程序验证。白盒测试法检查程序内部逻辑结构,对所有的逻辑路径进行测试,是一种穷举路径的测试方法,但即使每条路径都测试过了,但仍然有可能存在错误。因为:穷举路径测试无法检查出程序本身是否违反了设计规范,即程序是否是一个错误的程序;穷举路径测试不可能检查出程序因为遗漏路径而出错;穷举路径测试发现不了一些与数据相关的错误。
白盒测试需要遵循的原则有:1. 保证一个模块中的所有独立路径至少被测试一次;2. 所有逻辑值均需要测试真(true)和假(false);两种情况;3. 检查程序的内部数据结构,保证其结构的有效性;4. 在上下边界及可操作范围内运行所有循环。
常用白盒测试方法:逻辑覆盖法,程序插桩技术,基本路径法,符号测试,错误驱动测试
静态测试:不用运行程序的测试,包括代码检查、静态结构分析、代码质量度量、文档测试等等,它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具(Fxcop)自动进行。
动态测试:需要执行代码,通过运行程序找到问题,包括功能确认与接口测试、覆盖率分析、性能分析、内存分析等。
白盒测试中的逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。六种覆盖标准发现错误的能力呈由弱到强的变化:
1.语句覆盖每条语句至少执行一次。
2.判定覆盖每个判定的每个分支至少执行一次。
3.条件覆盖每个判定的每个条件应取到各种可能的值。
4.判定/条件覆盖同时满足判定覆盖条件覆盖。
5.条件组合覆盖每个判定中各条件的每一种组合至少出现一次。
6.路径覆盖使程序中每一条可能的路径至少执行一次。
详情:
https://blog.csdn.net/u014745194/article/details/79919756
26.白盒测试定义、方法、场景和如何使用?
27.常用的adb命令、作用、简介?
详情:https://zhonglunshun.blog.csdn.net/article/details/78362439
28.linux所有常用命令、重点命令?
●线上查询及帮助命令(1 个)
help 如:mkdir --help
●文件和目录操作命令(12 个)
ls tree pwd mkdir rmdir cd touch cp mv rm ln find
●查看文件及内容处理命令(21 个)
cat tac more less head tail cut split paste sort uniq wc iconv dos2unix file diff vimd ff chattr lsattr rev grep
●文件压缩及解压缩命令(4 个)
tar unzip gzip zip
●信息显示命令(12 个)
uname hostname dmesg uptime file stat du df top free date cal
●搜索文件命令(4 个)
which find whereis locate
●用户管理命令(10 个)
useradd usermod userdel groupadd passwd chage id su visudo sudo
●基础网络操作命令(10 个)
telnet ssh scp wget ping route ifconfig ifup ifdown netstat
●深入网络操作命令(6 个)
lsof route mail mutt nslookup dig
●有关磁盘文件系统的命令(8 个)
mount umount df du fsck dd dumpe2fs dump
●关机和查看系统信息的命令(3个)
shutdown halt init
●系统管理相关命令(8个)
uptime top free vmstat mpstat iostat sar chkconfig
●系统安全相关命令(10 个)
chmod chown chgrp chage passwd su sudo umask chattr lsattr
●查看系统用户登陆信息的命令(7 个)
whoami who w last lastlog users finger
●查看硬件信息相关命令(8 个)
ifconfig free fdisk ethtool mii-tool dmidecode dmesg lspci
●其它(19 个)
echo printf rpm yum watch alias unalias date clear history eject time nohup nc xargs exec export unset type
●系统性能监视高级命令(12 个)
内存:top free vmstat mpstat iostat sar
CPU:top vmstat mpstat iostat sar
I/O:vmstat mpstat iostat sar
进程:ipcs ipcrm lsof strace lstrace
负载:uptime mount umount df du fsck dd dumpe2fs dump
●关机和查看系统信息的命令(3 个)
shutdown halt init
●系统管理相关命令(8 个)
uptime top free vmstat mpstat iostat sar chkconfig
●系统安全相关命令(10 个)
chmod chown chgrp chage passwd su sudo umask chattr
29.数据库所有命令 ?
mysql中不区分大小写
#登录
msyql -u root -p 回车以后输入密码
mysql -u root -p666666
msyql -u root -h 127.0.0.1 -p
mysql -u root -P 3306 -p
#查询mysql的状态:status
#查看msyql中的存储引擎:
show engines;
#以表格的方式有点长,以竖着的方式展示
show engines\G;
#查看mysql中的所有用户
select user,host,password from mysql.user;
#查看所有的库
show databases;
#使用某个库:use 库名
use mysql;
#查看所有的表:
show tables;
#查看表中的全部数据
select * from 表名;
select * from user;
#查看当前使用的库;
select database();
#查询当前用户
select user();
#查询版本号;
select version();
#查看帮助文档: help 命令字 linux:命令字 --help
help show;
#查看表结构:desc 表名
desc user;
describe user;
#创建库语句
CREATE [DATABASE|SCHEMA] [IF NOT EXISTS] ‘DB_NAME’;
create database zhonggong1;
create schema zhonggong2;
create database if not exists zhonggong3;
create database zhonggong1;
create database if not exists zhonggong1;
#查看警告
show warnings;
#查看某个库的字符集====查看创建库的语句
Show create database 库名;
show create database zhonggong3;
#查看系统支持哪些字符集
show character set;
show charset;
#创建库的时候指定字符集
CREATE [DATABASE|SCHEMA] [IF NOT EXISTS] ‘DB_NAME’;
CHARACTER SET [=] charset_name;(指明字符集)
create database if not exists zhonggong4 character set = big5;
#查看创建zhonggong4的建库语句
show create database zhonggong4;
#修改指定数据库的编码方式:alter
ALTER {DATABASE|SCHEMA} 库名 [DEFAULT] CHARACTER SET [=] charset_name
alter database zhonggong4 default character set = utf8;
#删除库:drop
DROP DATABASE [IF EXISTS] ‘db_name’;
drop database 库名
drop database zhonggong4;
#创建ujiuy库
create database ujiuye;
#在建表的时候一定要先使用一个库
use ujiuye
#查看所有的表:
show tables;
#创建表 create
方式1:CREATE TABLE [IF NOT EXISTS] tbl_name (col1 type1,col2 type2,.......);
CREATE TABLE [IF NOT EXISTS] tbl_name(
字段名称 字段类型 [完整性约束条件],
...
)ENGINE=引擎名称 CHARSET='编码方式';
create table if not exists user(
id int,
username varchar(20),
age smallint,
sex enum('男','女','保密'),
email varchar(50),
addr varchar(200),
birth year,
hight float(5,2),
married tinyint(1),
tel varchar(11)
);
#查看表结构:desc
desc user;
#查看表中的数据:
select * from 表名
select * from user;
#查看所有的表;
show tables
#查看创建表的命令
show create database 库名
show create table user;
#查看表的状态属性信息
SHOW TABLE STATUS LIKE ‘tbl_name’\G;
show table status like 'user';
#创建一张课程表,指定使用myisam引擎 使用big5编码格式
CREATE TABLE [IF NOT EXISTS] tbl_name(
字段名称 字段类型 [完整性约束条件],
...
)ENGINE=引擎名称 CHARSET='编码方式';
create table if not exists course3(
id int,
courseName varchar(20),
courseTea varchar(20),
courseDesc varchar(200)
)engine=myisam charset=big5;
#查看建表的语句
show create table course;
#删除表 drop database 库名
drop table 表名;
drop table course;
#如何删除多张表
drop table course1,course2,course3;
数据类型:字符型 整型 浮点型 日期类型
#测试整型 可以通过帮助文档查看具体的取值范围
create table if not exists test1(
num1 tinyint,
num2 smallint,
num3 mediumint,
num4 int,
num5 bigint,
num6 tinyint(1)
);
#向表中插入数据 DML insert
insert into 表名 values(值1,值2.。。。。);
insert into test1 values(-128,-32768,-8388608,-2147483648,-9223372036854775808,1);
insert into test1 values(-129,-32768,-8388608,-2147483648,-9223372036854775808,1);
insert into test1 values(1,1,1,1,1,1);
insert into test1 values(12,12,12,12,12);
#查看表中的数据
select * from test1;
字段名 数据类型 完整性约束
#测试无符号 UNSIGNED无符号 --无负号,不能存负数
create table if not exists test2(
num1 tinyint unsigned,
num2 smallint
);
#插入测试数据
insert into test2 values(0,-23);
insert into test2 values(-8,-23);
#测试零填充 ZEROFILL零填充
create table if not exists test3(
num1 tinyint zerofill,
num2 smallint zerofill,
num3 mediumint zerofill,
num4 int zerofill
);
#插入测试数据
insert into test3 values(-1,-1,-1,-1);
insert into test3 values(1,1,1,1);
insert into test3 values(255,1,1,1);
insert into test3 values(255,378,264,9634);
insert into test3 values(256,378,264,9634);
#查询全部数据
select * from test3;
#测试浮点型
create table if not exists test4(
num1 float(5,2),
num2 double(5,2)
);
#插入测试数据
insert into test4 values(3.141592,3.141592); #可以插入成功,只保留两位小数
insert into test4 values(3.146826,3.149342); #超出的范围是四舍五入的
insert into test4 values(1,1);
insert into test4 values(123,123);
insert into test4 values(1234,1234);
insert into test4 values(123.45,123.45);
insert into test4 values(1234.5,1234.5);
insert into test4 values(999,999);
#测试字符类型
create table if not exists test5(
str1 char(5),
str varchar(5)
);
#插入测试数据
insert into test5 values('a','a');
insert into test5 values('abcde','abcde');
insert into test5 values('abcdef','abcdef');
insert into test5 values('优就业','优就业');
insert into test5 values('优就业你好','优就业你好');
insert into test5 values('优就业你好啊','优就业你好啊');
insert into test5 values('1','1');
insert into test5 values(1,1);
insert into test5 values('1a','1a');
insert into test5 values(1a,1a);
insert into test5 values('1 ',' 1');
insert into test5 values('1 ',' 1');
create table if not exists test6(
str1 text
);
insert into test6 values('减肥的垃圾佛的睡觉奥房间打扫解放东路洒进来减肥的垃圾佛的睡觉奥房间打扫解放东路洒进来减肥的垃圾佛的睡觉奥房间打扫解放东路洒进来减肥的垃圾佛的睡觉奥房间打扫解放东路洒进来减肥的垃圾佛的睡觉奥房间打扫解放东路洒进来减肥的垃圾佛的睡觉奥房间打扫解放东路洒进来减肥的垃圾佛的睡觉奥房间打扫解放东路洒进来减肥的垃圾佛的睡觉奥房间打扫解放东路洒进来减肥的垃圾佛的睡觉奥房间打扫解放东路洒进来减肥的垃圾佛的睡觉奥房间打扫解放东路洒进来');
#测试enum和set
enum:枚举类型,将所有可能都列出出来,一次只能插入一个值
例如:性别:男 女 保密 政治面貌:群众,团员,党员
学历:胎教,小学 初中 高中,本科 硕士 博士 户口:农村 城镇
set:集合类型:将所有可能的值都列出来,一次可以插入一个或者多个值
例如:最喜欢的电影('阿凡达','肖申克的救赎','禁闭岛','盗梦空间','八佰')
create table if not exists test7(
xueli enum('胎教','本科','硕士','博士','博士后'),
favMov set('阿凡达','肖申克的救赎','羞羞的铁拳','夏洛特烦恼')
);
#插入测试数据
insert into test7 values('本科','阿凡达');
insert into test7 values('本科','阿凡达,夏洛特烦恼');
insert into test7 values('本科,硕士','阿凡达,夏洛特烦恼');
insert into test7 values('硕士','阿凡达,夏洛特烦恼');
insert into test7 values('硕士','夏洛特烦恼,阿凡达,羞羞的铁拳');
insert into test7 values('硕士1','夏洛特烦恼,阿凡达,羞羞的铁拳');
insert into test7 values('硕士 ','夏洛特烦恼,阿凡达,羞羞的铁拳');
#还可以通过数值插入
#在枚举类型中,数据的下标是从1开始 1 2 3 4 5.。。。
#在集合类型中,数据的是下标是 1 2 4 8 16 是2的n-1次方
insert into test7 values(1,1);
insert into test7 values(3,3);
insert into test7 values(4,6);
insert into test7 values(1,5);
insert into test7 values(1,7);
insert into test7 values(1,13);
#测试时间类型
create table if not exists test8(
test1 time,
test2 year
);
#插入测试数据
insert into test8 values('11:13:27',2020);
insert into test8 values('1 12:13:27',2020);
insert into test8 values('13:27',2020);
insert into test8 values('1234',2020);
insert into test8 values('12345',2020);
insert into test8 values('12345',20);
insert into test8 values('12345',19);
insert into test8 values('12345',0);
insert into test8 values('12345','0');
insert into test8 values('12345','1901');
insert into test8 values('12345',1901);
#测试主键 primary key
create table if not exists user1(
id int primary key,
uesrname varchar(20)
);
#插入测试数据
insert into user1 values(1,'uahui');
insert into user1 values(2,'uahui');
insert into user1 values(2,'uwuji');
#查看创建表的语句
show create table user1;
#在多个字段添加主键,这种主键称之为:联合主键
create table if not exists user2(
id int,
username varchar(20),
password varchar(20),
card char(18),
primary key(id,card)
);
#插入测试数据
insert into user2 values(1,'uahui','pahui','111');
insert into user2 values(2,'uahui','pahui','111');
insert into user2 values(1,'uahui','pahui','111');
insert into user2 values(1,'uahui','pahui','112');
#测试省略primary的主键
create table if not exists user3(
id int key,
username varchar(20)
);
#测试自增长 auto_increment 默认的自增长的值是多少
create table if not exists user4(
id tinyint unsigned key auto_increment,
username varchar(20)
);
#查看建表语句
show create table user4;
#插入测试数据
insert into user4 values(1,'uxiaozhan');
#插入部分字段
insert into 表名(字段名) values(字段值)
insert into user4(username) values('uyibo');
insert into user4(username) values('uqianxi');
insert into user4 values(null,'unana');
insert into user4 values(default,'ureba');
#自定义自增长的值
create table if not exists user5(
id tinyint unsigned key auto_increment,
username varchar(20)
)auto_increment=100;
#插入测试数据
insert into user5(username) values('uwangyuan');
#修改自增长的值
alter table 表名 auto_increment=初始值
alter table user5 auto_increment=200;
insert into user5(username) values('uguangkun');
#测试非空 not null
create table if not exists user6(
id tinyint key auto_increment,
username varchar(20) not null,
password varchar(20) not null,
age tinyint unsigned
);
#插入测试数据
insert into user6(username,password) values('uahui','pahui');
insert into user6(password,username,age) values('uhaizhu','pahizhu',22);
insert into user6(password,username) values('pxiaozhao','uxiaozhao');
insert into user6(password,username) values(null,null);
字段名 数据类型 完整性约束
#测试默认值 default
create table if not exists user7(
id tinyint unsigned key auto_increment,
username varchar(20) not null,
password char(20) not null,
age tinyint unsigned default 18,
addr varchar(50) not null default '北京',
xueli enum('专科','本科','硕士') not null default '本科'
);
#插入测试数据
insert into user7(username,password) values('uahui','pahui');
insert into user7 values(2,'uxiaozhan','pxiaozhan',23,'广州','本科');
#测试唯一值 unique key
create table if not exists user8(
id tinyint unsigned key auto_increment,
username varchar(20) not null unique key,
card varchar(20) unique
);
#插入测试数据
insert into user8(username) values('uahui');
insert into user8(username) values('uahui');
insert into user8(username) values('uwuji');
#修改表名
ALTER TABLE tbl_name RENAME [TO|AS] new_name
方式1:Alter table 表名 rename 新表名;
alter table user1 rename user10;
alter table user2 rename to user11;
方式二:RENAME TABLE 表名 TO 新表名 to不可省略
rename table user3 to user13;
#添加字段
add ALTER TABLE tbl_name ADD 字段名称 字段类型 [完整性约束条件] [FIRST|AFTER 字段名称]
Alter table 表名 add 字段名 数据类型 [首行|某一行之后]
#新增字段
alter table user7 add test1 int not null;
alter table user7 add test2 int first;
alter table user7 add test3 int not null default 100 after age;
#新增多个字段
alter table user7 add test4 int first,
add test5 int,
add test6 int after id,
add test7 set('A','B','C');
#删除字段:drop
ALTER TABLE tbl_name DORP col_name;
alter table user7 drop test7;
#删除多个字段
alter table user7 drop test6,
drop test5,
drop test4;
#添加字段的同时删除字段 删除掉test3 新增test5
alter table user7 add test5 int, drop test3;
#修改字段属性
修改字段属性:ALTER TABLE tb_name MODIFY col_name 字段属性; change
alter table user7 modify test5 varchar(20) default '北京';
#创建表
create table if not exists user9(
id tinyint unsigned key auto_increment,
username varchar(20) not null unique,
password varchar(20) not null,
email char(20) not null default '10489302@qq.com',
age tinyint unsigned default 18
);
1.1不指定具体的字段名: INSERT [INTO] tbl_name VALUES|VALUE(值...)
insert into user9 values(1,'uahui','pahui','109473@qq.com',20);
insert user9 values(2,'uliuneng','pliuneng','109473@qq.com',20);
insert user9 value(3,'uzhaosi','pzhaosi','109473@qq.com',20);
1.2列出指定字段:INSERT [INTO] tbl_name(字段名称1,...) VALUES|VALUE(值1,...)
insert into user9(username,password) values('uzhaomin','pzhaomin');
#插入多条记录,可以指定字段 也可以不指定字段
insert into user9 values(5,'uxiaozhao','pxiaozhao','75984@qq.com',20),
(6,'umengting','pmengting','75394@qq.com',19),
(7,'uhongtao','phongtao','7943@qq.com',38);
#指定字段插入多条
insert into user9(username,password) values('uliangyi','pliangyi'),('ujiuliang','pjiuliang'),('uhetang','phetang');
#通过set的方式
insert into user9 set username='uxiaodong',password='pxiaodong';
insert into user9 set id=12,username='ufuxiang',password='pfuxiang',email='473892@qq.com',age=22;
#查询表中的所有内容
select * from 表名;
select * from students;
#-- 查询部分字段
#查询stuid,name,gender
select stuid,name,gender from students;
#-- 表来自于哪个数据库下db_name.tbl_name
select * from zhonggong1.students;
select stuid,name,classid from zhonggong1.students;
select host,user,password from mysql.user;
#字段来自于哪张表
select stuid,name,classid from students;
select students.stuid,students.name,students.classid from students;
#-- 给表名起别名
select stuid,name,classid from students as ss;
select stuid,name,classid from students ss;
#-- 给字段起别名
select stuid as ad,name as ne,classid as cd from students;
select stuid as '编号',name as '姓名',classid as '班级编号' from students;
select ss.stuid,ss.name,ss.classid from students as ss;
#删除数据
一定要注意删除需要加条件限制(不加条件限制非常危险)
DELETE FROM tb_name [where clause]
delete from user9 where id=7;
delete from user9 where password='pzhaosi';
delete from user8;
truncate table 表名;
truncate table user7;
#更新数据update
2.4UPDATE语句(修改表中的数据)
UPDATE tbl_name SET col1=new_cal1,col2=new_val2, [where clause]
Update 表名 set 字段名=值 [where 条件]
update user9 set age=50 where id=5;
update user9 set age=70;
#创建用户 create user 通过帮助文档查看
CREATE USER ‘username’@’host’ [IDENTIFIED BY ‘password’];
Create user ‘用户名’@‘主机名 ’
Create user ‘用户名’@‘主机名’identified by ‘密码’
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
create user 'zhangwuji'@'localhost' identified by '666666';
create user 'zhaomin'@'localhost' identified by '666666';
create user 'reba'@'localhost';
#删除用户 drop user;
DROP USER 'jeffrey'@'localhost';
drop user 'xiaozhao'@'localhost';
#设置密码:set password
SET PASSWORD FOR 'bob'@'%.example.org' = PASSWORD('cleartext password');
set password for 'reba'@'localhost' = password('666666');
#给用户授权
#查看有哪些权限
SHOW PRIVILEGES;
SHOW PRIVILEGES\G;
#说明:如果在授权的时候,该用户不存在,则同时创建用户
GRANT 权限 ON 库.表 TO ‘user’@’host’ [IDENTIFIED BY ‘password’]
把****权限给与某个用户
授权zhangwuji zhonggong1库下所有表 delete select
grant delete,select on zhonggong1.* to 'zhangwuji'@'localhost' identified by '666666';
Grant 权限类型(大小)
on 库名.表名 (*.* 所有的库中的所有表)
to ‘用户名’@‘主机名’
[identified by ‘密码’]
#如果权限没有更新,需要刷新权限
FLUSH PRIVILEGES;
#撤销授权
REVOKE 权限 ON 库.表 FROM ‘user’@’host’ [IDENTIFIED BY ‘password’]
revoke delete on zhonggong1.* from 'zhangwuji'@'localhost';
#select语句
#查询表中的全部内容
select * from cts_user;
#查询id为3的用户信息
select * from cts_user where id=3;
select * from cts_user where username='rose';
#查询id不为3的用户信息
select * from cts_user where id!=3;
select * from cts_user where id<>3;
#查询用户名为lily的用户
select * from cts_user where username='lily';
select * from cts_user where username<=>'lily';
#查询年龄为null的用户
select * from cts_user where age=null;
select * from cts_user where age<=>null;
#查询年龄等于25的用户
select * from cts_user where age=25;
select * from cts_user where age<=>25;
#查询id大于等于7的用户
select * from cts_user where id >=7;
#是否为空 is null is not null
#查询年龄为null的用户
select * from cts_user where age is null;
#指定范围: between and 在什么什么之间 not between and
#查询id为3到9之间的用户信息
select * from cts_user where id between 3 and 9; 含头含尾
#查询id不在4到10的范围内的用户
select * from cts_user where id not between 4 and 10;
#指定集合: in not in
#查询id为1 3 4 6 9的用户信息
select * from cts_user where id in(1,3,4,6,9);
select * from cts_user where id not in(1,3,4,6,9,124,234,5234,24);
#查询proid为1和3的用户
select * from cts_user where proid in(1,3);
#查询proid为1到3的用户
select * from cts_user where proid between 1 and 3;
select * from cts_user where proid in(1,2,3);
#查询张三 张三丰 ahui lily的信息
select * from cts_user where username in('张三','张三丰','ahui','lily');
select * from cts_user where username not in('张三','张三丰','ahui','lily');
5.5模糊查询 like NOT like 像什么什么的样子
-- %:代表0个一个或者多个任意字符
-- _:代表1个任意字符
#查询姓张的用户的信息
select * from cts_user where username like '张%';
#查询姓名包含in的用户
select * from cts_user where username like '%in%';
#查询姓名不包含in的用户
select * from cts_user where username not like '%in%';
select * from cts_user where username like '%'; ======= select * from cts_user
#查询第二个字符为i的用户
select * from cts_user where username like '_i%';
#模糊匹配不区分大小写
select * from cts_user where username like '_I%';
#查询ahui的用户信息
select * from cts_user where username='ahui';
select * from cts_user where username like 'ahui';
#查询long的相关信息 他的id为4
select * from cts_user where id=4
select * from cts_user where username='long';
#查询用户名为4位的用户
select * from cts_user where username like '____';
#查询多个条件 and:并且 or:或者
#查询密码为ahui的人
select * from cts_user where password='ahui';
#查询用户名为ahui并且密码也是ahui的人
select * from cts_user where password='ahui' and username='ahui';
#查询id大于等于5并且年龄不为空的人
select * from cts_user where id>=5 and age is not null;
#查询id大于等于5并且年龄不为空的人并且proid等于5
select * from cts_user where id>=5 and age is not null and proid=5;
#查询id为2到10之间并且用户名为4位的用户
select * from cts_user where id between 2 and 10 and username like '____';
select * from cts_user where username like '____' and id between 2 and 10;
#查询姓名为张开头或者proid为1和3的人
select * from cts_user where username like '张%' or proid in(1,3);
#GROUP BY按照用户性别分组
#按照性别分组
select * from cts_user group by sex;
#按照proid分组
select * from cts_user group by proid;
#将id大于等于5的用户按照proid分组
select * from cts_user where id >=5 group by proid;
#配合聚合函数 GROUP_CONCAT()得到分组详情 COUNT():统计总数 MAX():求最大值 MIN():求最小值
AVG():求平均值 SUM():求组内总和
select id,sex from cts_user group by sex;
select id,sex,group_concat(username) from cts_user group by sex;
select id,sex,group_concat(username) from cts_user group by sex;
select id,group_concat(sex),group_concat(username),group_concat(regtime) from cts_user group by sex;
#查询总用户数
select count(*) from cts_user;
select count(*) as '总人数' from cts_user;
select count(id) as '总人数' from cts_user;
#查询编号,性别,组内用户名详情,组内总人数 组内最大年龄,组内最小年龄,最内平均年龄 组内年龄总和
按照sex分组
select id,sex,group_concat(username) as '用户详情',
count(*) as '总人数',
max(age) as '最大年龄',
min(age) as '最小年龄',
avg(age) as '平局年龄',
sum(age) as '年龄总和'
from cts_user group by sex;
select id,sex,
count(*) as '总人数',
max(age) as '最大年龄',
min(age) as '最小年龄',
avg(age) as '平局年龄',
sum(age) as '年龄总和'
from cts_user group by sex;
# WITH ROLLUP记录上面所有记录的总和
select id,sex,
count(*) as '总人数',
max(age) as '最大年龄',
min(age) as '最小年龄',
avg(age) as '平局年龄',
sum(age) as '年龄总和'
from cts_user group by sex with rollup;
#HAVING 通过HAVING子句对分组结果进行二次筛选,只能使用在分组之后,基于上一个查询再次筛选
#只能用在分组之后,对分组结果的二次筛选,相当于where的意思
select id,sex,group_concat(username) as '用户详情',
count(*) as '总人数',
max(age) as '最大年龄'
from cts_user group by sex
having count(*)>2;
#查询组内总人数大于2并且最大年龄大于60
select id,sex,group_concat(username) as '用户详情',
count(*) as '总人数',
max(age) as '最大年龄'
from cts_user group by sex
having count(*)>2 and max(age)>60;
#查询id为2的用户
select * from cts_user where id=2;
select * from cts_user having id=2;
where:比较运算符 指定范围 指定集合 模糊匹配 是否为空 多个条件
group by: group_concat() count() max() min() avg() sum() with rollup
having:
#ORDER BY通过ORDER BY对查询结果排序,null值最小
#将查询结果按照id排序 默认按照升序排列
select * from cts_user order by id;
#指定按照升序排列 asc 降序:desc
#按照id的升序排列
select * from cts_user order by id asc;
select * from cts_user order by id desc;
#按照age的升序排列
select * from cts_user order by age asc;
#按照多个字段排列
#按照age的升序,proid的降序排列 正常按照age升序排列,如果age相等,则按照proid的降序排列
select * from cts_user order by age asc,proid desc;
#5.12LIMIT限制查询结果显示条数
select * from cts_user limit 3;
#查看id最大的三位用户
select * from cts_user order by id desc limit 3;
#如果limit后有两位数m,n 表示从m+1开始,展示N条数据
select * from cts_user limit 1;
select * from cts_user limit 0,1;
select * from cts_user limit 1,1;
select * from cts_user limit 1,3;
select * from cts_user limit 2,3;
select * from cts_user limit 3,2;
#更新用户名为4位的用户,让其已有年龄-3
update 表名 set 字段=值 条件
update cts_user set age=age-3 where username like '____';
更新前3条记录,让已有年龄+10,
update cts_user set age=age+10 limit 3;
update cts_user set age=age+10 where id<=3;
-- 按照id降序排列,更新前3条,让年龄+10 null加任何值还是null
update cts_user set age=age+10 order by id desc limit 3;
-- 删除用户性别为男的用户,按照年龄降序排列,删除前一条记录
删除掉男性年龄最大的人
delete from 表名 条件
delete from cts_user where sex='男' order by age desc limit 1;
#查询年龄+10大于50的人
select * from cts_user where age+10>50;
#查询全部内容
select * from cts_user;
#查询部分字段;
select 字段1,字段2,字段3 from 表
#数据去重DISTINCT:数据去重
select distinct proid from cts_user;
#链表查询 从两张以上的表中查询内容
#cts_user id username
#provinces proName
select cts_user.id,cts_user.username,provinces.proName from cts_user,provinces;
select cts_user.id,cts_user.username,provinces.proName from cts_user,provinces
where cts_user.proid=provinces.id;
6.1内连接
Select * from 表1 inner join 表2 on 表1.字段名1 = 表2.字段名2
#cts_user id username
#provinces proName
select u.id,u.username,p.proName
from cts_user as u
inner join
provinces as p
on u.proid=p.id;
#cts_news id title
#cts_cate cateName
Select * from 表1 inner join 表2 on 表1.字段名1 = 表2.字段名2
select n.id,n.title,c.cateName
from cts_news as n
inner join
cts_cate as c
on n.cid=c.id;
#内连接也可以使用cross join
select n.id,n.title,c.cateName
from cts_news as n
cross join
cts_cate as c
on n.cid=c.id;
#还可以省略inner
select n.id,n.title,c.cateName
from cts_news as n
join
cts_cate as c
on n.cid=c.id;
Select * from 表1 inner join 表2 on 表1.字段名1 = 表2.字段名2
#查询cts_news id title aid
#查询cts_admin username role id
select n.id,n.title,a.username,a.role
from cts_news as n
join
cts_admin as a
on n.aid=a.id;
Select * from 表1 inner(cross) join 表2 on 表1.字段名1 = 表2.字段名2
#cts_news id title
#cts_cate cateName
#cts_admin username role
select n.id,n.title,c.cateName,a.username,a.role
from cts_cate as c
join
cts_news as n
on n.cid=c.id
join
cts_admin as a
on n.aid=a.id;
#链表查询 内连接 外链接(左连接 有链接 )
内连接 左外连接 右外连接
#左外连接:以左表为基准,展示左表的全部数据,右表不符合的用null值代替
Select * from 表1 left join 表2 on 表1.字段名1 = 表2.字段名2
#内连接
select u.id,u.username,p.proName
from cts_user as u
inner join
provinces as p
on u.proid=p.id;
#左外连接:
select u.id,u.username,p.proName from cts_user as u left join provinces as p on u.proid=p.id;
#右外链接:以右表为基准,展示右表的全部数据,左表中不符合的数据用null值代替
Select * from 表1 right join 表2 on 表1.字段名1 = 表2.字段名2
select u.id,u.username,p.proName from provinces as p right join cts_user as u on u.proid=p.id;
#联合查询 ==也是从两张表中查询数据
UNION 去掉重复的数据
UNION ALL 将查询到的结构列在一起
#cts_user password
#provinces proName
select password from cts_user union select proName from provinces;
select id,username from cts_user union select proName from provinces; #联合查询的时候,两张表的字段数要相同
select id,username from cts_user union select id, proName from provinces;
select username,id from cts_user union select id, proName from provinces;
select proid from cts_user union select id from provinces;
select proid from cts_user union all select id from provinces;
#子查询:将一个查询语句嵌套在另一个查询语句中
CREATE TABLE IF NOT EXISTS department(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
depName VARCHAR(20) NOT NULL UNIQUE
)ENGINE=INNODB;
INSERT department(depName) VALUES('教学部'),
('销售部'),
('运营部'),
('监督部');
-- 创建员工表employee(子表)
-- id ,username ,depId
CREATE TABLE IF NOT EXISTS employee(
id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
depId TINYINT UNSIGNED
)ENGINE=INNODB;
INSERT employee(username,depId) VALUES('ahui',1),
('queen',2),
('张三',3),
('李四',4),
('王五',1);
#用内连接实现查询员工属于哪个部门
#employee id ,username
#department depName
Select * from 表1 inner join 表2 on 表1.字段名1 = 表2.字段名2
select e.id,e.username,d.depName from employee as e join department as d on e.depId=d.id;
#查询我们公司部门都有哪些人
#首先查找我们公司有哪些部门
select id from department; ======1 2 3 4
select id,username from employee where depId in(1,2,3,4);
select id,username from employee where depId in(select id from department);
-- 创建学员表student
-- id username score
CREATE TABLE IF NOT EXISTS student(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
score TINYINT UNSIGNED
);
INSERT student(username,score) VALUES('ahui',95),
('ahui1',35),
('ahui2',45),
('ahui3',55),
('ahui4',65),
('ahui5',75),
('ahui6',80),
('ahui7',90),
('ahui8',25);
-- 创建奖学金scholarship
-- id ,level
CREATE TABLE IF NOT EXISTS scholarship(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
level TINYINT UNSIGNED
);
INSERT scholarship(level) VALUES(90),(80),(70);
#查询获得一等奖学金的人
#如果想获得一等奖学金,最少需要多少分
select level from scholarship where id=1; 90
#如果想获得一等奖学金,最少要大于等于90分
select username from student where score >=90;
select username from student where score >=(select level from scholarship where id=1);
#无法获得奖学金的人
select level from scholarship where id=3; 70
#测试外键 主键 外键 唯一键 自增长 默认值 非空 无符号 零填充
外键:外键中插入的数据是另一张表中主键已有的数据 外键添加在子表上
-- 创建部门表department(主表)
-- id depName
CREATE TABLE IF NOT EXISTS department(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
depName VARCHAR(20) NOT NULL UNIQUE
)ENGINE=INNODB;
INSERT department(depName) VALUES('教学部'),
('销售部'),
('运营部'),
('监督部');
-- 创建员工表employee(子表)
-- id ,username ,depId
CREATE TABLE IF NOT EXISTS employee(
id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
depId TINYINT UNSIGNED
)ENGINE=INNODB;
INSERT employee(username,depId) VALUES('ahui',1),
('张无忌',2),
('张三',3),
('李四',4),
('王五',1);
#查询员工属于哪个部门
select * from 表1 inner join 表2 on 表1.字段名=表2.字段名
select e.id,e.username,d.depName from
employee as e
inner join department as d
on e.depId=d.id;
#删除销售部
delete from department where id=2;
#再次建表,添加外键
drop table department,employee;
Constraint 外键名 Foreign key(子表中外键字段名) references 父表名(父表中主键的字段名)
-- 创建部门表department(主表)
-- id depName
CREATE TABLE IF NOT EXISTS department(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
depName VARCHAR(20) NOT NULL UNIQUE
)ENGINE=INNODB;
INSERT department(depName) VALUES('教学部'),
('销售部'),
('运营部'),
('监督部');
-- 创建员工表employee(子表)
-- id ,username ,depId
CREATE TABLE IF NOT EXISTS employee(
id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
depId TINYINT UNSIGNED,
foreign key(depId) references department(id)
)ENGINE=INNODB;
INSERT employee(username,depId) VALUES('ahui',1),
('张无忌',2),
('张三',3),
('李四',4),
('王五',1);
#再次删除销售部 因为设置了外键,所以无法删除
delete from department where id=2;
#尝试插入垃圾数据 depid=6
insert into employee values(7,'uzhangli',6);
#自定义外键名称
drop table department,employee;
Constraint 外键名 Foreign key(子表中外键字段名) references 父表名(父表中主键的字段名)
-- 创建部门表department(主表)
-- id depName
CREATE TABLE IF NOT EXISTS department(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
depName VARCHAR(20) NOT NULL UNIQUE
)ENGINE=INNODB;
INSERT department(depName) VALUES('教学部'),
('销售部'),
('运营部'),
('监督部');
-- 创建员工表employee(子表)
-- id ,username ,depId
CREATE TABLE IF NOT EXISTS employee(
id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
depId TINYINT UNSIGNED,
constraint emp_fk_dep foreign key(depId) references department(id)
)ENGINE=INNODB;
INSERT employee(username,depId) VALUES('ahui',1),
('张无忌',2),
('张三',3),
('李四',4),
('王五',1);
CASCADE:从父表删除或更新且自动删除或更新子表中匹配的行。
SET NULL:从父表删除或更新行,并设置子表中的外键列为NULL。
如果使用该选项,必须保证子表列没有指定NOT NULL。
-- 创建部门表department(主表)
-- id depName
CREATE TABLE IF NOT EXISTS department(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
depName VARCHAR(20) NOT NULL UNIQUE
)ENGINE=INNODB;
INSERT department(depName) VALUES('教学部'),
('销售部'),
('运营部'),
('监督部');
-- 创建员工表employee(子表)
-- id ,username ,depId
CREATE TABLE IF NOT EXISTS employee(
id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
depId TINYINT UNSIGNED,
constraint emp_fk_dep foreign key(depId) references department(id) on delete cascade on update cascade
)ENGINE=INNODB;
INSERT employee(username,depId) VALUES('ahui',1),
('张无忌',2),
('张三',3),
('李四',4),
('王五',1);
#再次删除销售部
delete from department where id=2;
#将部门表中的id全部+10
update 表名 set 字段=值 条件
update department set id=id+10;
select * from cts_user;
select * from cts_user;
我给你们转5块钱
我的钱少了5块,update
他的钱加了5块,update
2.3 事务的语法
Begin;或者start transaction;
sql语句
commit;/rollback;
Commit 提交,执行当前事务中所有的操作
Rollback:回滚,回到事务开始前的状态
create table if not exists test1(
id tinyint unsigned key auto_increment,
username varchar(20),
password varchar(20)
);
begin;
insert into test1 values(2,'uahui','pahui');
insert into test1 values(3,'uahui','pahui');
insert into test1 values(4,'uahui','pahui');
insert into test1 values(5,'uahui','pahui');
commit;
#数据备份
Mysqldump -u 用户名 [-h host] -p 要备份的数据库名 > 备份后文件的路径及名称
mysqldump -u root -p cts >C:\cts.sql
#备份其中的某张表
mysqldump -u root -p cts cts_user >C:\cts3.sql
-d 只备份表的结构,不包含数据(业务迁移使用)
mysqldump -u root -d -p cts > c:\cts_d.sql
--all-databases 备份所有数据库中的所有表
mysqldump -u root -p --all-databases > c:\cts_all.sql
--lock-all-tables 备份时对数据库进行锁表
防止备份过程中出现同时读取写入的状况,MyISAM必须锁表,默认温备份)
mysqldump -u root -p --lock-all-tables cts > c:\cts_lock.sql
--single-transaction 进行热备份(支持INNODB引擎和其他插件引擎,不支持MYISAM引擎)
mysqldump -u root -p --single-transaction cts > c:\cts_single.sql
#生成一个m-n之间的随机数
floor(rand()*(n-m+1)+m) 30-100
select floor(rand()*(100-30+1)+30);
4-227
select floor(rand()*(224)+4);
select floor(rand(20)*(224)+4);
ahui
ahui
\d ***
create function ahui() returns char(30)
begin
return (select name from cts_user where id=1);
end ***
\d 标识符
CREATE FUNCTION function_name(参数列表)[returns 数据类型]
BEGIN
函数体(sql语句等)
RETURN 返回值类型
END 标识符
\d ***
create function fun1() returns varchar(20)
begin
return (select username from cts_user where id=1);
end ***
在调用之前切换回换来的标识符
\d ;
\d ***
create function fun2(x int(6)) returns int
begin
return 100+x;
end ***
\d ***
create function fun3(x int) returns varchar(20)
begin
return (select username from cts_user where id=x);
end ***
查看函数创建语句:show create function 函数名;
show create function fun1;
show create function fun1;
查看所有函数:show function status [like 'pattern'];
show function status;
show function status like 'fun1';
删除已存在的函数:drop function 函数名
drop table 表名
drop function fun1;
drop function fun1,fun2,fun3;
\d 标识符
CREATE PROCEDURE NAME()
BEGIN
sql语句
END 标识符
\d ***
create procedure pro1()
begin
select host,user,password from mysql.user;
end ***
select * from v$tablespace;
#查看全库所有的用户
select * from dba_users;
#查看某个用户属于哪个表空间
select username,default_tablespace from dba_users where username='SCOTT';
#查询某张表属于哪个表空间 user_tables
select * from user_tables 相当于show tables
select table_name,tablespace_name from user_tables where table_name='EMP';
abcdef
abcdfdsasfsfdsaf
sdaafdfdafa
asfdcs
fds
create table tb1(
id number(5) primary key,
username varchar2(20) not null,
password varchar(20) not null unique,
card number(18) unique,
birth date
);
insert into tb1 (col1) values (to_date('1900/1/1','yyyy-mm-dd'));
insert into tb1 (col1) values (to_date('1900/1/1 12:12:12','yyyy-mm-dd hh24:mi:ss'));
#插入数据
insert into tb1 values(1,'uahui','pahui',34729943,to_date('2020-10-10','yyyy-mm-dd'));
insert into tb1(id,username,password,birth) values(2,'uwuji','pwuji',
to_date('2020-10-10 15:41:20','yyyy-mm-dd hh24:mi:ss'));
ALTER TABLE tb_name RENAME COLUMN old_name TO new_name; 改字段名
alter table tb1 rename column birth to shengri;
ALTER TABLE tb_name MODIFY (col_name type(x)); 改字段属性 需要是空表
alter table tb1 modify(card varchar(20));
mysql中添加删除字段
alter table 表名 add 字段 ,drop 字段
ALTER TABLE tb_name add new_col_name type(x); 添加字段 ===自行百度能否指定位置
alter table tb1 add test1 number(5);
alter table tb1 add test2 number(5) after id;
ALTER TABLE tb_name DROP COLUMN col_name; 删除字段
alter table tb1 drop column test1;
update 表名 set 字段=字段值
update tb1 set username='xiaozhao' where id=1;
delete from 表名 条件
delete from tb1 where username='uwuji';
30.事务、备份、存储过程?
详情:
https://blog.csdn.net/piaoslowly/article/details/81870585?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522160827350716780277039245%252522%25252C%252522scm%252522%25253A%25252220140713.130102334…%252522%25257D&request_id=160827350716780277039245&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-3-81870585.first_rank_v2_pc_rank_v29&utm_term=mysql%E5%B1%82%E6%AC%A1%E6%A8%A1%E5%9E%8B
31.myisam和innodb 的区别?
32.mysql 函数?
33.mysql 范式、约束、层次模型?
三大范式:
第一范式:在满足关系模型基础之上,任意一列必须是原子的(不可分割)
第二范式:在满足第一范式的情况下,必须有一列的数据可以区分每一行的数据(唯一,不能重复,不能为空------->主键)
第三范式:在满足前两范式的情况下,在表和表有连接关系的情况下,如果第一张表(从表,子表)依赖第二张表(主表),那么被依赖的表的字段必须是能够区别每一行的数据的字段(主键,主表,父表)
约束:
主键:primary key 主码 唯一标识每一条记录 非空唯一
外键:foreign key 一个表中某字段可填入数据取决于另一个表的主键已有的数据
唯一键:unique key 一个表中的某字段组合 ,填入数据必须本表中唯一标识本行,可以为空,不能重复
自动增长:auto_increment 新增字段在原来的字段值基础上+1
无符号:unsigned 不可以为负数
零填充:zerofill 数据类型不满足长度用0填充
不为空:not null 字段值不可以为空
默认值:default 不插入数据情况下的默认值
注释:comment 字段的注释
层次模型:
层次模型
优点:
数据结构简单清晰。
因为记录之间的联系用有向边表示,这种联系在DBMS中通常使用指针实现,查询效率高。层次模型数据库性能优于关系数据库,不低于网状数据库。
提供了良好的完整性支持。进行插入操作时,如果没有对应的双亲结点就不能插入它的子女结点值。进行删除操作时,如果删除双亲结点,则相应的子女结点值也将被同时删除。
缺点:
现实世界中的很多联系是非层次性的。如果结点之间具有多对多联系,不再适合使用层次模型表示。如果一个子女结点确实具有多个双亲结点,使用层次结构模型表示的时候就会出现大量的冗余,且操作复杂。
查询子女结点必须通过双亲结点。
由于结构严密,层次命令趋于程序化。
网状模型
优点:
能够更为直接地表示现实世界。
具有良好的性能,存取效率高。
缺点:
结构复杂,伴随应用环境的扩大,数据结构变得越来越复杂,不利于最终用户掌握。
网状模型的数据定义语言和数据管理语言复杂。
由于记录之间的联系通过存取路径实现,应用程序在访问数据的时候必须选择恰当的存取路径,因此用户必须了解系统结构的细节,导致加重了编写应用程序的负担。
关系模型
优点:
关系模型建立在严格的数学概念的基础之上。
关系模型概念单一。无论是实体还是实体之间的联系都用关系来表示。对数据的检索和更新结果也是基于关系(表)的。所以,数据结构简单清晰,用户易懂易用。
关系模型的存取路径对用户透明,从而具有较高的数据独立性,更好的安全保密性,也简化了程序员的工作和数据库开发建立的工作。
缺点:
由于存取路径对用户是透明的,查询效率往往不如格式化数据模型。
为了提高系统性能,数据库管理系统必须对用户的查询请求进行优化。
34.什么是shell 和shell的基本命令?
看书
35.Oracle基本sql语句?
36.5C标准?
Correct(准确):每个组成部分的描述准确,不会引起误解
Clear(清晰):每个部分的描述清晰,易于理解
Concise(简洁):只包含必不可少的信息,不包括任何多余的内容
Complete(完整):包含复现该缺陷的完整步骤和其他本质信息
Consistent(一致):按照一致的格式书写全部缺陷报告