软件知识汇总
一、软件测试阶段
l 按照开发阶段划分
1、单元测试单元测试又称模块测试
是针对软件设计的最小单位——程序模块进行正确性检验的测试工作。其目的在于检查每个程序单元能否正确实现详细设计说明中的模块功能、性能、接口和设计约束等要求,发现各模块内部可能存在的各种错误。单元测试需要从程序的内部结构出发设计测试用例。多个模块可以平行地独立进行单元测试。
2、集成测试集成测试也叫做组装测试
通常在单元测试的基础上,将所有的程序模块进行有序的、递增的测试。集成测试是检验程序单元或部件的接口关系,逐步集成为符合概要设计要求的程序部件或整个系统。
3、确认测试确认测试也叫有效性测试
是在模拟的环境下,验证软件的所有功能和性能及其他特性是否与用户的预期要求一致。通过了确认测试之后的软件,才具备了进入系统测试阶段的资质。
4、系统测试
系统测试是在真实的系统运行的环境下,检查完整的程序系统能否和系统(包括硬件、外设、网络和系统软件、支持平台等)正确配置、连接,并最终满足用户的所有需求,系统测试这个称呼往往被用于压力测试、容量测试、性能测试、安全测试等方面。
5.验收测试是软件产品检验的最后一个环节
按照项目任务书或合同、供需双方约定的验收依据文档进行的对整个系统的测试与评审,决定是否接收或拒收系统。
l 单元测试
单元测试是指,对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,这里的最小可测试单元通常是指函数或者类。
单元测试都是以自动化的方式执行,所以在大量回归测试的场景下更能带来高收益。
单元测试代码里提供函数的使用示例,因为单元测试的具体表现形式就是对函数以各种不同输入参数组合进行调用。
l 集成测试
集成测试:是在软件系统集成过程中所进行的测试,其主要目的是检查软件单位之间的借口是否正确。它根据集成测试计划 ,一边将模块或其他年间单位组合成越来越大的系统,一边运行该系统,以分析所组成的系统是否正确,各个组成部分是否合拍。集成测试的策略主要有自顶向下和自底向上两种。也可以理解为在软件设计单元、功能模块组装、集成为系统时,对应用系统的各个部件(软件单元、功能模块接口、链接等)进行的联合测试,以决定他们能否在一起共同工作,部件可以是代码块、独立的应用、网络上的客户端或服务器端程序。
l 系统测试
系统测试:系统测试是基于软件需求说明书的黑盒测试,是对已经集成好的软件系统进行彻底的测试,以验证软件系统的正确性和性能等满足其规约所指定的要求,检查软件的行为和输出是否正确,并非一项简单的任务,被称为测试的“先知者问题”。因此,系统测试应该按照测试计划进行,其输入、输出和其他的动态运行行为应该与软件规约进行对比。软件系统测试的方法很多,主要有功能测试,性能测试,随机测试等。
二、功能测试六要素
1 需求分析与确认
意义与作用:需求的准确性与必要性是项目成功的前提,同时能够帮助开发与测试更好的完成工作,明确工作内容并做出相应的计划。
2 测试点
测试点就是针对需求所设计的,在完成需求确认后就可以确定测试点。
3 编写测试用例
测试用例就是保证测试点能够被正确的数据覆盖。
4 执行测试用例
当开发把相应模块功能完成,就可以执行设计好的测试用例。
5 缺陷管理
将不通过的测试用例提交给开发进行反馈与追踪。
6 总结测试报告
对测试缺陷进行分析统计,对本次测试实施进行总结。
三、需求分析角度
l 了解需求的商业价值
只有明白这个需求有什么商业价值,我们才能更加的明确我们该站在用户的角度去判断。
l 站在用户的角度
比如说我们的用户、产品提出来的需求,你是一个普通的用户角度去判断这个需求。
l 站在产品的角度
【显性需求】 输入正常的用户名和密码,能登录
【隐性需求】 用户名、密码长度是否可以为空,密码字符串,验证码是否可以为空
【功能性需求】 基本上显性+隐形就等于功能性需求
【非功能性需求】 用户的体验感,性能,可靠性,安全性,易用性,可维护,继承性等
四、软件测试模型
l v模型
需求分析-概要分析-详细设计-编码-单元测试-集成测试-系统测试-验收测试
l w模型
模型是V模型的发展,强调的是测试伴随着整个软件开发周期,而且测试的对象不仅仅是程序,需求、功能和设计同样要测试。测试与开发是同步进行的,从而有利于尽早地发现问题。
l h模型
H模型中, 软件测试过程活动完全独立,贯穿于整个产品的周期,与其他流程并发地进行,某个测试点准备就绪时,就可以从测试准备阶段进行到测试执行阶段。软件测试可以尽早的进行,并且可以根据被测物的不同而分层次进行。
五、软件测试流程
1 分析测试需求
测试人员在制订测试计划之前需要先对软件需求进行分析,以便对要开发的软件产品有一个清晰的认识,从而明确测试对象及测试工作的范围和测试重点。在分析需求时还可以获取一些测试数据,作为测试计划的基本依据,为后续的测试打好基础。测试需求分析其实也是对软件需求进行测试,测试人员可以发现软件需求中不合理的地方,如需求描述是否完整、准确无歧义,需求优先级安排是否合理等。
2 制订测试计划
测试工作贯穿于整个软件开发生命周期,是一项庞大而复杂的工作,需要制订一个完整且详细的测试计划作为指导。测试计划是整个测试工作的导航图,但它并不是一成不变的,随着项目推进或需求变更,测试计划也会不断发生改变,因此测试计划的制订是随着项目发展不断调整、逐步完善的过程。
测试计划一般要做好以下工作安排。
① 确定测试范围:明确哪些对象是需要测试的,哪些对象不是需要测试的。
②制订测试策略:测试策略是测试计划中最重要的部分,它将要测试的内容划分出不同的优先级,并确定测试重点。根据测试模块的特点和测试类型(如功能测试、性能测试)选定测试环境和测试方法(如人工测试、自动化测试)。
③安排测试资源:通过衡量测试难度、时间、工作量等因素对测试资源进行合理安排,
包括人员分配、工具配置等。
④安排测试进度:根据软件开发计划、产品的整体计划来安排测试工作的进度,同时还要考虑各部分工作的变化。在安排工作进度时,最好在各项测试工作之间预留一个缓冲时间以应对计划变更。
⑤预估测试风险:罗列出测试工作过程中可能会出现的不确定因素,并制订应对策略。
3 设计测试用例
测试用例(Test Case)指的是一套详细的测试方案,包括测试环境、测试步骤、测试数据和预期结果。不同的公司会有不同的测试用例模板,虽然它们在风格和样式上有所不同,但本质上是一样的,都包括了测试用例的基本要素。
测试用例编写的原则是尽量以最少的测试用例达到最大测试覆盖率。测试用例常用的设计方法包括等价类划分法、边界值分析法、因果图与判定表法、正交实验设计法、逻辑覆盖法等。
4 执行测试
执行测试就是按照测试用例进行测试的过程,这是测试人员最主要的活动阶段。在执行测试时要根据测试用例的优先级进行。测试执行过程看似简单,只要按照测试用例完成测试工作即可,但实则并不如此。测试用例的数目非常多,测试人员需要完成所有测试用例的执行,每一个测试用例都可能会发现很多缺陷,测试人员要做好测试记录与跟踪,衡量缺陷的质量并编写缺陷报告。
当提交后的缺陷被开发人员修改之后,测试人员需要进行回归测试。如果系统对测试用例产生了缺陷免疫,测试人员则需要编写新的测试用例。在单元测试、集成测试、系统测试、验收测试各个阶段都要进行功能测试、性能测试等,这个工作量无疑是巨大的。除此之外,测试人员还需要对文档资料,如用户手册、安装手册、使用说明等进行测试。因此不要简单地认为执行测试就是按部就班地完成任务,可以说这个阶段是测试人员最重要的工作阶段。
5 编写测试报告
测试报告是对一个测试活动的总结,对项目测试过程进行归纳,对测试数据进行统计,对项目的测试质量进行客观评价。不同公司的测试报告模板虽不相同,但测试报告的编写要点都是一样的,一般都是先对软件进行简单介绍,然后说明这份报告是对该产品的测试过程进行总结,对测试质量进行评价。
一份完整的测试报告必须包含以下几个要点。
·引言:描述测试报告编写目的、报告中出现的专业术语解释及参考资料等。
·测试概要:介绍项目背景、测试时间、测试地点及测试人员等信息。
·测试内容及执行情况:描述本次测试模块的版本、测试类型,使用的测试用例设计方法及测试通过覆盖率,依据测试的通过情况提供对测试执行过程的评估结论,并给出测试执行活动的改进建议,以供后续测试执行活动借鉴参考。
·缺陷统计与分析:统计本次测试所发现的缺陷数目、类型等,分析缺陷产生的原因,给出规避措施等建议,同时还要记录残留缺陷与未解决问题。
·测试结论与建议: 从需求符合度、功能正确性、性能指标等多个维度对版本质量进行总体评价,给出具体明确的结论。
·测试报告的数据是真实的,每一条结论的得出都要有评价依据,不能是主观臆斯的。
六、Cookie,Session,Token三者的区别
l Cookie
cookie网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密),发送请求时,cookie会随着请求头一起发给服务器, cookie储存于浏览器
作用:识别用户信息,储存用户数据
cookie具有时效性,存活时间取决于不同的网站,在cookie未失效时,若再次登录该网站,则会自动登录,不需要重新输入账号与密码
网站给我们投放我们搜索浏览内容相关的广告是因为cookie储存着我们的浏览信息,浏览器为了恰饭,会查看我们的cookie从而推送相应的广告
l Session
session是服务器为了保存用户状态而创建的一个特殊的对象。session储存在服务器
当用户第一次登陆网站时,服务器会生成一个session,并将该sessionID发送给用户储存在cookie中,当第二次发送请求时,sessionID就随着cookie一起发送,浏览器就可以识别出是谁发送的请求
当用户离开网站时,储存的session会被销毁
l cookie与session的区别
1,储存位置:cookie储存在浏览器,session储存在服务器
2,安全性:session比cookie更加安全,cookie容易造成cookie欺骗
3,存储的数据类型不同:cookie只支持字符串数据,session可以储存任意类型数据、
4,有效期不同:cookie存活时间可设置较长时间,而session存活时间相对较短,服务端关闭等都会丢失session
5,存储大小不同:单个cookie的数据不能超过4KB,session储存的数据内容可以更大,但是session过多会占用更多的服务器资源
l Token
Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
作用机制:服务器并不保存token,而是通过数据签名的方法,对数据用算法(如SHA-256)与私钥进行签名后作为Token,当Token发送给服务器时,服务会通过相同的算法与密钥进行签名,如果和Token中的签名相同,服务器就知道用户已经登录过了,并且可以直接得到用户的userID。(服务器用cpu的计算时间来换取了储存空间)
七、网络协议
1、OSI七层网络协议
2、TCP/IP 四层模型
3、三次握手、四次挥手
Tcp三次握手
Tcp四次挥手
八、http请求返回状态码
l 返回状态码介绍
1xx:表示服务器已接收了客户端的请求,客户端可以继续发送请求
2xx:表示服务器已成功接收到请求并进行处理
3xx:表示服务器要求客户端重定向
4xx:表示客户端的请求有==非法内容==
5xx:标识服务器未能正常处理客户端的请求而出现意外错误
l 常见状态码说明
200 OK: 表示客户端请求成功
400 Bad Request: 表示客户端请求有语法错误,不能被服务器端解析
401 Unauthonzed: 表示请求未经授权,该状态码必须与
WWW-Authenticate 报文头一起使用
404 Not Found:请求的资源不存在,例如输入了错误的 url
500 Internal Server Error: 表示服务器发生了不可预期的错误,导致无法完成客户端的请求
503 Service Unavailable:表示服务器当前不能处理客户端的请求,在一段时间后服务器可能恢复正常
九、测试用例知识点
l 测试用例编写流程
· 需求分析
· 提取测试点
· 测试用例编写
· 测试用例评审
l 测试点内容
1、UI测试; 2、功能测试; 3、性能测试; 4、安全性测试
5、兼容性测试;6、易用性测试
l 测试用例包含的内容
1、测试用例编号;2、测试项目;3、测试用例标题;4、重要级别;
5、预置条件; 6、测试输入;7、操作步骤; 8、预期结果;
9、实际结果; 10、备注。
l 测试用例编写的方法
1、等价类划分法:
如何选择适当的数据子集,来代表整个数据集。通过降低测试的数据去实现“合理的”覆盖,覆盖了更多的可能数据,以发现更多的软件缺陷。
2、边界值分析法:
使用边界值分析方法设计测试用例时一般与等价类划分结合起来,但它不是从一个等价类中任选一个例子作为代表,而是将测试边界情况作为重点目标,选取正好等于、刚刚大于或刚刚小于边界值得测试数据。
3、场景法:
通过运用场景来对系统的功能点或业务流程的描述,从而提高测试效果。场景法一般包含基本流和备用流,从业一个流程开始,通过描述经过的路径来确定的过程,经过遍历所有的基本流和备用流来完成整个场景。
4、错误推测法:
根据经验选择容易出错的地方,测试用例评审流程及意义。
5.判定表法:
又称为策略表,基于策略表的测试,是功能测试中最严密的测试方法。该方法适合于逻辑判断复杂的场景,通过穷举条件获得结果,对结果再进行优化合并,会得到一个判断清晰的策略表。
6.正交实验法:
用语言描述正交实验法会很抽象难懂,简单说,就是在各因素互相独立的情况下,设计出一种特殊的表格,找出能以少数替代全面的测试用例。
7.因果图:
形式化的语言,不仅描述了原因和结果之间的关系,也描述了各个原因之间、各个结果之间复杂关系的组合。因是程序的输入条件,而果则是程序的输出。
十、手机端App测试流程和方法
手机端app测试流程和方法:一般原生App都使用系统的方法来完成开发和提交。因为App框架是基于本地+H5的,H5负责显示和交互。由Android和iOS本机预定义一些统一的界面,h5直接调用,从而免除复杂的兼容性判断,大大减少前端工作,同时使性能更好。与此同时这里也可以看到接口测试最重要的一方面:兼容性测试,测试需要尽可能覆盖系统版本、分辨率、型号等。手机端的app测试流程和方法如下:
1. 测试资源的确认和准备工作
(1)产品需求文件、产品原型图、界面描述文件、设计说明文件等应齐全;
(2)准备测试设备和工具:IOS和andriod不同版本的真机,以及相关测试工具的准备工作。
2. 测试用例设计和评审
(1)根据产品需求文件、产品原型图等文件,设计客户通用功能测试用例;
(2)测试用例评审、修改和完善,评审通过后即进入正式测试阶段。
3. 用户界面测试
(1)确保原型图和效果图是最新版本,以满足产品经理和用户的要求;
(2)在测试过程中一切以效果图为准,如有用户经验建议,可先以邮件的形式与产品经理确认,确认通过后,可正式向开发提出用户体验方面的问题;
(3)由于测试环境中的数据是模拟的,所以在测试时必须事先考虑正式环境中可能出现的数据类型。
4. 功能试验
(1)在功能测试时,主要根据编写的功能测试用例浏览软件功能;
(2)测试主要包括基本功能测试、安装、卸载、运行测试、异常处理(包括网络突然断开、网速太慢、机器内存不足等)测试。
5. 中断试验
(1)软件运行过程中,接听电话、收发短信、锁屏、闹铃、充电,收到通知后再使用软件,软件应仍能正常使用;
(2)软件运行时,从前台切换到后台,再切回前台后,应仍能正常使用。
6. 相容性和相容性试验
(1)硬件适配:不同手机厂商、硬件性能、屏幕尺寸适配;
(2)OS版本的兼容性:IOS6-9;Andriod3以上,等等,如果使用一些新的API在老系统上不支持会导致crash;
(3)不同分辨率屏幕的匹配:移动设备的分辨率多种多样,如果app没有做一个比较合适的处理就有可能显示不好,甚至影响到功能的操作;
(4)兼容性测试必须在一定数量的真机上进行,由于真机类型太多,特别Android在做兼容性测试时,可选择几种典型应用较多的真机,进行兼容性测试;
(5)通过开放源码测试testin云测试仪,进行更多型号的兼容性测试,testin云测提供基本运行情况和一些截图,以及简单的测试报告,帮助扩展测试范围。
7. 绩效检验
(1)客户端性能测试主要集中在:安装卸载时间、引导时间、页面加载时间、主要功能占用CPU、内存、流量、电量等,以及与同类产品相比是否具有优势;
(2)页面加载时间可以通过Android调试工具DDMS获得,在DDMS内搜索Displayed关键字即可看到页面加载时间;
(3)运行期间主要功能所占用的CPU、内存、流量等可借助开源工具emmagee(适用于Android)获得;
(4)至于服务器端的性能,主要是使用接口对服务器施加压力,把重点放在响应时间、吞吐量、并发数、事件通过率等等上,它可以被看作是工具loadrunner,jmeter。
8. 稳定性试验
(1)安卓APP的稳定性通常是用monkey命令来测试的,它通过随机事件来模拟人的动作,可以有效地检查程序的内存溢出、空指针;
(2)Monkey主要用于检测系统ANR和Crash问题。
9. 测试分析和测试报告输出
在完成上述各项测试之后,应形成一个完整的分析和报告文档(包括buglist、性能和稳定性结果分析、版本上线风险分析等),输出给相关人员。
- APP测试总结
一、APP测试流程
移动应用软件开发的周期一般都比较短,基本都是敏捷开发,而且开发的模式跟传统互联网也有一些差异。通常开发模式都采用平行模式,开发人员比较少,但是分工比较明确,各团队之间(Android、IOS、后台)根据指定好的接口进行联调,也就是集成测试。
APP的整个研发的周期一般在2~3个月左右,具体根据产品功能的复杂度来确定,而且测试周期一般是1~3周左右,所以测试人员比较少,大多数都是一个人负责,所以要求测试工程师熟悉APP的整个测试的流程和方法。
APP的测试流程如下:
1.计划阶段
首先要确认产品的需求文档、原型设计图、接口文档以及相关的说明文档,然后根据这些文档规划项目的测试计划,整理测试思路,最后确认测试设备(Android和ISO不同版本的真机)以及测试工具。
2.设计阶段
测试用例的设计,通常根据业务流程结合用例设计方法来设计测试用例,然后在项目组内召开用例评审会,评审通过后再将测试用例进行归档。
3.执行阶段
为了测试数据的准确,通常都是使用实体机执行测试用例。如果发现Bug,经确认后在缺陷管理工具中提交Bug单,等待开发修复,然后再进行回归测试。如果回归测试不通过,重新激活Bug;如果回归测试通过,将Bug状态修改为关闭状态;如果开发人员拒绝修改Bug,则进行沟通交流,还可以在项目组内开会讨论。
4.评估报告阶段
对遗留Bug进行风险评估,并给出处理方式以及意见,最后编写测试报告,待项目上线后进行测试总结。
二、APP测试方法
要想做好APP测试,首先需要了解Android与IOS操作系统的区别,再熟悉APP测试的方法,才能更全面进行测试,建议采用真机进行测试。
1. Android与IOS
Android最早成立于2003年,在2005年被Google收购,现归属Google。在2008年9月发布了第一个版本Android1.0,代表产品是T-Mobile G1,这个产品是Android系统很重要的里程碑。Android是Google开发、发行的一个智能的、开放式的软件平台。它的内核是Linux,其应用程序都用Java编程语言来编写。由于Android的运行机制采用虚拟机,系统需要占用大量内存来换取执行速度,再加上不定期的内存自动回收机制,从而导致出现卡顿的现象。IOS是苹果公司在2007年1月推出的封闭式手机操作系统,它指定使用的一种开发语言——Objective-C语言。它的运行机制采用沙盒运行,整个运行过程中不需要虚拟机,所以相比Android来看其执行效率要高一点。
由于Android是采用了开放的策略,所以很多厂商对其进行了订制。这也使得Android手机在设计上相比IOS变得多样化,但是同时带来安全隐患,也就是说在测试APP软件时,Android的安全性比IOS要考虑得多一些;同时在测试兼容性时,Android也比IOS考虑得多一些。由于Android的设备比较多,基于市面上的辅助工具也比IOS要应用要广泛一些。另外还需要注意的是系统版本,Android系统的版本可升、可降,而IOS系统的版本只能升级(越狱除外)。
除了上述问题之外,APP测试最大的问题是网络的不稳定以及隐私的安全问题。
2. UI测试
UI测试即用户界面测试,具体测试方法如下:
1)首先确保UI界面设计符合国家的、行业的、企业的标准规范;
2)关注窗口、菜单、对话框以及按钮控件的布局、风格是否满足用户要求;
3)不同页面中控件大小、风格是否一致;
4)页面中颜色的搭配是否合理,整体的颜色不宜过多;
5)文字的提示是否友好,是否存在敏感词、关键词等;
6)操作是否简单、人性化,是否有帮助指引;
7)自适应界面设计,内容是否根据窗口的大小自适应调整;
8)图片是否涉及版权、隐私、专利等问题。
3. 功能测试
能测试就是验证各个功能是否与需求实现一致,可以从以下几个方面进行测试:
3.1 安装卸载
1)在不同的操作系统下验证安装卸载是否正常,如Android、IOS等;
2)软件是否可以通过第三方工具进行安装、卸载;
3)安装卸载过程中是否可以取消;
4)安装卸载过程中出现异常处理是否妥当,如重启、死机、断电、断网等;
5)安装过程中空间不足是否有提示信息;
6)安装文件是否写到指定的目录里,卸载后所有的文件及文件夹是否全部删除;
7)卸载后是否可以重新安装,安装后数据是否同步,功能是否正常;
8)重复安装是否会有提示信息;
9)直接卸载程序是否有提示信息。
3.2 启动运行
1)安装后启动软件测试功能是否可以正常运行;
2)首次打开软件是否有访问提示,如允许访问通讯录、获取地理位置等;
3)首次启动运行时速度是否满足要求,页面之间切换是否流畅。
3.3 注册登录
1)注册时要考虑用户名和密码的长度、格式是否有限制或规则要求等;
2)重名注册是否有提示信息;
3)注册成功后,用户是否可以正常登录;
4)软件是否有快捷登录,如手机号码,获取验证码之间进行登录;
5)是否支持第三方账号登录,如QQ、微信、微博等账号;
6)登录时密码输入错误次数有没有限制;
7)登录时网络中断是否会有友好提示;
8)APP是否实现免登录功能;
9)当用户主动退出后,下次启动APP应切换到登录界面。
3.4 前后台切换
1)APP切换到后台,再次返回APP时,是否停留在上一次操作的界面;
2)APP切换到后台,再次返回APP时,功能是否正常,数据是否更新;
3)手机锁屏后,再解锁进入APP,功能是否正常,数据是否更新;
4)出现提示信息后,切换到后台,再次返回APP,检测提示信息是否存在;
5)多个APP软件之间切换,功能是否正常,数据是否更新;
6)使用APP时,与手机功能的交互测试,如来电话、收短信、闹钟等。
3.5 升级更新
1)当APP有新版本时,是否有更新提示信息;
2)当版本为非强制升级更新时,不更新是否可以正常使用;
3)当不更新退出后,下次启动APP,是否仍然有提示更新信息;
4)设置APP软件自动升级更新时,在无wifi的情况下,是否自动更新;
5)当版本为强制升级更新时,不更新是否可以正常使用;
6)升级更新后功能是否正常使用,数据是否会同步。
3.6 异常测试
1)电量测试,如电量10%、50%、90%时,验证APP功能是否正常;
2)低电量提示时,验证APP功能是否正常;
3)充电、拔电时,验证APP功能是否正常;
4)弱网测试,模拟2G、3G、4G、wifi时,验证APP功能是否正常;
5)模拟网络2G、3G、4G、wifi之间的切换,验证APP功能是否正常;
6)离线测试,检查APP是否支持离线浏览;
7)Push测试,检查用户在免打扰模式下能否接受Push。
4. 性能测试
APP的性能测试分手机端和服务端的性能。
4.1 手机端性能
手机端性能主要检查资源问题,如CPU,内的占用,耗电量、流量的情况。
(1)CPU占用
据经验表明,在使用APP软件时,如果CPU占用率低于20%表示为最佳状态,如果CPU占用在20%~60%之间表示资源使用比较稳定,如果CPU占用率在60%~80%之间表示资源使用饱和,如果CPU占用率超过80%属于性能的瓶颈,必须尽快进行资源调整与优化。
(2)内存使用
手机的内存是非常有限的,为每个APP进程分配的私有内存也是有限制。一方面,要合理的申请内存使用,以免导致内存溢出;另一方面,要及时释放内存,以免发生内存泄漏。不合理使用内存,经常会造成APP软件出现无响应、死机、崩溃、闪退等现象。
(3)耗电量
智能手机的电池都是内嵌的,它的电量也是非常有限的,而且智能手机本身耗电量就比较多(如屏幕、GPS定位、传感器等),所以在进行APP测试时,必须要检查APP的电量使用,以免导致手机耗电发热,带来不良的影响。
(4)流量的使用
目前手机网络类型主要包含2G、3G、4G、wifi,其中还有不同运营商的区分,在使用APP软件时,经常遇到重复请求、响应慢等各种情况。在测试时要注意不同的网络下,流量的使用。
可以借助一些Monkey工具来检测Android手机端的性能问题。
4.2 服务端性能
APP服务端性能跟Web性能大同小异,主要是模拟大量手机用户调用接口对服务器产生负载。可以使用Loadrunner12.0以上(或者Loadrunner11.0+补丁包Patch3)、Jmeter、HyperPacer等工具,进行并发测试、负载测试、压力测试等。
5. 安全测试
近年来,移动APP存在一个非常重要的问题就是安全问题,即用户的隐私泄漏。针对APP的安全测试可以参考以下几个方面。
5.1 安装包安全性
1)首先验证安装包是否对签名进行了校验,以防止被恶意第三方应用覆盖安装等;
2)开发人员是否对源代码进行混淆,以免被反编译软件查看源代码;
3)用户隐私,特别是访问通讯录,需要对特定权限进行检查。
5.2 用户安全性
1)用户拨打电话、发短信、连接网络等是否存在扣费的风险;
2)用户密码在传输中是否进行加密,在数据库中存储是否进行了加密;
3)免登录是否设置了过期时间;
4)用户的账号、密码等敏感数据是否存储在设备上;
5)当用户注销账号时需要身份验证的接口是否可以调用;
6)对Cookie的使用是否设置了合理的过期时间。
5.3 数据安全性
1)用户的敏感数据是否写到日志或配置文件中;
2)当用户使用敏感数据时是否给用户提示信息或安全警告;
3)在输入敏感数据时是否支持第三方输入法输入;
4)用户输入的数据是否进行了数据合法性的校验;
5)在含有敏感数据的连接中是否使用了安全通信,如HTTPS;
6)对安全通信的数字证书是否进行合法的验证。
5.4 通信安全性
1)所有手机的功能应优先处理,如接电话、收短信等;
2)当网络中断或出现异常时需要给用户网络异常的提示;
5.5 服务端安全性
服务端主要关注接口,其安全性跟Web端的安全性类似,主要考虑SQL注入、XSS跨站脚本攻击、CSRF跨站请求伪造以及越权访问等。
6. 兼容性测试
众所周知,APP兼容性测试是一个耗时、耗人力,而且成本很高的测试工作,且APP兼容性测试又是一项必须要进行的测试活动,其测试时主要考虑手机端的软、硬件兼容性,一方面要考虑与主流APP的兼容性;另一方面又要考虑手机设备的兼容性,如不同品牌的手机,不同的操作系统,不同手机的屏幕分辨率等。
具体的测试方法可以使用模拟器来进行模拟不同的手机品牌、系统、分辨率进行测试,但是模拟器测试的数据会有差异,针对一些实力雄厚的公司,建议购买真机进行测试。还可以借助第三方工具(如Spider工具)以及云测试平台来进行测试,这样可以即能保证兼容质量的同时、又能高效地完成APP兼容性测试的覆盖。
7. 接口测试
不管是Web端还是APP接口,其测试的方法思路大致相同(请参考Web端接口测试)。
8. 用户体验测试
由于APP软件的研发人员、研发周期以及测试周期都比较短,所以进行用户体验测试在APP测试中是一项非常有必要的测试活动。通常公司组织内部人员,从用户的角度来评价产品的特性,提出修改意见,从而提升客户的满意度。体验可以从以下几点考虑:
1)UI界面的设计,从用户视觉评价产品;
2)使用真机对手机兼容性进行体验测试;
3)用户的指引设计是否合理;
4)APP页面跳转设计和深度是否合理;
5)体验锁屏、横竖屏的设计以及各种异常操作等。
三、APP测试工具(ADB、AAPT、Monkey、DDMS、Fiddler)
工具这块就不展开了
四、APP测试和Web测试的区别
不管是APP测试,还是Web测试,相对于测试而言,其测试流程、测试思路都没有太大区别。由于测试环境不一样,测试涉及的工具不同,测试方法考虑略有不同,其主要的区别归纳为以下几点:
1. 系统架构不同
Web项目主要是基于浏览器的B/S架构,当Web服务端更新后,客户端就会同步更新。而APP项目主要是基于手机端的C/S架构,当APP服务端更新后,如果更新版本为强制更新版时,则手机端必须更新,否则功能无法使用;如果更新版本不是强制更新,手机端可以选择性更新,此时除了测试新版本以外,还要测试老版本的核心功能是否受到影响。
2. 测试方法不同
1)功能测试,测试思路同样为逐一分析软件质量的六大特性,唯一不同的是Web项目不支持离线浏览,有些APP支持离线浏览,待有网络时再同步更新数据。
2)性能测试,Web项目的主要关注服务器的压力以及Web页面的响应,而APP项目除了考虑服务端的压力之外,还需要考虑手机端的性能,主要是内存使用问题。
3)兼容性测试,Web项目主要考虑浏览器的兼容性,而APP项目需要考虑不同设备,不同系统、不同系统的版本、不同分辨率等。
4)专项测试,相对于Web测试,在APP测试中多了一些专项测试,如电量测试、弱网测试、安装卸载、升级更新、中断测试、访问权限测试以及用户体验测试等。
3. 测试工具不同
自动化测试工具:APP一般使用Monkey Runner和Appium;而Web端一般使用QTP和Selenium。
性能测试工具:APP一般使用HyperPacer、Monkey、Jmeter、Loadrunner12.0;而Web端一般使用Jmeter和Loadrunner。
弱网测试工具:Fiddler、Network Link Conditioner(IOS)。
五、H5页面测试
2014年10月29日,万维网联盟宣布,H5的标准规范制定完成,它是超文本标记语言(HTML)的第五次重大修改,简称H5。HTML5的设计目的是为了在移动设备上支持多媒体,它还引进了新的功能,可以真正改变用户与文档的交互方式。所以在进行H5测试需要注意以下几点:
1. 功能相关
1)关注每个页面的请求是否正确,是否有重复。
2)关注APP缓存,清除缓存后功能是否正确,获取数据失败后是否有重试机制。
3)关注在登录时H5与Native切换。
4)关注页面的加载与刷新,加载的
5)关注网络问题,特别是弱网以及网络之间的切换,对H5页面有没有影响。
6)关注前后台切换时页面的情况。
7)关注mtop接口的处理。
2. 性能相关
1)关注每个页面的加载时间、大小以及请求数。
2)关注弱网下页面的响应。
3)是否适当添加本地缓存。
3. H5适配
1)关注不同品牌手机的浏览器。
2)关注不同品牌手机屏幕大小和分辨率问题。
十一、WEB端测试测试流程与方法
1、需求分析
了解具体需求
2、测试准备
原型图、效果图、需求文件、测试用用例、用例评审、各种测试数据准备
3、测试环节
1)冒烟测试:对版本质量的控制以及此版本是否具备测试条件;
2)UI测试:核对效果图
3)功能测试:核对需求文件测试用例,对功能进行验证
4)兼容测试:各个浏览器,手机是否兼容
5)性能测试,服务器接口,多线程等压测
6)安全测试
7)易用性测试:界面与交互性测试,符合交互规范,用户体验良好,使用方便快捷
8)提交bug,争议bug评审,回归测试
9)自动化测试
a、ui自动化测试 :一般使用python+selenium进行ui自动化测试
4、产品上线
发布功能,上线验证,发布上线报告
十二、WEB端和手机端测试区别
1.技术层面
WEB测试和移动端测试其测试类型也基本相似,都需要进行功能测试、性能测试、安全性测试、GUI测试等测试类型。
他们的主要区别在于具体测试的细节和方法。
web项目,一般都是b/s架构,基于浏览器的,而app则是c/s的,是有客户端的。
2.系统架构
web测试只要更新了服务器端,客户端就会同步更新;
而如果是app下修改了服务端,意味着客户端用户所使用的核心版本都需要进行回归测试一遍。
3.客户端性能
web页面可能只会关注响应时间,app则还需要关心流量、电量、CPU、GPU、Memory这些了。
4.兼容方面
web是基于浏览器的,所以更倾向于浏览器(IE、chrome、Firefox)和电脑硬件,电脑系统的方向的兼容;
app的测试则必须依赖手机或者pad,不仅要看分辨率,屏幕尺寸,重要看设备系统。
5.app的专项测试
1)多网测试:无线网络、2G、3G、4G等,断网、网速较差及网络之间的切换时页面的显示等,此外,在非wifi下,还需要注意网络使用量问题。
2)中断测试:如电话、短信、通知、断电等,软件需要处理这些特殊情况。
3)安装测试:除了常规的安装、更新、卸载时的用户数据处理外还要考虑到异常场景。包括安装时的中断、弱网、安装后删除安装文件、增量包更新、断点续传;升级测试的提醒机制,升级取消是否会影响原有功能的使用,升级后用户数据是否被清除。
4)界面测试:如不同尺寸规格的图文在不同屏幕的显示;对于触摸屏手机,测试时还要注意手势,横竖屏切换,多点触控等测试。
5)弱网测试:需要测试弱网所造成的用户体验,可从功能,性能,异常处理,场景特性等几个维度来考虑。
功能:在弱网下,做功能测试,不仅是次性能测试,也是一种可靠性测试。
性能:从app的热启动、页面切换、前后台切换测试app的响应时间。尤其是H5的页面需要测试首屏时间,是否有302跳转,页面大小等,否则会出现各种白屏、闪屏、转菊花等。另外可通过网络请求API的整体时间,response以及body大小来推断是服务器处理的慢,还是需要治理传输包;如果时间很少,body又小,还很慢的话,这下就是客户端程序的问题。
强网络形态场景:有些场景就必须是开着wifi才能做的;比如微信的升级就会监听用户是否插着电,连着wifi,一旦监听到了,方可通知升级。
容错机制:主要是考虑弱网情况下带来的不稳定,等待超时 ANR了,或者直接异常闪退了。这些的处理,一定要做的优雅,所以异常信息的文案一定要做的漂亮。
重连机制:涉及两块,一块是客户端是否会重发请求,一块是服务端是否接受重连。配合超时机制,多久没有得到反馈才会发起重连,失败几次会不允许重连。
无网状态测试:首先无网下页面呈现;其次数据完整性和session一致性;另外,还需要关注的是,无网状态下会不会还不断的请求网络,不断的做网络相关的操作。从无网状态恢复到有网络,会不会有请求堆积?
十三、软件接口测试流程与方法
1、需求分析
接口之间的逻辑关系,接口文档具体了解
2、测试准备
接口文档、接口测试用例、各种测试数据准备
3、测试环节
1)功能测试:功能否按照接口文档实现
2)业务逻辑:是否依赖业务
3)参数异常:a关键字参数(语言中的关键字)、b参数为空、c多少参数、d错误参数
4)数据异常:a关键字数据、b数据为空、c长度不一致(长处数据库字段长度)、d错误数据
5)安全:cookie、header(特别是移动端使用)、唯一识别码(客户端常用)
6)回归测试
7)自动化测试:一般使用python+requests进行接口自动化测试
4、产品上线
发布功能,上线验证、发送上线报告
5、使用工具
1、接口测试和接口文档生成工具:apipost
2、接口测试接口性能测试工具:jmeter
十四、WEB性能测试指标
一般来说,一个Web请求的处理包括以下步骤:
(1)客户发送请求
(2)web server接受到请求,进行处理;
(3)web server向DB获取数据;
(4)webserver生成用户的object(页面),返回给用户。给客户发送请求开始到最后一个字节的时间称为响应时间(第三步不包括在每次请求处理中)。
1.事务(Transaction)
在web性能测试中,一个事务表示一个“从用户发送请求->web server接受到请求,进行处理-> web server向DB获取数据->生成用户的object(页面),返回给用户”的过程,一般的响应时间都是针对事务而言的。
2.请求响应时间
请求响应时间指的是从客户端发起的一个请求开始,到客户端接收到从服务器端返回的响应结束,这个过程所耗费的时间,在某些工具中,响应通常会称为“TTLB”,即"time to last byte",意思是从发起一个请求开始,到客户端接收到最后一个字节的响应所耗费的时间,响应时间的单位一般为“秒”或者“毫秒”。一个公式可以表示:响应时间=网络响应时间+应用程序响应时间。标准可参考国外的3/5/10原则:
(1)在3秒钟之内,页面给予用户响应并有所显示,可认为是“很不错的”;
(2)在3~5秒钟内,页面给予用户响应并有所显示,可认为是“好的”;
(3)在5~10秒钟内,页面给予用户响应并有所显示,可认为是“勉强接受的”;
(4)超过10秒就让人有点不耐烦了,用户很可能不会继续等待下去;
3.事务响应时间
事务可能由一系列请求组成,事务的响应时间主要是针对用户而言,属于宏观上的概念,是为了向用户说明业务响应时间而提出的.例如:跨行取款事务的响应时间就是由一系列的请求组成的.事务响应时间是直接衡量系统性能的参数.
4.并发用户数
并发一般分为2种情况。一种是严格意义上的并发,即所有的用户在同一时刻做同一件事情或者操作,这种操作一般指做同一类型的业务。比如在信用卡审批业务中,一定数目的拥护在同一时刻对已经完成的审批业务进行提交;还有一种特例,即所有用户进行完全一样的操作,例如在信用卡审批业务中,所有的用户可以一起申请业务,或者修改同一条记录。
另外一种并发是广义范围的并发。这种并发与前一种并发的区别是,尽管多个用户对系统发出了请求或者进行了操作,但是这些请求或者操作可以是相同的,也可以是不同的。对整个系统而言,仍然是有很多用户同时对系统进行操作,因此也属于并发的范畴。
可以看出,后一种并发是包含前一种并发的。而且后一种并发更接近用户的实际使用情况,因此对于大多数的系统,只有数量很少的用户进行“严格意义上的并发”。对于WEB性能测试而言,这2种并发情况一般都需要进行测试,通常做法是先进行严格意义上的并发测试。严格意义上的用户并发一般发生在使用比较频繁的模块中,尽管发生的概率不是很大,但是一旦发生性能问题,后果很可能是致命的。严格意义上的并发测试往往和功能测试关联起来,因为并发功能遇到异常通常都是程序问题,这种测试也是健壮性和稳定性测试的一部分。
用户并发数量:关于用户并发的数量,有2种常见的错误观点。 一种错误观点是把并发用户数量理解为使用系统的全部用户的数量,理由是这些用户可能同时使用系统;还有一种比较接近正确的观点是把在线用户数量理解为并发用户数量。实际上在线用户也不一定会和其他用户发生并发,例如正在浏览网页的用户,对服务器没有任何影响,但是,在线用户数量是计算并发用户数量的主要依据之一。
5.吞吐量
指的是在一次性能测试过程中网络上传输的数据量的总和.吞吐量/传输时间,就是吞吐率.
6.TPS(transactionper second)
每秒钟系统能够处理的交易或者事务的数量.它是衡量系统处理能力的重要指标.
7.点击率
每秒钟用户向WEB服务器提交的HTTP请求数.这个指标是WEB应用特有的一个指标:WEB应用是"请求-响应"模式,用户发出一次申请,服务器就要处理一次,所以点击是WEB应用能够处理的交易的最小单位.如果把每次点击定义为一个交易,点击率和TPS就是一个概念.容易看出,点击率越大,对服务器的压力越大.点击率只是一个性能参考指标,重要的是分析点击时产生的影响。需要注意的是,这里的点击并非指鼠标的一次单击操作,因为在一次单击操作中,客户端可能向服务器发出多个HTTP请求.
8.资源利用率
指的是对不同的系统资源的使用程度,例如服务器的CPU利用率,磁盘利用率等.资源利用率是分析系统性能指标进而改善性能的主要依据,因此是WEB性能测试工作的重点.
资源利用率主要针对WEB服务器,操作系统,数据库服务器,网络等,是测试和分析瓶颈的主要参考.在WEB性能测试中,更根据需要采集相应的参数进行分析。
通用指标(指Web应用服务器、数据库服务器必需测试项)
Web服务器指标
数据库服务器性能指标
系统的瓶颈定义
稳定系统的资源状态
通俗理解:
日访问量
常用页面最大并发数
同时在线人数
访问相应时间
9.性能指标
1) 吞吐量(throughput):指单位时间内处理的客户端请求数量。直接体现软件系统的性能承载能力。
2) 并发数量(concurrency):多个同事并发的业务操作。如:100个用户谈事点击登录界面的“登录”按钮操作。
3) 思考时间(think time):录制脚本过程中,每个请求之间的时间间隔,即操作过程中停顿的时间。
4) 响应时间:指用户从客户端发起一个请求开始,到客户端接受到服务器端返回结果的响应结束,结果信息展现在客户端整个过程所耗费的时间。
5) 点击数:它是统计根据客户端向Web服务器发了多少次HTTP请求计算的。
6) 性能计数器(counter):是描述相关服务器、操作系统、中间件等性能的一些数据指标。如:Windows系统的内存数(memory inusage)、进程时间(total processtime)都是常见的计数器。
7) 资源利用率:资源利用率通常是指系统各种资源的使用情况,一般用“资源使用量”/“总的资源可用量”× 100%。
8) 网络吞吐量:指在网络工作正常的情况下,单位时间内通过的数据数量。该指标用于衡量系统对于网络设备或链路传输能力的需求。
9) 错误率:指系统在负载的情况下,失败交易的概率。错误率= 失败交易次数/交易总数×100%。
10) 系统稳定性:用户提出的重要指标,如:稳定运行时间7*24等。
十五、Web安全测试必须注意的五个方面
一、安全测试的验证点
一个系统的安全验证点包括上传功能、注册功能/登陆功能、验证码功能、密码、敏感信息泄露、越权测试、错误信息、session等。
1、上传功能
上传中断,程序是否有判断上传是否成功
上传与服务器端语言(jsp/asp/php)一样扩展名的文件或exe等可执行文件后,确认在服务器端是否可直接运行
2、注册功能/登陆功能
请求是否安全传输
重复注册/登陆
关键cookie是否httponly
会话固定:利用session的不变机制,获取他人认证和授权,然后冒充
3 、验证码功能
短信轰炸
验证码一次性
4、 忘记密码
通过手机号/邮箱找回
程序设计不合理,导致可以绕过短信验证码,从而进行修改(使用burpsuite抓包,修改响应值true)
5 、敏感信息泄漏
- 数据库/日志/提示
6 、越权测试
不登陆系统,直接输入下载文件的URL是否可以下载/直接输入登录后页面的URL是否可以访问
手动更改URL中的参数值能否访问没有权限访问的页面
不同用户之间session共享,可以非法操做对方的数据
7 、错误信息
- 错误信息中释放含有sql语句,错误信息以及web服务器的绝对路径
8、 Session
- 退出登陆后,点击后退按钮是否能访问之前的页面
主要归结为以下几点:(后期可以优化成一个安全测试的框架结构)
- 部署与基础结构
- 输入验证
- 身份验证
- 授权
- 配置管理
- 敏感数据
- 会话管理
- 加密
- 参数操作
- 异常管理
- 审核和日志安全,
二、结合实际情况(现有系统)发现的问题
1、日志/提示
在系统的初期,一般比较容易发现的问题就是在进行一些错误或者反向测试时,在页面的提示中会出现带有明显的数据库的表或者字段的打印,或者会出现一些敏感词,日志里面类似密码,卡号,身份证号没有相应的明密文转换,而这些敏感词/明密文不互转的存在,就会导致攻击者能够获取到,从而进行简单粗暴的攻击,轻易的攻击服务器或者数据库,这就会危害到整个系统!
2、重复性
大部分的web网站都会有注册功能,而类似我们负责支付这块也都会有开户,就注册跟开户,基本上需求上都会有唯一性的校验,在前端就会进行拦截,但如果使用jmter进行参数以及参数值的新增,有可能新增成功,就会导致页面系统里面会出现相同数据,可能导致整个功能的出错。
3、次数限制
类似发单,登录或者短信,如果没有进行相应的限制,如短信,没有进行限制次数,攻击者就会通过短信轰炸,攻击系统,导致系统瘫痪,其他客户就会使用不了该系统。
4、越权测试
(基本上大部分系统都没有明确的写出越权方面的需求)一个web系统,一般地址栏都会有参数的带入,如:用户号,订单号或者是其他的一些参数,而在这个基础上一个系统都会有很多用户,或者很多等级,如:A大于B大于C,那我使用C用户进行登录,查看C用户所属的订单,在地址栏中会有订单号的参数带入,如果系统没有进行相应的限制,此时C用户就可以修改订单号从而可以看到B乃至A用户的数据,这就可能导致数据的泄露,再者,如果可以修改用户的用户号,没有做处理,这样就可以对所有数据进行操作,整个系统就乱了,影响很大。
5、SQL注入/XSS攻击
主要是输入框的校验/拦截以及是否转义,如果没有系统没有对输入的内容进行处理,那攻击者就可以输入一段SQL语句,或者一段代码,在后台进入到相应的功能,就会导致整个功能是错乱的,其他正常用户所提交的数据也查看操作不了,或者提交的代码是死循环(">),就会关闭不掉,所以这点是非常重要的。
基本上上述的五点都是在测试中,系统真实存在,发生的问题,还有其他问题就不一一例举了,其中越权跟SQL注入以及XSS攻击都是重中之重!
三、克服的小困难
上面所述的都是需要人工进行手动参与,且人力操作时不会那么饱满全面,所以这是一个遇到的小问题。现在有一个针对web系统进行漏洞扫描的工具:AWVS,它通过网络爬虫测试你的网站安全,检测流行安全漏洞,针对漏洞主要分为四个等级:高危、中危,低危以及优化,它会进行内外链接的安全性,文件是否存在以及传输是否安全,也包含SQL注入跟XSS攻击,输入地址,用户名密码后,进行扫描完成后会展示相应的数据:漏洞的数量,漏洞的描述,建议性的修复;扫描网站的时长,文件数据量,环境信息等,较为全面!
四、安全测试的思路跟框架
主要根据以下六点来实现一个较为完整的安全测试的思路,框架就是根据半手工、半自动来实现整个系统的验证。
- 部署与基础结构
- 输入验证
- /身份验证(权限验证)
- 敏感数据
- 参数操作
- 审核和日志安全;
五、目前存在的问题/需要优化的
现在的安全测试大多是半手工、半自动化,但都不是专业级,所以还在摸索阶段,只能尽可能地去发现系统中存在的漏洞,且测试理论很难适用于安全领域;
安全测试基础理论薄弱,当前测试方法缺少理论指导,也缺乏更多的技术产品工具 ;
安全测试需要对系统所采用的技术以及系统的架构等进行分析,这方面也是较为薄弱的环节!
十六、Liunx系统及常规命令
l 文件目录介绍
l 文件管理命令
1、查看文件
# 查看当前目录下的文件列表
ls或ll
# 查看指定目录下的文件
ls /
# 查看详细信息,元数据信息(用户、组、大小、创建时间、权限信息、文件类型)
ls -l
# 查看隐藏文件
ls -a
# 参数并用
ls -la
2、创建文件及文件夹
# 在当前位置新建文件夹
mkdir 文件夹名
# 在指定目录位置,创建文件夹,并创建父文件夹
mkdir -p /a/b/文件夹名
# 在当前目录下新建文件
touch 文件名
3、删除文档
# 删除文件
rm 文件
# 删除文件夹
r m -r 文件夹
# 强制删除不询问
rm -rf 文件
4、拷贝文档
A、同一服务器内部复制
将文件file复制到目录/usr/men/tmp下,并改名为file1
命令:cp file /usr/men/tmp/file1
将目录/usr/men下的所有文件及其子目录复制到目录/usr/zh中
命令: cp -r /usr/men /usr/zh
复制目录aaa下所有到/bbb目录下,这时如果/bbb目录下有和aaa同名的文件,需要按Y来确认并且会略过aaa目录下的子目录
命令: cp -r aaa/* /bbb
B、不同服务器远程拷贝
实例1:从远处复制文件到本地目录
命令:
scp root@192.168.120.204:/opt/soft/nginx-0.5.38.tar.gz /opt/soft/
实例2:上传本地文件目录到远程机器指定目录
命令:
scp -r /opt/soft/mongodb root@192.168.120.204:/opt/soft/scptest
5、文本内容查看命令
Cat / vi / vim +文件名 (命令只能打开文本,不能编辑)
一直变化的文件总是显示后500行:
命令:tail -f 500 file
文件查看跳转命令:
gg跳到第一行
shift+g跳到文件最后一行
6、文件查找
A、文件名查找
# 语法
find 搜索路径 -name "文件名关键词"
# 例子
find / -name "passwd"
find / -name "ifcfg-*"
B、文件内容查找
# 语法
grep -参数 要查找的目录范围
# 参数
-n 显示查找结果所在行号
-R 递归查找目录下的所有文件
# 例子
grep aries /etc
grep aries /etc/passwd
l 权限管理命令
1、用户组
1. 创建组
`groupadd 组名`
2. 删除组
`groupdel 组名`
3. 查找系统中的组
`cat /etc/group | grep -n “组名”`
说明:系统每个组信息都会被存放在/etc/group的文件中
2、用户
1. 创建用户
`useradd -g 组名 用户名`
2. 设置密码
`passwd 用户名`
3. 查找系统账户
说明:系统每个用户信息保存在`/etc/passwd`文件中
4. 切换用户
`su 用户名`
5. 删除用户
`userdel -r 用户名`
3、设置文件所有者
语法:chown [-R] user名:group名 文件名
参数:-R 如果是文件夹,需要使用这个参数,可以将文件夹及其内部所有文件的所有者和组全部修改
注意:命令权限需要root
## 修改文件所有者
chown 用户名 文件名
## 修改文件所属组
chown :组名 文件名
## 修改文件所有者和所属组
chown 用户名:组名 文件名
## 修改文件夹的所有者和所属组
chown [-R] 用户名:组名 文件夹
4、权限设置
# 文件的每个归属方的权限的值使用rwx之和计算出来的。
# 语法
`chmod [-R] nnn 文件`
-R 递归设置文件夹内所有文件
# 设置文件的权限为(所有者可读可写可执行,所属组可读可写,其他人可读)
chmod 764 文件名
l 解压缩文件命令
1、.tar文件
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName
(注:tar是打包,不是压缩!)
2、.tar.gz 和 .tgz文件
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName
3、.zip文件
解压:unzip FileName.zip
压缩:zip FileName.zip DirName
l Liunx服务相关命令
1、服务器IP设置
[root@centos7 dirnew]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
----------------网卡对应的文件内容---------------------
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="0bd5d8a5-fe1b-42de-82bd-bfa7d2984b95"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.199.8" # 修改这里的ip地址即可
PREFIX="24"
GATEWAY="192.168.199.2"
DNS1="192.168.199.2"
DNS2="8.8.8.8"
IPV6_PRIVACY="no"
[root@centos7 dirnew]# systemctl restart network #重启网卡服务
2、服务器防火墙
一.系统防火墙
1.启动防火墙 systemctl start firewalld
2.关闭防火墙 systemctl stop firewalld
3.查看状态 systemctl status firewalld
4.开机启用防火墙 systemctl enable firewalld
5.开机禁用防火墙 systemctl disable firewalld
二.某个端口的防火墙
1.开放某个端口,如8080端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent
重新加载配置
firewall-cmd --reload
2.查看防火墙锁开放的端口
firewall-cmd --zone=public --list-ports
3.查看某个端口的访问权限,如8080
firewall-cmd --zone=public --query-port=8080/tcp
4.关闭某个端口的防火墙,如8080端口
firewall-cmd --zone=public --remove-port=8080/tcp --permanent
3、服务器硬件信息查看
1、查看物理cpu个数:
cat /proc/cpuinfo |grep "physical id"|sort|uniq|wc
2、查看内存使用情况:
#free -m
3、查看硬盘及分区信息:
fdisk -l
4、查看文件系统的磁盘空间占用情况:
df -h
5、查看系统内核
uname –a
6、查看端口占用
lsof -i:端口号 (查看服务器端口占用情况)
netstart -tunlp | grep 端口号 (显示tcp、udp的端口和进程相关情况)
netstat -anp |grep 3306 (查看3306端口使用情况)
l 环境变量配置
在/etc/profile文件中添加变量【对所有用户生效(永久的)】
# vi /etc/profile
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
# source /etc/profile
l 数据库操作命令
一、启动与退出
1、启动 MySQL 服务
net start mysql 或 service mysql start
2、关闭 MySQL 服务
net stop mysql 或 service mysql stop
3、登录 MySQL
语法:./mysql -u 用户名 -p
输入命令./mysql -u root -p,回车后提示输入密码,输入123456,然后回车即可进入到mysql中了,mysql的提示符是:mysql> 。
注意:若连接到另外的服务器,则需要加入一个参数-h和服务器IP。
语法:./mysql -u [用户名] -p -h [服务器IP地址]
(u与root可以不用加空格)
4、退出 MySQL 命令
mysql> exit; 或者 mysql> quit;(回车)。
5、刷新数据库
mysql> flush privileges;
6、修改 root 密码
方法1:用 SET PASSWORD 命令
首先登录 MySQL。
格式:mysql> set password=password('新密码');
命令:mysql> set password=password('123456');
方法2: 用 UPDATE 直接编辑 user 表
首先登录 MySQL。
mysql> use mysql;
mysql> update user set password=password(‘123’) where user=‘root’ and host=‘localhost’;
mysql> flush privileges;
7、增加新用户
格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码"
增加一个用户user1,密码为password1,让其可以在本机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入mysql,然后键入以下命令:
mysql> grant select,insert,update,delete on *.* to user1@localhost Identified by "password1";
若希望该用户能在任何服务器上登陆mysql,则将localhost改为"%"。
若不想user1有密码,则可以用下面的命令将密码去掉:
mysql> grant select,insert,update,delete on mydb.* to user1@localhost identified by "";
8、删除SQL用户
mysql> delete from user where User="用户名" and Host="服务器IP地址";
二、数据库操作
1、显示所有的数据库(注意:最后有个 s)
mysql> show databases;
2、切换数据库
mysql> use 数据库名;
3、查看当前数据库中包含的表信息(注意:最后有个 s)
mysql> show tables;
4、查看数据表的结构(表的列)
mysql> desc 表名; 或 describe 表名;
5、查看当前使用的数据库
mysql> select database();
6、创建数据库
mysql> create database 数据库名;
7、删除数据库
mysql> drop database 数据库名;
8、执行 sql 脚本文件(.sql 文件)
mysql> source 脚本文件名;
9、建表与删表
mysql> use 库名;
mysql> create table 表名(字段列表);
mysql> drop table 表名;
10、清空表中记录
mysql> delete from 表名;
11、显示表中的记录
mysql> select * from 表名;
12、往表中加入记录
mysql> insert into 表名 values ("hyq","M");
13、更新表中数据
mysql> update 表名 set 字段1="f" where 字段2='hyq';
14、备份数据库
mysql> mysqldump -u root 库名>xxx.data
15、显示数据库版本
mysql> select version();
16、显示当前的时间
mysql> select now();
17、消除重复行—distinct
mysql> select distinct 字段 from 表名;
18、起别名再用别名调用字段—as
mysql> select s.字段1, s.字段2 from 表名 as s;
19、条件查询—比较运算符> < !=
mysql> select * from 表名 where 字段>19;
20、条件查询—逻辑运算符and or not
mysql> select * from 表名 where 字段>=17 and 字段<=27;
21、模糊查询—like
mysql> select * from 表名 where 字段 like "李%";
22、空判断—is null
mysql> select * from 表名 where 字段 is null;
23、查询改字段内的排序—order by 单个字段(asc从小到大排序,默认从小到大,desc 从大到小排序)
mysql> select * from 表名 where (字段1 between 18 and 26)and 字段2=2 order by 字段2 asc;
24、查询改字段内的排序—order by 多个字段(按字段1降序,字段2升序)
mysql> select * from 表名 where(字段2 between 17 and 37) and 字段3=2 order by 字段1 desc ,字段2 asc;
25、聚合函数—count(*)统计列数,count(字段)一样
mysql> select count(*) from 表名 where 字段=2;
26、最大值,最小值,求和,平均
mysql> select max(字段), min(字段),sum(字段),avg(字段) from 表名;
27、group by 字段
mysql> select 字段 from 表名 group by 字段;
28、用来分组查询后指定一些条件的查询结果—group by + having
mysql> select 字段,count(*) from 表名 group by 字段 having count(*)>2;
29、先建立两个表—表名1和表名2
内连接查询表名1和表名2
mysql> select * from 表名2 inner join 表名1 on 表名2.字段2=表名1.字段1;
左连接查询表名1和表名2
mysql> select * from 表名2 as s left join 表名1 as c on s.字段2=c.字段1;
右连接查询表名1和表名2
mysql> select * from 表名2 as s right join 表名1 as c on s.字段2=c.字段1;
30、查看索引
mysql> show index from 表名;
31、创建索引
mysql> create index 索引名称 on 表名(字符段名称(长度))
32、删除索引
mysql> drop index 索引名称 on 表名;
33、开启运行时间
mysql> set profiling=1;
34、查看执行时间
mysql> show profiles;
三、导出和导入数据(数据的备份与恢复)
1、导出数据(数据的备份)
mysql> mysqldump --opt test > mysql.test
将test数据库导出到mysql.test文件,后者是一个文本文件,就是把数据库dbname导出到文件mysql.dbname中。
命令:mysql> mysqldump -u root -p123456 --databases dbname > mysql.dbname
或
mysqldump -h 主机地址 -u 用户名 -p 数据库名 > dbname_backup.sql
2、导入数据(数据的恢复)
命令:mysql> mysqlimport -u root -p123456 < mysql.dbname
或
mysqladmin -h 主机地址 -u 用户名 -p create 新数据库名
mysqldump -h 主机地址 -u 用户名 -p 新数据库名 < dbname_backup.sql
3、将文本数据导入数据库
文本数据的字段数据之间用tab键隔开。
mysql> use test;
mysql> load data local infile "文件名" into table 表名;
l 系统软件管理
一、rpm包软件
1、安装rpm软件 (正常安装)
语法:rpm -ivh xxx.rpm
2、rpm包强制安装 (强制安装会忽略掉所有依赖关系,强制进行安装)
语法:rpm -ivh xxx.rpm --nodeps --force
4、查看系统中是否已安装的过该rpm软件
语法:rpm -qa 软件名
5、卸载rpm软件
语法:rpm -e 软件名
二、yam 安装
1. 列出所有可更新的软件清单命令:yum check-update
2. 更新所有软件命令:yum update
3. 仅安装指定的软件命令:yum install <package_name>
4. 仅更新指定的软件命令:yum update <package_name>
5. 列出所有可安裝的软件清单命令:yum list
6. 删除软件包命令:yum remove <package_name>
7. 查找软件包命令:yum search <keyword>
十七、Web UI 自动化测试
一、搭建UI自动化测试框架python+selenium+pytest
- 部署python环境
安装python及python的编辑器pycharm,配置环境变量。
- 部署selenium环境
在cmd界面输入pip install selenium来安装最新版本软件。
- 安装浏览器驱动webdriver
已谷歌浏览器为例
Chrome
l 点击下载chrome的webdriver: http://chromedriver.storage.googleapis.com/index.html
l 将下载的webdriver文件解压后放入python安装路径下
4.安装pytest
在cmd界面输入pip install pytest来安装最新版本软件
5.安装allure
l 下载地址:https://github.com/allure-framework/allure2/releases
l 点击bin目录下的bat会出现一闪而过的配置界面,然后给自己的allure配置环境变量
二、元素定位
1、八种定位方式:id,name,class name,tag name,link text,partial link text,xpath,css selector。其中id,name,class name,tag name是根据元素的标签或元素的属性来进行定位;link text,partial link text是根据超链接的文本来进行定位;xpath为元素路径定位;css为选择器定位(样式定位)。
l Xpath定位语法基本公式://标签(可以用*代替)[@属性='属性值']
通过后代关系或父子关系定位后面跟//和/
l Css定位语法基本公式 : [属性='属性值']
通过两个属性[属性1='属性值'][属性2='属性值']
通过父子关系[属性.子属性='属性值']
2、页面框架处理:
定位元素在框架内无法定位到元素,首先先定位到框架,然后进入框架,再进行元素定位,然后再出框架
样例:
#因登录元素在iframe里,需要先定位到该iframe后再操作
#因该frame没有id,不能直接传入switch_to.frame
iframe = browser.find_element_by_class_name("cnt-frame")
#登录元素在frame里,需要先switch进去
browser.switch_to.frame(iframe)
#点击账户登录标签页,切换到登录窗口
browser.find_element_by_xpath("html/body/div[1]/div/div/div[1]/div[1]/div[2]/div/ul/li[2]").click()
#定位到输入框
input_element = browser.find_element_by_id("inp_account_content")
#输入客户号
input_element.send_keys(100200)
#点击登录按钮
login_element = WebDriverWait(browser, 5).until(EC.visibility_of_element_located((By.XPATH,"html/body/div[1]/div/div/div[1]/div[1]/div[2]/div/div/div[3]/div/div/form/div[3]/button")))
login_element.click()
#退出框架
switch_to_default_content()
三、浏览器操作
1、设置浏览器的大小
webdriver.Chrome().set_window_size(400,800)
2、设置浏览器全屏显示
webdriver.Chrome().maximize_window()
3、设置浏览器前进
driver = webdriver.Chrome()
driver.forward()
4、设置浏览器后退
driver = webdriver.Chrome()
driver.back()
5、设置浏览器刷新
driver = webdriver.Chrome()
driver.refresh()
6、关闭浏览器连接
driver = webdriver.Chrome()
driver.close()
7. size #返回元素尺寸
例如:
size=driver.find_element_by_id(‘kw’).size #获得百度输入框的尺寸
print(size)
8. text #获取元素的文本
例如:
text=driver.find_element_by_id(“cp”).text #返回百度页面底部备案信息
print(text)
8. get_attribute(name) #获得属性值
例如:
attribute=driver.element_by_id(“kw”).get_attribute(‘type’)#返回元素的属性值
print(attribute)
9. Is_displayed() #设置该元素是否用户可见
例如:
result=driver.find_element_by_id(“kw”).is_displayed() # 返回元素结果是否可见
print(result)
10.获得验证信息
title:用以获得当前页面标题
例:
title=driver.title #打印当前title
current_url:获得当前页面URL
例:
now_url=driver.current_url#打印当前URL
四、鼠标键盘操作
鼠标操作实现方式selenium提供鼠标操作的方法及步骤:
通过ActionChains实例化鼠标对象,action = ActionChains(driver)#参数driver表示的是浏览器驱动对象,调用鼠标的执行方法 action.perform()
一、鼠标操作实现方式
1.鼠标右击操作
针对由html自定义的右键菜单,才可以使用右击的方式来进行操作
右击操作的实现步骤
l 创建鼠标对象action = ActionChains(driver)
l 调用右击事件方法 action.context_click(element) #element表示的是一个元素对象
l 调用鼠标执行方法 action.perform()
# 导包
import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
# 实例化浏览器对象
driver = webdriver.Chrome()
driver.maximize_window()
# 打开测试网站
driver.get("file:///E:/UI%E8%87%AA%E5%8A%A8%E5%8C%96/UI%E8%87%AA%E5%8A%A8%E5%8C%96/pagetest/%E6%B3%A8%E5%86%8CA.html")
# 在用户名文本框上点击鼠标右键
# 创建鼠标对象
action =ActionChains(driver)
# 调用鼠标右击的方法
action.context_click(driver.find_element_by_id("userA"))
# 调用鼠标的执行方法
action.perform()
# 等待3秒
time.sleep(3)
# 关闭浏览器对象
driver.quit()
2.鼠标双击操作
鼠标双击的实现步骤:
l 创建鼠标对象action = ActionChains(driver)
l 调用鼠标双击事件方法 action.double_click(element) #element表示的是一个元素对象
l 调用鼠标执行方法 action.perform()
# 在用户名输入框输入admin,暂停3秒后,双击鼠标左键,选中admin
driver.find_element_by_id("userA").send_keys("admin")
time.sleep(3)
# 创建鼠标对象
action = ActionChains(driver)
# 调用鼠标双击的方法
action.double_click(driver.find_element_by_id("userA"))
# 调用鼠标的执行方法
action.perform()
3.鼠标拖动操作
鼠标拖动的实现步骤
l 创建鼠标对象action = ActionChains(driver)
l 调用鼠标拖动事件方法 action.drag_and_drop(source,target)
source表示源元素,被拖动的元素,target表示的是目标源,也就是要拖动到的那个元素
l 调用鼠标执行方法 action.perform()
# 把红色方框拖拽到蓝色方框上
element_red = driver.find_element_by_css_selector("#div1")
element_blue = driver.find_element_by_css_selector("#div2")
time.sleep(2)
# 创建鼠标对象
action = ActionChains(driver)
# 调用鼠标拖拽事件方法
action.drag_and_drop(element_red,element_blue)
# 调用鼠标执行方法
action.perform()
4.鼠标悬停操作(用的最多)
鼠标悬停实现步骤:
l 实例化鼠标对象 action = ActionChains(driver)
l 调用鼠标悬停事件方法 action.move_to_element(element)
element表示的是一个元素对象
l 调用鼠标执行方法 action.perform()
# 把鼠标悬停在注册按钮上面
element = driver.find_element_by_xpath("//p/button")
time.sleep(3)
# 创建鼠标对象
action = ActionChains(driver)
# 调用鼠标拖拽事件方法
action.move_to_element(element)
# 调用鼠标执行方法
action.perform()
5.鼠标的单元素拖动操作
鼠标的单元素拖动实现步骤
l 实例化鼠标对象 action = ActionChains(driver)
l 调用鼠标的单元素拖动事件方法
action.drag_and_drop_by_offset(element,x,y) #x,y表示的元素拖动时横向和纵向移动的距离,单位为像素。移动的像素值要比在web页面中看到的移动像素值大,最好大于5个或者10个像素。element表示的是元素对象
l 调用鼠标执行方法 action.perform()
# 模拟鼠标实现滑动验证码的操作
element = driver.find_element_by_css_selector(".handler")
# 创建鼠标对象
action = ActionChains(driver)
# 调用鼠标的单元素拖动事件方法
action.drag_and_drop_by_offset(element, 265, 0)
# 调用鼠标执行方法
action.perform()
二、键盘操作
模拟键盘上的快捷键操作:
调用键盘操作的快捷键方法element.send_keys(快捷键的键值)
需要导入Keys类。第一个字母大写
单键值:直接传入对应的键值
组合键:键值之间由逗号分隔
例如:send_keys(Keys.CONTROL,keys.SHIF,”i”)
常用的快捷键
1.send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
2.send_keys(Keys.SPACE) 空格键(Space)
3.send_keys(Keys.TAB) 制表键(Tab)
4.send_keys(Keys.ESCAPE) 回退键(Esc)
5.send_keys(Keys.ENTER) 回车键(Enter)
6.send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)
7.send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)
8.send_keys(Keys.CONTROL, 'v') 粘贴(Ctrl+V)
# 1). 输入用户名: admin1, 暂停2秒, 删除1
element = driver.find_element_by_id("userA")
element.send_keys("admin1")
time.sleep(2)
element.send_keys(Keys.BACK_SPACE) # 删除最后一个字符串多操作几次相当于元素操作方法clear()
# 2). 全选用户名: admin, 暂停2秒
element.send_keys(Keys.CONTROL,'a')
time.sleep(2)
# 3). 复制用户名: admin, 暂停2秒
element.send_keys(Keys.CONTROL,'c')
time.sleep(2)
# 4). 粘贴到密码框
driver.find_element_by_id("passwordA").send_keys(Keys.CONTROL,"v")
五、等待时间
一、强制等待(无条件等待)
使用方法:time.sleep(delay)
delay的单位为秒,delay设置多少秒页面就会等待多少秒(死等),这个方法很容易让线程挂掉,使程序抛异常,所以要慎用此方法。
使用举例:打开百度,强制等待5秒
#导入强制等待模块
import time
from selenium import webdriver
wd = webdriver.Chrome()
wd.get('https://www.baidu.com')
#强制等待5秒
time.sleep(5)
二、显式等待(有条件等待)
当等待的条件满足后(一般用来判断需要等待的元素是否加载出来),就继续下一步操作。等不到就一直等,如果在规定的时间之内都没找到,那么就跳出Exception。
使用显示等待前需先导入显示等待所需模块和等待条件
#显式等待模块
from selenium.webdriver.support.ui import WebDriverWait
#显式等待条件
from selenium.webdriver.support import expected_conditions as EC
使用举例:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wd = webdriver.Chrome()
wd.get('http://www.baidu.com')
#wd是webdriver对象,10是最长等待时间,0.5是每0.5秒去查询对应的元素。until后面跟的等待具体条件,EC是判断条件,检查元素是否存在于页面的 DOM 上。
login_btn=WebDriverWait(wd,10,0.5).until(EC.presence_of_element_located((By.ID, "s-top-loginbtn")))
#点击元素
login_btn.click()
三、隐式等待(无条件等待,在一个时间段内等待)
l 一次设置,全局生效。不要当作固定等待使用,不要每次需要等待时都写一次隐式等待。
l 隐式等待设置了一个最长等待时间,在规定时间内网页加载完成(也就是一般情况下你看到浏览器标签栏那个小圈不再转就代表加载完成),则执行下一步,否则一直等到时间结束,然后执行下一步。
l 如果是只需等待页面中的一个元素加载就用显示等待,等待整个网页加载就用隐式等待。
使用方法:implicitly_wait(delay),delay的单位为秒
使用举例:打开www.qq.com,等待页面加载完成后,点击新闻链接
from selenium import webdriver
from selenium.webdriver.common.by import By
wd = webdriver.Chrome()
wd.get('http://www.qq.com')
wd.implicitly_wait(10)
wd.find_element(By.CSS_SELECTOR,'[href="http://news.qq.com/"]').click()
六、POM-UI-自动化框架构建
Xxxxxx
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?