赞
踩
大厂软件测试岗经验分享
通过大数据总结发现,其实软件测试岗的面试都是差不多的。常问的有下面这几块知识点:
全网首发-涵盖16个技术栈
第一部分,测试理论(测试基础+需求分析+测试模型+测试计划+测试策略+测试案例等等)
第二部分,Linux( Linux基础+Linux练习题)
第三部分,MySQL(基础知识+查询练习+万年学生表经典面试题汇总+数据库企业真题)
第四部分,Web测试
第五部分,API测试
第六部分,App测试
第七部分,管理工具
第八部分,Python基础(Python基础+编程题+集合+函数+Python特性等等)
第九部分,Selenium相关
第十部分,性能测试
第十一部分,LordRunner相关
第十二部分,计算机网络
第十三部分,组成原理
第十四部分,数据结构与算法
第十五部分,逻辑题
第十六部分,人力资源
1.软件测试基础
软件测试的步骤是什么?
如何录制测试脚本?
应该考虑进行如何测试的测试方法
怎样估计测试工作量?
测试设计的问题
当测试过程发生错误时,有哪几种解决办法?
测试执行的问题
测试评估的目标
如何提高测试?
C/S模式的优点和缺点
B/S模式的优点和缺点
2.Linux
grep和find的区别? grep 都有哪些用法?
查看IP地址?
创建和删除一个多级目录?
在当前用户家目录中查找haha.txt文件?
如何查询出tomcat的进程并杀掉这个进程,写出linux命令?
动态查看日志文件?
查看系統硬盘空间的命令?
查看当前机器listen 的所有端口?
3.Python
统计python源代码文件中代码行数,去除注释,空行,进行输出?
python调用cmd并返回结果?
冒泡排序
1,2,3,4 这4个数字,能组成多少个互不相同的且无重复的三位数,都是多少?
请用 python 打印出 10000 以内的对称数(对称数特点:数字左右对称,如:1,2,11,121,1221 等)
给定一个整数 N,和一个 0-9 的数 K,要求返回 0-N 中数字 K 出现的次数
判断 101-200 之间有多少个素数,并输出所有的素数
一个输入三角形的函数,输入后输出是否能组成三角形,三角形类型,请用等价类- 划分法设计测试用例
4.MySQL
你用的Mysql是哪个引擎,各引擎之间有什么区别?
如何对查询命令进行优化?
数据库的优化?
Sql注入是如何产“生的,如何防止?
NoSQL和关系数据库的区别?
MySQL与MongoDB本质之间最基本的差别是什么
Mysql数据库中怎么实现分页?
Mysql数据库的操作?
优化数据库?提高数据库的性能?
什么是数据的完整性?
5.Web
Web测试和app测试区别?
WEB测试环境搭建和测试方法
WEB测试教程
WEB测试要点及基本方法
Web测试页面总结
6.接口测试
什么是接口
如果模块请求http改为了https,测试方案应该如何制定,修改?
常用HTTP 协议调试代理I具有什么?详细说明抓取HTTPS协议的设置过程?
描述TCP/IP协议的层次结构,以及每一-层中重要协议
jmeter,一个接口的响应结果如下:
接口产生的垃圾数据如何清理
依赖第三方的接口如何处理
测试的数据你放在哪?
什么是数据驱动,如何参数化?
7.性能测试
你认为性能测试的目的是什么?做好性能测试的工作的关键是什么?
服务端性能分析都从哪些角度来进行?
如何理解压力测试,负裁测试以及性能测试?
如何判断是否有内存泄漏及关注的指标?
描述软件产“生内存泄露的原因以及检查方式。(可以结合- 种开发语言进行描述)
简述什么是值传递,什么是地址传递,两者区别是什么?
什么是系统瓶颈?
8.selenium
如何开展自动化测试框架的构建?
如何设计自动化测试用例:
webdriver如何开启和退出一个浏览器?
什么是自动化测试框架?
Selenium是什么,流行的版本有哪些?
你如何从命令行启动Selenium RC?
在我的机器端口4444不是免费的。我怎样才能使用另一个端口?
什么是Selenium Server,它与Selenium Hub有什么不同?
你如何从Selenium连接到数据库?
你如何验证多个页面上存在的一个对象?
XPath中使用单斜杠和双斜杠有什么区别?
如何编写SeleniumIDE/ RC的用户扩展?
如何在页面加载成功后验证元素的存在?
你对Selenium Grid有什么了解?它提供了什么功能?
如何从你的Java Class启动Selenium服务器?
Selenium中有哪些验证点?
什么是XPath?什么时候应该在Selenium中使用XPath?
9.计算机与网络
一台计算机的IP是192.168.10.71子网掩码255.255.255.64与192.168.10.201 …
请简述DNS、活动目录、域的概念。
10M兆宽带是什么意思?理论下载速度是多少?
什么是IP地址?
OSI七层网络模型的划分?
TCP和UDP有什么不同?
HTTP属于哪一层的协议?
HTTP和HTTPS的区别?
cookies和session的区别?
HTTP的get请求和post请求的区别?
HTTP1.0和HTTP1.1有什么区别
TCP的连接建立过程,以及断开过程?
客户端使用DHCP获取IP的过程?
写出某个网段的网络地址和广播地址?
10.人力资源
你的测试职业发展是什么?你自认为做测试的优势在哪里?
你找工作时,最重要的考虑因素为何?
为什么我们应该录取你?
请谈谈你个人的最大特色。
一个测试工程师应具备那些素质和技能?
还有问一下你是怎样保证软件质量的,也就是说你觉得怎样才能最大限度地保证软件质量?
为什么选择测试这行?
如果我雇用你,你能给部门带来什么贡献?
字节跳动(抖音)软件测试月薪23K岗、技术二面面试题最新出炉
测试人员在测试中的任务是什么?
HTTP与HTTPS协议的区别?
测试用例评审的流程是什么?
测试用例是否按照公司定义的模板进行编写的;
测试用例的本身的描述是否清晰,是否存在异议性;
测试用例内容是否正确,是否与需求目标相一致;
测试用例的期望结果是否确定、唯一的;
操作步骤应与描述是否相一致;
测试用例是否覆盖了所有的需求;
测试设计是否存在冗余性;用例是否可执行
是否从用户层面来设计用户使用场景和业务流程的测试用例;
场景测试用例是否覆盖负载的业务流程;
用例设计是否包含了正面、反面的用例;
由系统自动生成的输出项是否注明了生成规则;
用例应包含对中间和后台数据的检查;
测试用例应有正确的名称和编号;
测试用例应标注有执行的优先级;
测试用例包含相关的配置信息:测试环境、数据、前置测试用例、用户授权等;
每个测试用例步骤应<=15 step;
自动化测试脚本必须带有注释(注释应包括:目的、输入、期望结果等);
非功能测试需求或不可测试需求是否在用例中列出并说明。
缺陷报告内容包括什么?
用monkey做app测试,怎么做的?
app出现CRASH的原因?
jmeter为什么要参数化?
App测试与web测试的区别?
相同点:
不同点:
MySQL数据库查询语言有哪些?会多表联查吗?
数据库语言最常用的是SQL
多表联查:select * from table1 t1,table2 t2 where tl.id=t2.id
这样就是多表联查。
Linux系统操作的指令说一下:
三面京东:
一面:
你所了解的黑盒测试方法有哪些?并简单介绍下其应用场景?
简述常用的bug管理或者用例管理工具,并且描述其中的一个工作流程?
什么是正交实验法,使用场景是什么?
请简单描述测试工具loadrunner、selenium、QTP的产品用途,并介绍你在项目中实际用到的功能模块?
简述selenium grid的作用?
高质量的自动化脚本应该具备哪些特性?
编写测试计划文档的目的是什么?测试计划文档的内容主要包括哪些?
并简单介绍其作用?
25k成功入职京东:拿到京东软件测试岗位offer经验分享
二面:
项目某一轮系统测试完成后,达到系统测试结束的参考指标或规则通常有哪些?
Unix/Linux查看所有属于java进程的命令是?并将其批处理杀掉?
java中sleep()和wait()的区别?抽象类和接口的主要区别是?
QTP中的RO和TO的区别?谈谈你生成某业务功能模块的QTP脚本具体操作步骤?
关于selenium中,查找某个页面元素的常见方法有哪几种?对于窗体和页面框架:frame切换用什么方法?
RobotFramework框架中设置变量有几种方式?
RobotFramework框架中调用各种cmd命令,用什么关键字?
写出你常用的测试工具有哪些?
介绍下你所经历的开发-测试-代码上线的整个相关流程?并简单描述下此流程.
25k成功入职京东:拿到京东软件测试岗位offer经验分享
三面
删除文件用哪个命令?如果需要连目录及目录下文件一块删除呢?删除空文件夹用什么命令?
Linux 下命令有哪几种可使用的通配符?分别代表什么含义?
用什么命令对一个文件的内容进行统计?(行号、单词数、字节数)
Grep 命令有什么用? 如何忽略大小写? 如何查找不含该串的行?
Linux 中进程有哪几种状态?在 ps 显示出来的信息中,分别用什么符号表示的?
怎么使一个命令在后台运行?
利用 ps 怎么显示所有的进程? 怎么利用 ps 查看指定进程的信息?
哪个命令专门用来查看后台任务?
25k成功入职京东:拿到京东软件测试岗位offer经验分享
HR面
负责什么系统
为什么要让我独立负责
手头有没有其他offer
offer薪资有多少
哪里人 以后打算在哪里发展 是否接受入职前实习
是否接受996(然后后来才知道我们部门并不是996)
面试总结:
面试尽量提前到,能早点面试,面试官也更愿意给你通过(就像中国好声音一样,一开始都是疯狂转身)。面试时调动你的幽默细胞,尽量把面试气氛调得愉快一点,这样面试官能更深的记住你。
说自己优点的时候一定辅以证据,不然面试官只会当作耳边风
不会的问题不要强答,小心有坑,可以这样说:“不好意思这个问题我不会,但是如果让我来设计我会…”
面试其实是一个双向选择,面试官在评估你的表现,同时由于面试官也代表公司,他的素质及提的问题也是你应该评估的方面,所以不要紧张。
使用幕布,在每次面试前将自己总结的知识过一遍。我幕布上写了几万字的笔记,每次面试都拿出来看一遍,所以面试问到的基础我基本都能应答入流。
测试开发需要的技术栈
接下来我们说一下做一个测试开发所需要掌握的技术。
1、测试基础
首先作为一个测试开发,测试基础是必备条件。
测试用例设计方法(等价类、边界值等)是必须要会的
测试计划和测试报告的编写
测试工具的使用:
抓包工具:charles、fiddler
接口测试工具:postman、apipost、apifox、jmeter
用例编写工具:xmind
bug管理工具:禅道、jira
接口管理工具:yapi
只想做功能测试的同学,只会这些技能就足够了(标红的都是重点)
2、计算机基础
计算机基础包含的就稍微多一点
数据结构与算法
时间/空间复杂度分析
数据结构(数组、字符串、队列、栈、链表、集合、哈希表、数等)
算法(排序、查找、双指针、分治、递归、回溯、贪心等)
计算机网络
网络分词模型
网络传输过程
IP、端口
Http/Https协议
UDP/TCP协议
App地址解析协议
网络安全
DNS域名解析
操作系统
操作系统的组成
进程、线程
进程、线程间的通讯方式
进程调度算法
进程、线程同步方式
进程、线程状态
死锁
内存管理
局部性原理
mysql数据库
基本概念
mysql搭建
sql命令编写
约束
索引
事务
锁机制
设计数据库表
性能优化
Linux(基本命令、shell脚本)
Linux系统安装
环境变量
常用命令
常用环境搭建
shell脚本编程
VIM的使用
文件管理
用户管理
内存管理
磁盘管理
进程管理
网络管理
服务管理
Linux内核
3、编程语言
编程语言有很多,很多同学不知道该怎么选择,在这里我推荐java和python,首先都是最主流的语言,python相对于java来说更适合小白学习,学习成本较低且语法简单,学习java推荐有语言基础,且大部分服务端都是java编写的,学习后对于服务端测试能力有较大提升。
java基础
数据类型、流程控制、面向对象、数组、枚举、抽象类、接口、集合类、常用类、泛型、注解、多线程、IO流、反射、异常处理
python基础
python安装、开发工具使用、变量、运算符和表达式、流程控制、基本数据结构、函数、面向对象编程、模块、包、异常处理、文件操作、函数进阶、正则表达式、数据库编程、并发编程、网络编程以及三方库使用(requests、openpyxl、nose、faker、datafaker)
4、web框架
首先说一下java的框架所需要掌握的:
maven、spring、spring web、spring mvc、Mybatis、Mybatis plus
spring boot、spring Security
接下来是python的web框架:
Django、flask、FastAPI、Django REST framework
关于开发框架并不是了解就可以,而且可以根据框架来写一些东西,需要明白框架的原理以及了解框架之间存在的联系且学习java框架的时候不推荐开始就学springboot,建议循序渐进的从spring开始学习,没有时间学习的也可以直接学习springboot。
5、开发知识
前面我们已经说过开发框架的学习,这里就不重新说了,接下来说一下关于中间件以及开发常用的一些工具。
git :因为在开发平台或者写自动化或者拉开发代码做白盒测试时免不了从git上拉代码,需要了解git的的工作区和代码的提交、推送、拉取、回退、重置以及分支的操作、代码合并、分支冲突的解决,还要区分git和github。
Redis缓存:现在Redis缓存已经成为各个公司必备的一个缓存中间件,首先需要了解什么是缓存,了解本地缓存和多级缓存以及Redis的分布式缓存,熟悉Redis的一些应用场景,会解决使用Redis时遇到的一些问题(缓存雪崩、缓存击穿、缓存穿透等)。
RabbitMQ消息队列:RabbitMQ消息队列是一个流行的开源的消息队列系统,不是必须掌握,但是也是需要了解,明白消息队列的作用,会搭建RabbitMQ消息队列集群,以及可以使用java操作RabbitMQ。
6、平台开发
在学习完各种基础以及框架和中间件之后可以自己手动搭建平台,包括像监控平台、接口自动化测试平台、压测平台等,下面给大家列举了testerhome的开源测试平台,大家可以去看下。
点击跳转
7、持续学习
学习完上面的这些技术,大家就可以放心大胆的去找工作了,在这里希望大家都可以有一份满意的工作,不过在进入公司之后还是要继续提升自己的,给大家推荐一下学习的一些工具以及技术。
首先是前端,HTML、CSS、javaScript、vue,不需要学习太多的前端技术,熟悉下基础的前端三件套,了解前端是如何向后端发送请求来做数据交互的一般就够了。有时间的话可以学下 Vue ,是比较容易上手的主流前端开发框架,Vue + SpringBoot 还是很香的。
然后是后端,Redis高级操作、kafka、Nginx网关、Dobbo、微服务(spring cloud),学会如何使用中间件并不难,先能够独立使用,了解他们的应用场景;再用 Java 来操作中间件,和项目相结合。学习微服务时,建议先从 Dubbo 学起,对分布式、RPC、微服务有些基本的了解,再去食用 Spring Cloud 全家桶会更香。
最后是测试,可以学习性能测试、大数据测试、算法测试等,测试这方面就不多说了。
总之,再提升测试能力的同时也逐步提升自己的开发能力,
面试经历分享
一、面试基础题
1.简述测试流程:
2.什么是软件测试?软件测试的目的与原则
3.问:软件生存周期及其模型是什么?
4.什么是软件质量?
5.自动化测试脚本开发的主要步骤:
6.目前主要的测试用例设计方法是什么?
7.常见的测试用例设计方法都有哪些?请分别以具体的例子来说明这些方法在测试用例设计工作中的应用
8.测试的策略有哪些?
9.单元测试的策略有哪些?
10.正交表测试用例设计方法的特点是什么?
11.软件的安全性应从哪几个方面去测试?
12.需求测试的注意事项有哪些?
13.问:你在测试中发现了一个 bug ,但是开发经理认为这不是一个 bug ,你应该怎样解决。
14.问:给你一个网站,你如何测试?
15.问:一台客户端有三百个客户与三百个客户端有三百个客户对服务器施压,有什么区别? ?
16.软件的安全性应从哪几个方面 去测试?
17.软件质量保证体系是什么 国家标准中与质量保证管理相关的几个标准是什么? ? 他们的编号和全称是什么? ?
18.测试人员在软件开发过程中的任务是什么?
19.在您以往的工作中,一条软件缺陷(或者叫 Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录?
20.黑盒测试和白盒测试是软件测试的两种基本方法,请分别说明各自的优点和缺点!
二、测试实战面试题
1.我现在有个程序,发现在Windows上运行的很慢,怎么判别是程序存在问题还是软硬件系统存在问题
2.一个程序有n个变量采用边界值分析可以产生几个测试用例
3.请设计一个关于ATM自动取款机的测试用例。
4.如何测试一个 纸杯?
5.我手上这支笔,请你根据这支笔设计测试用例
6.测试手机开机键
7.如何回答登录功能怎么进行测试?
8.如何回答京东购物车功能怎么进行测试?
9.支付流程测试
10.对于有系统大量并发访问,你会如何做测试,有什么建议
11.请对这个系统做出测试用例:一个系统,多个摄像头,抓拍车牌,识别车牌,上传网上,网上展示
12.请你说一说PC网络故障,以及如何排除障碍
13.微信红包
14.微信发朋友圈点赞
15.如何对淘宝搜索框进行测试
16.就linux下的CP命令设计测试用例。
17.请问如果用户点击微博的关注图标但是app上面没有反应,应该怎么排查这个问题
18.现有一个学生标准化考试批阅试卷,产生成绩报告的程序。其规格说明如下:程序的输入文件由一些有80个字符的记录组成,如右图所示,所有记录分为3组:
三、基础知识点
1.什么是桩模块?什么是驱动模块?
2.什么是扇入?什么是扇出?
3.8020原则:在需求分析开始到集成测试阶段引入测试手段,能发现所有缺陷的80%,系统测试阶段发现16%,在运行维护阶段经过长时间大量运行软件后,能够发现4%。起源于经济学。
4.什么是耦合?什么是内聚?
5.缺陷严重程度:
6.缺陷优先级:
7.缺陷状态:
8.简单的软件缺陷生命周期:
9.复杂的软件缺陷生命周期:
10.什么是在线用户数?什么是并发用户数?
11.分布式软件架构分为:
12.测试人员的能力:
13.简述负载测试与压力测试的区别。
14.软件缺陷管理工具有哪些
15.弱网测试
测试技术面试题
1、什么是兼容性测试?兼容性测试侧重哪些方面?
2、我现在有个程序,发现在 Windows 上运行得很慢,怎么判别是程序存在问题还是软硬件系统 存在问题?
3、测试的策略有哪些?
4、正交表测试用例设计方法的特点是什么?
5、描述使用 bugzilla 缺陷管理工具对软件缺陷(BUG)跟踪的管理的流程?
6、你觉得 bugzilla 在使用的过程中,有什么问题?
7、描述测试用例设计的完整过程?
开发及环境搭建类面试题
1、描述软件产生内存泄露的原因以及检查方式。(可以结合一种开发语言进行描述)
2、简述什么是值传递,什么是地址传递,两者区别是什么?
3、结构化程序设计和面向对象程序设计各自的特点及优缺点是什么?
4、简述什么是存储过程和触发器?
5、使用 C 语言编写一个函数,用于交换两个变量的值(地址传递)。
6、请简述 DNS、活动目录、域的概念。
7、描述 TCP/IP 协议的层次结构,以及每一层中重要协议。
高级测试工程师简答题
1、 loadrunner 中的思考时间指的是什么?设置此值有什么意义?请结合你实际的项目经历谈一 下具体的设置情况。
2、 单元测试、集成测试、系统测试、回归测试、验收测试中的侧重点是什么?
3、 《测试计划》的书写过程中应包括哪些内容?
4、 请结合你实际的项目经历讲一个印象最深的缺陷,包括发现、定位分析、跟踪、解决、回归 等环节。(选答题)
5、 V 模型几个阶段的详细内容
专家级测试工程师——简答题
1、 实际信息化项目中,如何选取测试项和侧重点,列举你实际信息化项目中如何进行选取测试 项和侧重点,如何进行风险识别和应急。
2、 项目中测试工作量估计有什么意义,列举你实际项目中如何进行测试工作量估计的。
3、在 GB/T 9386《计算机软件测试文档编制规范》标准中,测试总结中的“差异”包含哪些,列举 你实际项目中,测试总结中包含哪些“差异”。
人力资源面试题精选
1、你的测试职业发展是什么?你自认为做测试的优势在哪里?
2、你为什么想离开目前的职务?
3、你对我们公司了解有多少?
4、你找工作时,最重要的考虑因素为何?
5、为什么我们应该录取你?
6、请谈谈你个人的最大特色。
7、一个测试工程师应具备那些素质和技能?
性能测试面试题精选
1、什么是负载测试?什么是性能测试?
2、性能测试包含了哪些测试(至少举出 3 种)
3、简述性能测试的步骤
4、简述使用 Loadrunner 的步骤
5、什么时候可以开始执行性能测试?
6、LoadRunner 由哪些部件组成?
7、你使用 LoadRunner 的哪个部件来录制脚本?
个人信息
1. 公司测试流程?/测试工作怎么开展的?/怎么展开测试?
考察是否熟悉测试过程中各个环节。具备知识:软件生命周期、bug 生命周期、测试流程。
大概流程为需求评审会议 —> 测试计划(测试范围、时间节点、任务分配、测试策略、环境,风险评估)—> 测试用例编写(测试思维)、内部/项目组评审 —> 测试执行(开发编译完成,提测):发现 bug 定位 bug,提交并跟踪 bug,多轮回归测试,测试结束 —> 整理测试报告–> 发布线上,线上问题跟踪。
可依据自己公司做适当调整。
2.做过什么项目,负责什么?
3.项目中每个业务扣细节?
4.个人规划、如何理解测试岗位
5.在最近生活或者工作上,遇到的最有挑战的事
测试思维
1.纸杯子做什么测试?
反问面试官:这个水杯容量、材质、大小、形状、功能有无限制?
面试官:没有限制
我:假设这个水杯 100ml 办公室一次性的纸质水杯
功能测试、界面测试、易用性测试、兼容性测试、安全测试、性能压力来思考
功能测试:水杯能否正常装水,不漏水?100ml 边界值? 装冷水开水热水?能否降解?…
界面测试:外观颜色、设计、logo、界面文字是否正确?.
易用性测试:隔热、易握?杯口是否毛刺?设计是否符合人体工学?…
兼容性测试:装气体/固体/液体? 不同环境下是否正常?
安全测试:材质质量,是否防止腐蚀能力?防止碰撞,割手?抑制细菌?…
性能压力:摔多次?是否耐摔?(不同高度) 挤压(不同角度),是否变形?..
2.发红包测试用例?
3.微信点赞如何测试?
4. 设计发朋友圈测试用例
5.领取优惠券的页面如何设计?
6.设计抖音视频播放页面测试用例?
7.针对抖音搜索界面,设计测试用例?
8.如何测试一瓶矿泉水?
9.一个项目,有增删改查接口等,做接口测试,怎么测?
情景问题
1. 视频卡顿如何排查
2.打开 APP 后页面空白,怎么排查问题?
答案:
先确保网络正常、输入的 URL 地址是正确的
通过浏览器调试工具或者抓包工具例 fiddler,查看控制台的请求和响应,
查看请求地址和参数等是否正常;后台返回状态码、响应数据等是否正常
一般经过以上步骤,基本能够定位到问题,例控制台报 js 异常之类的,则前端问题;若返回状态 500,则后端问题,可同步查看服务器日志来定位
3. 为微信的点赞功能设计测试用例,假如点赞了但是点赞数没有加一,可能报错在哪里?
答案:url 定位错误、代码错误、断网操作网络不好、未更新、次数限制
4. 网络良好的情况下,发现数据传输过程出现 404 的情况,你认为是什么问题。
原因一般来说有几种情况:
无法在所请求的端口上访问 Web 站点。
Web 服务扩展锁定策略阻止本请求。
MIME 映射策略阻止本请求
网站更新改版,但某些局部板块沿用原来的模块,而原有的模块调用的文件已经被删除或转移了路径。
跟踪访问的各类脚码或 CSS 文件无效但调用代码依然存在。
某个目录直接删除
网页 URL 生成规则改变
网页文件更名或移动位置
导入链接拼写错误等
5. A 给 B 发送消息后,A 看见消息发送出去了,但是 B 没有收到,怎么排查问题?
6. 网页加载慢的原因?
7. 与开发人员冲突的处理方法及遇到问题的解决方法
8. 一个 bug 开发不认同是 bug 你该怎么做 ?
首先确认开发环境是否跟自己测试环境一致(有时候开发是在他们已更新代码的环境上验证 bug 的,所以 bug 就没出现,但在测试环境上面会出现),确认在测试环境能重现,如果确认是缺陷跟开发保持有效的沟通,
如果是级别较低的建议性 bug,可以先记录到 bug 平台,先保留沟通;
如果是 bug 级别较高的问题,对应需求文档的预期结果跟开发说明,更有说服力;耐心讲解 bug 的危害,不行就找产品确认,确认是 bug 注明情况并再次指派给开发
9. 你正在测试,产品组拿来一个紧急测试让你测,你该怎么办?
10. 如果同事进度不能符合预期,影响整体进度怎么办
11. 如果领导给你一个不熟悉的事件,但很紧急怎么办?
计算机网络
1.介绍 OSI 模型
第一层:物理层,功能:利用传输介质为通信的主机之间的建立、管理和释放物理连接,实现比特流的透明传输,为数据联立层提供数据传输服务
第二层:数据链路层,功能:在物理层提供比特流的基础上通过建立数据链路连接,采用差错控制与流量控制方法,使有差错的物理线路变成无差错的数据链路
第三层:网络层,功能:通过路由选择算法为分组通过通信子网选择适当的传输路径,实现流量控制,拥塞控制与网络互联的功能
第四层:传输层,功能:为分布不同地理位置计算机的进程提供可靠的端对端链接与数据传输服务;传输层向高层屏蔽了底层数据通信的细节
第五层:会话层,功能:负责维护两个会话主机之间连接的建立、管理和终止,以及数据的交换
第六层:表示层,功能:负责通信系统之间的数据格式变换、数据加密与解密、数据压缩与恢复
第七层:应用层,功能:实现协同工作的应用程序之间的通信过程控制
2.为什么 TCP 消耗系统资源多
3.TCP 与 UDP 区别
基于连接与无连接;
对系统资源的要求(TCP 较多,UDP 少);
UDP 程序结构较简单;
流模式与数据报模式 ;
TCP 保证数据正确性,UDP 可能丢包,TCP 保证数据顺序,UDP 不保证。
4.TCP 怎么保证可靠连接
5.http 会话保持功能如何实现?
6.http 状态码?
1XX:通知。1XX 系列响应代码仅在与 HTTP 服务器沟通时使用。
2XX: 成功。2XX 系列响应代码表明操作成功了。
3XX 重定向。3XX 系列响应代码表明:客户端需要做些额外工作才能得到所需要的资源。
4XX:客户端错误。这些响应代码表明客户端出现错误。不是认证信息有问题,就是表示格式或 HTTP 库本身有问题。客户端需要自行改正。
5XX 服务端错误。这些响应代码表明服务器端出现错误。
7.http 长连接和短连接以及他们分别适用的场景 ?
8.get 和 post 区别?
Get:
a.一般对于从服务器取数据的请求可以设置为 get 方式
b.Get 方式在传递参数的时候,一般都会把参数直接拼接在 url 上(例如:http://xxx?id=1&type=2)
c.Get 请求方法可以传递的参数数据量是有限的(因为一般参数是拼接在 url 上,而浏览器对于 url 的长度是有限制的)
d.Get 请求因为是直接将数据拼接在 url 上,所以安全性不如 post 强(相对),但是 get 的执行效率要快于 post
Post:
a.一般往服务器提交数据的请求会设置为 post 方式
b.Post 方式传递参数一般都会把参数放在请求体,而不会拼接在 url
c.Post 请求方法可以提交的数据量不受限制
Post 请求传参相对于 get 要安全(相对不是绝对),但是 post 的执行效率不如 get。
9.post 主体的格式?
10.http 协议的 header
11.cookie 和 session 是什么,为什么要用 cookie 和 session ?
12.DNS 协议和作用?
13.Https 中的 CA 证书在客户端还是在服务端?
操作系统
1. 进程和线程的区别?
进程是资源分配的最小单位,线程是程序执行的最小单位。
进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此 CPU 切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
2. 多线程和多进程,以及应用场景?
3. 进程通信方式 ?
4. 内存泄漏?
5. 堆和栈?
栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收 。
6. 堆内存和栈内存?
7. 什么是死锁,死锁的条件?
8. 产生死锁的原因?
可归结为如下两点:
a. 竞争资源
系统中的资源可以分为两类:
可剥夺资源,是指某进程在获得这类资源后,该资源可以再被其他进程或系统剥夺,CPU 和主存均属于可剥夺性资源;
另一类资源是不可剥夺资源,当系统把这类资源分配给某进程后,再不能强行收回,只能在进程用完后自行释放,如磁带机、打印机等。
产生死锁中的竞争资源之一指的是竞争不可剥夺资源(例如:系统中只有一台打印机,可供进程 P1 使用,假定 P1 已占用了打印机,若 P2 继续要求打印机打印将阻塞)
产生死锁中的竞争资源另外一种资源指的是竞争临时资源(临时资源包括硬件中断、信号、消息、缓冲区内的消息等),通常消息通信顺序进行不当,则会产生死锁
b. 进程间推进顺序非法
若 P1 保持了资源 R1,P2 保持了资源 R2,系统处于不安全状态,因为这两个进程再向前推进,便可能发生死锁
例如,当 P1 运行到 P1:Request(R2)时,将因 R2 已被 P2 占用而阻塞;当 P2 运行到 P2:Request(R1)时,也将因 R1 已被 P1 占用而阻塞,于是发生进程死锁
9. 如何预防死锁,!避免死锁,死锁发生的检查?
资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)
只要有一个资源得不到分配,也不给这个进程分配其他的资源:(破坏请保持条件)
可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
代码题、算法题
1.装饰器并写一个装饰器例子?
2.找出 数组中出现次数超过一半的数字
3.哈希表的空间复杂度
4.算法题:给你一个字符串,查找出所有的重复子字符串。
5.算法题:树的深度遍历:while 循环:栈,先入右子树节点,后入左子树节点。
6.算法题:给你一个字符串找出其中的回文字符串,对你的算法设计用例
7.算法题:二叉树的前序遍历
Python/Java 基础
面向对象语言的特性?
深拷贝与浅拷贝?
数据类型分为两种基础类型和引用类型
基础类型:像 Number、String、Boolean 等这种为基本类型
引用类型:Object 和 Array
浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝(例:assign())
深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷贝
python 元祖和列表的区别
a=[] 这是一个列表
b=() 这是一个元组
区别:列表可以修改而元组不能修改,例如可以往列表中用 append()添加元素,由于元组是不可修改的所以不存在添加元素的问题。
相同点:列表和元组都是容器,包含了一些列的对象,二者都可以包含任意类型的元素甚至包含序列。
python 去重用什么 ?
python 用过哪些库函数?
selenium 用到什么程度了?
python 装饰器,作用,用法
Java:多态说一下,接口类和抽象类的区别;
Java/Python 的垃圾回收机制?
Java 和 python 创建多线程和多进程的方式 ?
Linux
1.常见命令
2.打印当前文件夹文件 ls -al a 所有文件 l 详细信息
3.查询 CPU 等情况的命令
答案:free 命令是一个快速查看内存使用情况的方法,它是对 /proc/meminfo 收集到的信息的一个概述。
top 命令提供了实时的运行中的程序的资源使用统计
atop 命令是一个终端环境的监控命令。它显示的是各种系统资源(CPU, memory, network, I/O, kernel)的综合,并且在高负载的情况下进行了彩色标注
htop 命令显示了每个进程的内存实时使用率。它提供了所有进程的常驻内存大小、程序总内存大小、共享库大小等的报告。列表可以水平及垂直滚动。
ps 命令可以实时的显示各个进程的内存使用情况。
smem 命令允许你统计基于/proc 信息的不同进程和用户的内存使用情况。内存使用情况的分析可以导出图表(如条形图和饼图–图形界面窗口才提供)。
vmstat 命令显示实时的和平均的统计,覆盖 CPU、内存、I/O 等内容。例如内存情况,不仅显示物理内存,也统计虚拟内存。
nmon 是一个基于 ncurses 的系统基准测试工具,它可以监控 CPU、内存、I/O、文件系统及网络资源等的互动模式。对于内存的使用,它可以实时的显示 总/剩余内存、交换空间等信息。
数据库
MySQL 存储引擎如何实现?
事务概念及其特性?
概念:
1.数据库事务: 数据库事务通常指对数据库进行读或写的一个操作序列。
它的存在包含有以下两个目的:
为数据库操作提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
多表查询、普通 SQL 和存储过程的区别?
索引的底层、底层为什么要采用 B 树或 B+ 树?
B 树和 B+ 树区别?
熟悉数据库吗:学生选课系统怎么建表,查询一个老师教的所有学生的名字?
取一个年级中每个班级年龄最小的同学名字?
where 和 having 的区别?
答案:
用的地方不一样
where 可以用于 select、update、delete 和 insert into values(select * from table where …)语句中。 having 只能用于 select 语句中
执行的顺序不一样
where 的搜索条件是在执行语句进行分组之前应用
having 的搜索条件是在分组条件后执行的
即如果 where 和 having 一起用时,where 会先执行,having 后执行
子句有区别
where 子句中的条件表达式 having 都可以跟,而 having 子句中的有些表达式 where 不可以跟;having 子句可以用集合函数(sum、count、avg、max 和 min),而 where 子句不可以。
总结
1.WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。
2.GROUP BY 子句用来分组 WHERE 子句的输出。
3.HAVING 子句用来从分组的结果中筛选行
内连接和外连接?
内连接 则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合
条件的记录不会出现在结果集中,即内连接只连接匹配的行。
外连接 其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个
表中的所有数据行,这三种情况依次称之为左外连接,右外连接,和全外连接。
左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,
对于那些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以
NULL 来填充。右外连接,也称右连接,右表为主表,右表中的所有记录都会出现
在结果集中。左连接和右连接可以互换,MySQL 目前还不支持全外连接。
数据库字段去重?
SQL 语句 查询每一门课程分数都大于 80 分的学生姓名?
SELECT 姓名 FROM Student GROUP BY 科目 Having MIN(成绩)>=80
测试基础有哪些内容呢?
测试的定义、测试的分类、测试的方法、测试的生命周期。
测试计划、测试方案、测试策略、测试用例的编写。
BUG的定义、BUG的分类、BUG的六要素、BUG的生命周期。
测试和开发流程的关系、瀑布流、V字形、W字型(双V)、螺旋型、敏捷等等。
戴明环、5W2H等分析管理的方法
质量管理体系CMMI(了解)
必备技能
假如一个项目拿到手之后,按照下面的一套流程跑一遍:
发布项目进行立项,建立项目组进行分工;
需求评审,学会如何看需求文档,进行需求分析,罗列测试点;
整理测试点,编写测试用例,然后进行用例评审;
执行测试,比如功能、界面、前后台、兼容性、数据库,对于发现的bug提交到禅道;
分析、总结、编写测试报告;
这个流程完整的跑一遍之后,只能说对于整体的测试流程算是掌握了,但是仍然不足以找到一份合适的工作,想要学会做功能测试,以下的内容也是必须掌握的:
Linux相关技能
操作环境、命令、安装数据库、部署测试环境等
数据库相关技能
各种命令用法、字段、增删改查
接口测试相关技能
接口测试基本理论、http协议、测试方法;
接口测试需求分析、用例编写、评审;
几种工具的掌握,jmeter、postman、soupUI;
APP测试相关技能
安装/卸载、离线、UI、登录等测试内容;
兼容性测试、monkey、fiddler抓包;
为什么很多程序员做不了软件架构师?
1、良好健康的职业规划很重要,但大多数人都忽略了
2、学习的习惯很重要,持之以恒才是正解。
3、编程思维没能提升一个台阶,局限在了编码,业务,没考虑过选型、扩展
4、身边没有好的架构师引导、培养。所处的圈子对程序员的成长影响巨大。
软件测试基础-高级系统学习——MySQL性能优化
前言
MySQL性能优化必知:长连接、短连接、连接池
当数据库服务器和客户端位于不同的主机时,就需要建立网络连接来进行通信。客户端必须使用数据库连接来发送命令和接收应答、数据。通过提供给客户端数据库的驱动指定连接字符串后,客户端就可以和数据库建立连接了。可以查阅程序语言手册来获知通过何种方式使用短连接、长连接。
1. 短连接
短连接是指程序和数据库通信时需要建立连接,执行操作后,连接关闭。短连接简单来说就是每一次操作数据库,都要打开和关闭数据库连接,基本步骤是:连接→数据传输→关闭连接。
在慢速网络下使用短连接,连接的开销会很大;在生产繁忙的系统中,连接也可能会受到系统端口数的限制,如果要每秒建立几千个连接,那么连接断开后,端口不会被马上回收利用,必须经历一个“FIN”阶段的等待,直到可被回收利用为止,这样就可能会导致端口资源不够用。在 Linux上,可以通过调整/proc/sys/net/ipv4/ip_local_port_range来扩大端口的使用范围;调整/proc/sys/net/ipv4/tcp_fin_timeout来减少回收延期(如果想在应用服务器上调整这个参数,一定要慎重!)。
另外一个办法是主机使用多个IP地址。端口数的限制其实是基于同一个IP:PORT的,如果主机增加了IP,MySQL就可以监听多个IP地址,客户端也可以选择连接某个IP:PORT,这样就增加了端口资源。
2. 长连接
长连接是指程序之间的连接在建立之后,就一直打开,被后续程序重用。使用长连接的初衷是减少连接的开销,尽管MySQL的连接比其他数据库要快得多。
以PHP程序为例,当收到一个永久连接的请求时,PHP将检查是否已经存在一个(前面已经开启了的)相同的永久连接。如果存在,则将直接使用这个连接;如果不存在,则建立一个新的连接。所谓“相同”的连接是指用相同的用户名和密码到相同主机的连接。
从客户端的角度来说,使用长连接有一个好处,可以不用每次创建新连接,若客户端对MySQL服务器的连接请求很频繁,永久连接将更加高效。对于高并发业务,如果可能会碰到连接的冲击,推荐使用长连接或连接池。
从服务器的角度来看,情况则略有不同,它可以节省创建连接的开销,但维持连接也是需要内存的。如果滥用长连接的话,可能会使用过多的MySQL服务器连接。现代的操作系统可以拥有几千个MySQL连接,但很有可能绝大部分都是睡眠(sleep)状态的,这样的工作方式不够高效,而且连接占据内存,也会导致内存的浪费。
对于扩展性好的站点来说,其实大部分的访问并不需要连接数据库。如果用户需要频繁访问数据库,那么可能会在流量增大的时候产生性能问题,此时长短连接都是无法解决问题的,所以应该进行合理的设计和优化来避免性能问题。
如果客户端和MySQL数据库之间有连接池或Proxy代理,一般在客户端推荐使用短连接。对于长连接的使用一定要慎重,不可滥用。如果没有每秒几百、上千的新连接请求,就不一定需要长连接,也无法从长连接中得到太多好处。在Java语言中,由于有连接池,如果控制得当,则不会对数据库有较大的冲击,但PHP的长连接可能导致数据库的连接数超过限制,或者占用过多的内存。
对此,研发工程师、系统运维工程师、DBA需要保持沟通,确定合理的连接策略,千万不要不假思索就采用长连接。
3. 连接池
由于一些数据库创建和销毁连接的开销很大,或者相对于所执行的具体数据操作,连接所耗的资源过多,此时就可能需要添加连接池来改进性能。
数据库连接池是一些网络代理服务或应用服务器实现的特性,如J2EE服务器,它实现了一个持久连接的“池”,允许其他程序、客户端来连接,这个连接池将被所有连接的客户端共享使用,连接池可以加速连接,也可以减少数据库连接,降低数据库服务器的负载。
4. 持久连接和连接池的区别
长连接是一些驱动、驱动框架、ORM工具的特性,由驱动来保持连接句柄的打开,以便后续的数据库操作可以重用连接,从而减少数据库的连接开销。而连接池是应用服务器的组件,它可以通过参数来配置连接数、连接检测、连接的生命周期等。
如果连接池或长连接使用的连接数很多,有可能会超过数据库实例的限制,那么就需要留意连接相关的设置了,比如连接池的最小、最大连接数设置,以及php-fpm的进程个数等,否则程序将不能申请新的连接。
让你在职场新人中脱颖而出,你觉得下面哪三项最为关键?】
然后下面列出的能力清单有以下选项:
软件测试的历史
什么是软件测试:
早期定义:软件测试是对程序能够按预期运行建立起一种信心。
经典定义:测试是为了发现错误而执行程序的过程。
IEEE定义(ISO/IEC/IEEE 29119):使用人工或者自动的手段来运行或测量软件系统的过程,以检验软件系统是否满足规定的要求,并找出与预期结果之间的差异。
软件测试≠程序测试
五大要素和两个目标:
五大要素有:质量、人员、资源、流程、技术。
其中最主要的是软件质量,其他四个要素都是为质量服务的。
其次是人员,决定了技术,资源,流程,以及配置和使用。
技术包含了:软件测试技术、软件测试方法、使用的工具。技术是手段。
流程:测试计划,测试用例,测试执行,测试报告。有一些进入进出的标准(规范性,对软件测试做一个规范的要求)。
资源:测试所需要的硬件设备、网络环境、测试设备、测试时间(周期)。
注意:人不是资源。
目标:
①提升测试覆盖率-> 能够有效的保证软件的质量
②提升测试效率->能够使我们更好地完成软件测试
软件测试所遵循的原则
一、测试显示缺陷的存在,但不能证明系统不存在缺陷。
经过软件测试,可以发现软件中的故障;但是经过软件测试,不能保证软件就没有故障了。
二、穷尽测试是不可能的,应设定及时终止的条件。
三、测试应该尽早进行
四、缺陷具备群集特性
越是发现问题多的模块,越是需要重点测试的对象
五、测试的杀虫剂悖论
在测试中,如果采用同样的测试用例,同样的测试方法。多次重复的测试某一个模块,最后就不能再发现新的缺陷。所以说,测试用例和测试方法应该不定期的评审修改,并且增加不同的测试方法和用例来测试不同的部分,从而更多的发现软件的缺陷。
六、测试的二八原则
测试时间和资源往往是有限的,要找出所有的缺陷是不可能的,这时我们需要遵循二八原则。
把80%的时间或者资源用在20%的重点模块上,重点测试模块中20%的重要模块。来达到测试效率和资源配置的最佳的比例。
七、测试活动依赖于测试背景
针对不同的测试背景针对的活动是不同的,比如:电信级的软件对性能、大并发量的访问会有更高的要求。而金融,银行系统相关的软件,对安全性能要求更高。
软件测试阶段,手段,模式
按测试阶段来分类
单元测试、继承测试、系统测试、验收测试
单元测试
什么是单元测试
对软件中的最小可测试单元进行检查和验证
单元测试的原则:
1.尽可能保证各个测试用例是相互独立的;
2.一般由代码的开发人员来实施,用以检验所开发的代码功能符合自己的设计要求。
单元测试的益处:
1.能尽早发现缺陷;收益最高;
2.有利于重构;
3.简化集成;
4.文档;
5.用于设计;
单元测试的限制
1.不可能覆盖所有的执行路径,所以不可能保证捕捉到所有路径的错误;
2.每一行代码,一般需要3-5行测试代码才能完成单元测试。所以存在投入和产出的一个平衡;
单元测试框架:
Xunit,JUnit,nunit,PPUnit,CppUnit
集成测试:
定义:
在单元测试的基础上,测试在将所有的软件单元按照概要设计规格说明的要求组装成模块、子系统或系统过程中各部分工作是否达到或实现相应技术指标及要求的活动
集成测试的主要实施方案
1.Big Bang 全部完成,测试
2.自顶向下
3.自底向上 从最低层测试,逐步组装测试;(常用测试)
4.核心系统集成
5.高频集成
集成测试&单元测试
1.测试的对象不同;
2.测试的一举不同;
3.测试的方法不同;
系统测试
定义:是将经过集成测试的软件,作为计算机系统的一个部分,系统中其他部分结合起来,在实际运行环境下对计算机系统进行的一系列严格有效的测试,以发现软件潜在的问题,保证系统的正常运行。
关注点
关注系统本身的使用
关注系统与其他相关系统间的连通
关注系统在不同使用压力下的表现
关注系统在真实使用环境下的表现
系统测试&集成测试
测试环境:
集成测试:由通过了单元测试的各个模块所集成起来的构件
系统测试:除了软件之外,还包括计算机硬件及相关的外围设备、数据采集和传输机构、支持软件、系统操作人员等整个系统;
测试时间:
集成测试介于单元测试和系统测试之间测试
系统测试在集成测试之后
测试内容:
集成测试:各个单元模块之间的接口
系统测试:整个系统的功能和性能
测试角度:
集成测试:偏向于技术角度的验证
系统测试:偏向于业务角度的验证
验收测试
定义:也称交付测试,针对用户需求、业务流程的正式的测试,确定系统是否满足验收标准,由用户、客户、或其他授权机构决定是否接受系统。
细分
用户验收测试
运行验收测试
合同和规范验收测试
alpha测试
Beta测试
按测试手段来分类:
黑盒测试、白盒测试
静态测试、动态测试
手工测试、自动化测试
黑盒测试
定义:把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息。主要针对软件界面和软件功能进行测试。
图例:
优点:
1.容易实施,不需要关注内部的实现
2.更贴近用户的使用角度
缺点:
1.测试覆盖率角度,一般只能覆盖到代码量的不到40%;
2.针对黑盒测试的自动化测试,复用率较低,维护成本较高;
关注点:
1.是否有不正确或者遗漏的功能?
2.在接口上,输入是否能正确的接受?能否输出正确的结果?
3.是否有数据结构错误或者外部信息(例如数据文件)访问错误?
4.性能上是否能够满足要求?
黑盒测试的主要设计方法
白盒测试
定义
白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面是如何运作的。"白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。"白盒"法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数是天文数字。
图示:
优点:
1.迫使测试人员去仔细思考软件的实现,理解原理
2.可以检测代码中的每一条分支和路径
3.揭示隐藏在代码中的错误
4.对代码的测试比较彻底
缺点:
1.昂贵
2.无法检测代码中遗落的路径和数据敏感性错误
3.不能直接验证需求的正确性
主要测试方法:
静态测试
定义:
静态测试是指无须执行被测程序,而是通过评审软件文档或代码,度量程序静态复杂度,检查软件是否符合编码标准,借以发现编写的程序的不足之处,减少错误出现的概率;
方式:
动态测试
定义:
动态测试时指通过运行被测程序,检查运行结果与预期结果的差异,并分析运行效率,正确性和健壮性等;
手动测试
定义:
由专门的测试人员从用户视角来验证软件是否满足设计要求的行为。更适用针对深度的测试和强调主管判断的测试。
方法:众包测试,探索式测试
自动化测试:
定义:使用单独的测试工具软件控制测试的自动化执行以及对预期和结果进行自动检查。
方法:单元测试,接口测试,性能测试等
手工测试VS自动化测试
瀑布模型、敏捷测试、基于脚本的测试、基于风险的测试、探索式测试等
瀑布模型的优缺点
V模型
W模型
X模型
H模型
敏捷测试
Agile Testing --遵循敏捷宣言的一种测试实践
敏捷宣言
注点:
强调从客户角度进行测试
重点关注迭代测试新功能,不在强调测试阶段
尽早测试,不间断测试,具备条件即测试
强调持续反馈
预防缺陷重于发现缺陷
敏捷测试VS传统测试
探索式测试(ET)
完全抛开测试脚本的测试
它是一种测试风格、思维而不是一种技术
优点:
更能激发测试人员的创造性和工作乐趣
增加了发现新的或较深入Bug的可能性
在较短时间内找到更多Bug以及对SUT作一个快速的评估
有利于更加有效地实施自动化
更加适用于敏捷项目
减少了在简单、繁复上用例的无谓编写时间
测试管理上有局限性,较难协调和控制
对于Bug的重复利用和重现上作用有限
对测试人员的测试技能和业务知识深度依赖较大
只有在SUT已完全可用的前提下才更有作用
ET的生产率很难定义
ET本身较难进行自动化
局部探索式测试
输入、状态、代码路径、用户数据、执行环境
全局探索式测试
基于风险的测试-RBT
Risk-based Testing
一种基于对软件失效的风险评估并以此指导测试计划、设计、执行、结果评估的软件测试类型
那些是风险?
质量风险、管理风险
风险级别=风险可能性X风险严重度
技巧篇
做题
看完面试题之后那就来做一下面试题目吧, 目前找到两个网站
SillGun(国外网站, 自备梯子)
牛客网
聊面试
(帅张)stormzhang 跟你谈一下面试那些事儿
面试时企业最看中你什么能力?
我面试到底问什么?
面试那些事儿
互联网招聘平台
拉勾-专注互联网职业机会
简寻-让职位推荐更精准
100 offer-帮最好的互联网人发现更好的offer
BOSS 直聘-互联网招聘神器
LinkedIn (领英)
哪上班
一力顶十巧(刷题)
【热身题】
1.为什么选择测试这行?
因为其具有挑战性和成就感,找一些系统隐藏的逻辑漏洞的时候,自己就非常的开心。并且测试需要细心和耐心,自己可以很快的分析bug的来源。
2.请描述下你公司的测试流程?
需求分析讨论-确定测试策略-设计测试用例-测试用例评审-beta测试-uat测试-测试报告
【基础题】
1.软件测试项目从什么时候开始为什么?
需求确认开始,因为在需求阶段,测试可以评审需求并进行静态测试,减少开发过程中的bug。
2.软件的评审一般由哪些人员参加?其目的是什么?
参加人员:需求业务人员、产品经理、项目经理、开发人员、测试人员;
目的:查看软件在未正式投入运行前是否还存在问题。对于不同软硬件平台能否正常运行,是否有与客户理解不一致的地方,同时可以对一些可以改进的地方再多加改进。
3.如何设计测试用例?什么样子的测试用例是好用例?
掌握边界值分析、等价类划分、错误推测等方法来设计测试用例。
好用例是一个完备的集合,它能够覆盖所有等价类以及各种边界值;需要从软件功能需求出发,全面地,无遗漏地识别出测试需求;最好是代码覆盖测试也全面的测试。
4.不能发现BUG的测试用例不是好的测试用例吗?
不一定,要看情况,如果测试用例质量高,没有发现bug,说明开发质量高。但一般程序都会有bug,如果没有发现BUG,就要思索测试场景是否有遗漏,需求是否理解没到位。
5.测试用例需要哪些人来评审?
产品经理,开发人员,测试人员,业务需求人员。
6.什么是bug?
没有实现需求说明书列出的功能,出现了没有需求说明书提到不该出现的事情;实现了多的功能;没有实现应该实现的逻辑。
7.简单概述缺陷报告,并说明包括哪些项?
缺陷描述,缺陷的优先级,缺陷的标题,缺陷所属版本号,缺陷所属的功能模块,操作步骤,预期效果,缺陷原因,缺陷所属的开发人员。
8.开发人员修复缺陷后,如何保证不影响其他功能?
重新执行测试用例,并且针对这个缺陷影响的相关点写新的测试用例。
9.开发人员说不是bug时,你如何应付?
首先把自己的理由,并以需求说明书为自己的站点,如果开发人员还是不认同,可以把自己的观点和理由,提交给产品经理,由其去决定是否为一个bug。
10.当测试过程发生错误时,有哪几种解决办法?
a.跳转其他的测试流程;
b.调用某个程序能绕过这个错误,继续后面的流程。
11.所有的软件缺陷都能修复吗?所有的软件缺陷都要修复吗?
能修复,但不一定所有的缺陷都要修复。
12.进行测试时产生了哪些文档或记录?
测试用例,测试报告,测试日报
14.功能测试在 beta 版本对外的上线标准是什么?
测试用例全部跑完并且bug都已经关闭,然后业务验收后可以上线。
15.开发人员老是犯一些低级错误怎么解决?
a.要求开发人员进行自测,把这些问题在开发阶段就解决好
b.通过缺陷管理系统对开发人员进行控制
16.为什么尽量不要让时间富裕的员工去做一些测试?
a.非专业测试人员,没有组织性的测试工作,没有规律和针对性,会影响到测试的质量和版本更新的速度。
b.专业测试人员(但不是这个项目的测试员)这些人员不受测试计划的时候和任务约定,测试完毕后评估测试小组的工作质量,不利于bug管理。
###【进阶题】
1.什么是单元测试、功能测试、集成测试?
加分项:单元测试、功能测试、集成测试分别在web端、接口端、移动端的定义,你平时是怎么理解它们的?
单元测试:是针对程序模块来进行正确性检验的测试工作;
功能测试:在单元测试的基础上,测试某一个功能点;
集成测试:将所有模块按照设计要求组装成为子系统或系统,进行集成测试;
web端
单元测试/功能测试:页面元素是否正确显示其有效功能,如提交的action是否正确,搜索点击是否执行;
集成测试:调用了后端接口的数据是否显示正常,能否满足需求;
接口端:模块/系统之前的调用,接口是否与设计相符,模块组合后是否满足需求;
单元测试:某个函数/方法 写的代码是否达到编写者的预期;
功能测试:为实现一个功能点,调用几个方法/函数。
2.什么是兼容性测试?
兼容性测试是检查软件在不同软件平台,硬件平台上是否可以正常运行的测试。
主要查看软件在不同操作系统、浏览器、数据库中是否运行正常.
3.白盒和黑盒的区别,你是怎么运用的?
黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。利用其检查功能是否符合需求说明书,能够正常使用。
白盒测试:已知产品的内部工作过程,可以进行测试证明每种内部操作是否符合设计规格要求,所有内部成分是否经过检查。
利用其检查程序模块的内部逻辑走向,主要覆盖程序内的逻辑。
4.静态测试和动态测试有什么区别?
静态测试:不运行程序,针对PRD等检查代码,审查代码,静态结构分析,分析代码质量;
动态测试:运行程序进行黑盒测试和白盒测试。
5.您所熟悉的测试用例设计方法都有哪些?请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。
黑盒:
边界值分析法:如参数的范围0-128,输入128,129,0这些值,查看是否有错误等;
错误推测法:导入功能时,表格为空表格,表格输入1行,表格输入10000行等;
因果图方法:组合参数逻辑图;
场景分析法:根据用户操作模拟用户操作。
白盒:
逻辑覆盖法,基本路径测试。
6.您在以往的测试工作中都曾经具体从事过哪些工作?其中最擅长哪部分工作?
做过web测试,小程序测试,H5页面测试,后台测试,接口测试。最擅长接口测试,自己给公司的业务流程写过一套自动化框架,用于回归业务流程。
7.在您以往的工作中,一条软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录?
前提条件、测试环境、操作步骤、预期结果、实际结果、严重等级、版本信息,出现概率;
问题描述和操作步骤要尽可能描述详细,可以初步分析bug是客户端的问题还是服务端的问题。
8.什么是内存泄漏、Http错误率、吞吐率。响应时间分别在web端和移动端是多少?哪些场景可以证明响应超时?
内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
HTTP错误率(HTTP error rate) 在选定时间段内,HTTP错误数量与请求数量的比率。
吞吐率(Throughput) 是场景运行过程中服务器每秒的吞吐量。其度量单位是字节,表示每个请求连接在任何给定的每一秒从服务器获得的数据量。
web端
当用户在2秒以内得到响应时,会感觉系统的响应很快;
当用户在2-5秒之间得到响应时,会感觉系统的响应速度还可以;
而当用户在超过8秒后仍然无法得到响应时,会感觉系统糟透了,或者认为系统已经失去响应。
场景:请求超时、页面加载失败
【高级题】
1.什么是面向对象编程?
面向对象编程就是把具有共性的事务抽象成属性和方法来进行编程。
2.Thread 类中的start() 和 run() 方法有什么区别?
start()方法可以用来启动线程,调用该方法,会创建一个新的线程,然后内部执行run()方法;不能多次调用,否则会抛异常;
直接调用run()方法,不会创建新的线程;可以进行多次调用。
3.说下左连接和右连接
比如有两张表 A,B。左连接是把符合条件的所有A表的内容列出来,B表如果没有内容匹配用NULL代替。
右连接是符合条件的所有B表的内容列出来,A表如果没有内容匹配用NULL代替。
4.介绍下什么是索引
索引是由表或者视图中的一列或多列生成的键,可以加快在表或者视图中检索行的速度
【接口测试相关】
1.什么是接口测试?
接口测试是测试系统组件间接口的一种测试。接口测试就是测试不同系统或模块之间资源交互是否正确。
2.为什么要做接口测试?
因为在大部分系统和产品中,资源数据都是核心,所以接口是需要要测试的,并且接口中大部分内容都是数据,通过数据的对比可以推测系统和产品的逻辑,测试接口就是测试逻辑。所以很必要做接口测试。
3.什么时候做接口测试?
a.出现bug,通过接口测试,清晰找到bug的源头,是前端还是后端的bug;
b.回归测试,利用接口测试原有的接口是否正常,保证之前的业务流程没有受影响;
c.接口开发完成后,可以做接口测试。
4.接口测试的工具有哪些
soapUI、postman、jemeter、insomnia、paw。
5.接口测试的流程是什么?
a.接口的通过性验证:数据正确输入,是否正确返回结果。测试接口的正常场景和异常场景;
b.边界测试:不按照你接口文档上的要求输入参数,测试其边界情况。比如说必填的参数不填,输入整数类型的正常,超过参数取值范围等;
c.参数组合:如果接口中有参数需要组合用的,两个参数是组合使用,测试其各种情况;
d.异常验证:测试幂等情况,并发情况,事务测试等异常情况;
e.接口安全:绕过验证,敏感信息加密等情况;
f.性能测试:响应时间、并发数、吞吐量、服务器资源利用率。
6.请问你们公司是如何做接口测试的?
swagger 、 接口自动化脚本。
7.接口测试质量评估标准是什么?
接口表现与接口文档的一致性;
请求参数:必选和非必选、长度、字符类型、为空、缺失、组合、重复;
返回数据:正常和异常。
【自动化测试相关】
1.如何看待自动化和手动测试?怎样的一个比例才是健康的?
自动化适合做为回归测试的主要方式,新上线的功能一般都是用手动测试方式,一些极端和用户习惯操作还是手动测试比较方便。尽可能线上稳定的功能模块都做成自动化,提供效率。
2.你们公司的自动化投入产出比怎样?效益怎样?
自动化主要作为回归测试,减少测试时间。UI自动化没有弄,基本找不到bug 。
3.完整运行一次自动化用例需要多久时间?
主要跑的是业务流,所以跑一次需要半个小时左右。
4.什么是分层自动化?
金字塔结构, 最底层UnitTest,往上接口API/集成起来的service, 最上面UI自动化。
5.你的测试数据是怎么准备的?
提前准备好,在代码里的yaml文件。
6.测试脚本的维护成本是怎么样的?
业务不变的情况下,一般脚本都是不坏不动的。
【性能测试相关】
1.请问你们公司是如何做性能测试的?请讲诉性能测试的相关指标?
a.做性能需求分析,挑选了用户使用最频繁的功能来做性能测试,比如:登陆,搜索,提交订单,确定性能指标,比如:事务通过率为100%,90%的事务响应时间不超过5秒,并发用户为1000人,CPU和内存的使用率为70%以下;
b.性能测试计划,明确测试时间(通常在功能稳定后,如第一轮测试后进行)和测试环境和测试工具的选择;
c.编写性能测试用例;
d.搭建性能测试环境,准备好性能测试数据;
e.通过性能测试用例,编写性能测试脚本;
f.性能测试脚本进行调优,设置检查点、参数化、关联、集合点、事务,调整思考时间,删除冗余的脚本等;
g.设计性能测试场景,使用nmon工具监控服务器,运行测试场景;
h.分析性能测试结果,如果有问题(性能瓶颈),收集相关的日志提单给开发修改;
i.开发修改好后,回归性能测试;
j.编写性能测试报告;
相关指标:响应时间、并发数、吞吐率、资源利用率、TPS。
2.压力测试和负载测试的区别
负载测试是模拟实际软件系统所承受的负载条件的系统负荷,通过不断加载(如逐渐增加模拟用户的数量)或其它加载方式来观察不同负载下系统的响应时间和数据吞吐量、系统占用的资源(如CPU、内存)等,以检验系统的行为和特性,以发现系统可能存在的性能瓶颈、内存泄漏、不能实时同步等问题。
压力测试是在高负载情况下对系统的稳定性进行测试。是在高负载(大数据量、大量并发用户等)下的测试,观察系统在峰值使用情况下的表现,从而发现系统的功能隐患。
负载测试:多用户,用户数渐增,持续同时发同一业务请求,产出最大TPS;
压力测试:多用户,资源使用饱和,持续同时发同一业务请求,产出系统瓶颈或使用极限。
3.服务器中一般要监控哪些数据,如何监控的,怎么从监控数据中发现问题?
基础监控和应用监控。
基础监控包括机器是否死机,cpu,内存,磁盘使用率等;应用监控包括日志监控、端口监控、进程数监控等。
4.假设系统A调用系统B,我把B的接口都mock了,进行性能测试,这样有什么好处和坏处?
好处:防止系统B出错引起测试错误;不会因系统B的开发进度影响测试;mock后可以快速返回结果,提高测试效率。
坏处:很多情况下无法完全模拟出服务器的所有可能的返回情况,另外,mock掉了关联方之后,整个环境的连通性可能测试的不到位。
5.有一天早上打车高峰,滴滴服务端挂了大概30分钟,工程师抢修之后,马上上线,之后又挂了,请问有哪些原因会造成这个情况?
服务器内存不够、服务器超出负载、并发量太大、遇到恶意攻击。
1.请写出冒泡排序
#冒泡排序:n*n
def bubbleSort(array):
maxindex = len(array)-1
maxValue = array[maxindex]
k=0
while maxindex:
for i in range(1,maxindex):
if array[i-1]>array[i]:
temp = array[i]
array[i] = array[i-1]
array[i-1] = temp
k+=1
maxindex -=1
print(k)
return array
2.1~9999数列中数字3出现的次数。用递推方法解出。
def count_digit(number):
return len(str(number))
def countThree(digit):
if not isinstance(digit,int):
raise TypeError('number is not int')
# digit = len(str(number))
if(digit <=0):
return 0
if(digit ==1):
return 1
return 10*countThree(digit-1) + 10 **(digit-1)
print(countThree(count_digit(9999)))
3.从一个数组中找出前4个最大的数,用最优解。
#快速排序:最快的n*logN
def qiuckSort(list):
if len(list)<2:
return list
mid = list[0]
left = [i for i in list[1:] if i <= mid]
right = [i for i in list[1:] if i > mid]
finallyList = qiuckSort(left)+[mid] + qiuckSort(right)
return finallyList
array = [3, 0, 1, 832,23,45, 5, 5, 6,46, 9, 56, 897]
print(qiuckSort(array)[-4:])
4.写一段程序,删除字符串a中包含的字符串b,举例 输入a = “asdw”,b = “sd” 返回 字符串 “aw”,并且测试这个程序。
def delBString(a,b):
if not isinstance(a,str):
raise TypeError("a is not str")
if not isinstance(b,str):
raise TypeError("b is not str")
if len(a) < len(b):
raise Exception('a length must large to b length')
result = []
flag = False
i=0
la = len(a)
lb = len(b)
while i <la:
j = 0
while j < lb:
if i+j < la and a[i+j] == b[j]:
j += 1
else :
j += 1
flag = False
break
flag = True
if flag:
i += lb
else:
result.append(a[i])
i += 1
return "".join(result)
测试用例:
class TestdelInnerStringFunctions():
def setUp(self):
pass
def tearDown(self):
pass
def test_nomorl1(self):
assert delBString('asdqwe','we') == 'asdq'
def test_nomorl2(self):
assert delBString('asdqwe','0') == 'asdqwe'
def test_nomorl3(self):
assert delBString('测试asdqwe','we') == '测试asdq'
def test_nomorl4(self):
assert delBString('测试asdqwe','测试') == 'asdqwe'
def test_nomorl5(self):
assert delBString('asdqwe','') == 'asdqwe'
def test_nomorl6(self):
with pytest.raises(TypeError):
delBString('', 0)
def test_nomorl7(self):
with pytest.raises(TypeError):
delBString(0, 'as')
def test_nomorl8(self):
with pytest.raises(TypeError):
delBString(True)
def test_nomorl9(self):
with pytest.raises(Exception) as excinfo:
delBString('acd','acde')
assert "a length must large to b length" in str(excinfo.value)
assert excinfo.type == Exception
5.写一个方法,把字符串转为数字,比如 str=“1234”,变成 int 1234。并且测试这个程序。
def StrToInt(a):
res ,mult,flag = 0,1,1
if not isinstance(a,str):
raise TypeError("a is not str")
if a[0] =='-' or a[0] == '+':
if a[0] == '-':
flag = -1
a = a[1:]
for i in range(len(a)-1,-1,-1):
if '9' >=a[i] >= '0':
res +=(ord(a[i]) -48) * mult
mult = mult *10
else :
return 0
return res * flag
def test_strToInt2(self):
with pytest.raises(TypeError):
StrToInt(34)
测试用例:
def test_strToInt3(self):
assert StrToInt('测试赛') == 0
def test_strToInt4(self):
assert StrToInt('+2147689') == 2147689
def test_strToInt5(self):
assert StrToInt('45') == 45
def test_strToInt6(self):
assert StrToInt('1a33') == 0
def test_strToInt7(self):
assert StrToInt('-5') == -5
6.给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
# Python
def TargetSum(nums,target):
if len(nums) < 2:
return 0
for i in range(0,len(nums)-1):
for j in range (i+1,len(nums)):
if nums[i] + nums[j] == target:
return [i,j]
# 测试用例
def test_TargetSum1(self):
assert TargetSum([1,1,3,6,0,2],2) == [0,1]
def test_TargetSum2(self):
assert TargetSum([1],1) == 0
def test_TargetSum3(self):
assert TargetSum([6,2,4,3,1,2],4) == [1,5]
def test_TargetSum4(self):
assert TargetSum([2, 7, 11, 15],9) == [0,1]
public int[] TargetSum(int nums[],int target){
Map<Integer, Integer> map = new HashMap<>();
for(int i=0;i<nums.length;i++){
int temp = target - nums[i];
if(map.containsKey(temp)){
return new int[] { map.get(temp), i };
}
map.put(nums[i],i);
}
return null;
}
7.给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
'''
说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:
输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
## python
class Solution(object):
def twoSum(self, numbers, target):
l=0
r=len(numbers)-1
while(l<r):
if(numbers[l]+numbers[r]== target):
return [l+1,r+1]
if(numbers[l]+numbers[r] <target):
l += 1
else:
r -= 1
## 测试用例:
def test_towSum1(self):
assert towSum([0,1, 1, 2, 3, 6,8], 2) == [1, 4]
def test_towSum2(self):
assert towSum([1,2,5,6,12], 13) == [1, 5]
def test_towSum3(self):
assert towSum([2, 7, 11, 15], 9) == [1, 2]
## Java
public int[] twoSum(int[] numbers, int target) {
int left = 0;
int right = numbers.length - 1;
while (left < right) {
if (numbers[left] + numbers[right] == target) {
return new int[]{left + 1, right + 1};
}
if (numbers[left] + numbers[right] < target) {
left += 1;
} else {
right -= 1;
}
}
return null;
}
8.假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。
'''
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
'''
Python
## 不推荐 效率极低 ##
def setpMethod(num):
if(n == 1 or n == 2):
return n
else:
return self.setpMethod(num-1)+self.setpMethod(num-2)
## 推荐写法 ##
def climbStairs(self, n):
if(n == 1 or n == 2):
return n
num1=1
num2=2
while(n >= 3):
result = num1 + num2
num1 = num2
num2 = result
n -=1
return result
## Java ##
public int setpMethod(int n){
if(n ==1 || n ==2){
return n;
}
int result = 0,n1 = 1,n2 = 2;
while (n>=3){
result = n1 + n2;
n1 = n2;
n2 = result;
n--;
}
return result;
}
9.给定一个非负整数数组,你最初位于数组的第一个位置。
'''
示例 1:
输入: [2,3,1,1,4]
输出: true
解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。
示例 2:
输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。
'''
## python ##
class Solution(object):
def canJump(self, nums):
need = 1
if(len(nums) ==1):
return True
if(nums[0] == 0):
return False
for i in range(len(nums)-2,-1,-1):
if(nums[i] == 0 or nums[i] < need):
need += 1
else:
need = 1
if(need == 1) :
return True
else:
return False
## java ##
public boolean canJump(int[] nums) {
int n = 1;
if(nums.length ==1){
return true;
}
if(nums[0] == 0){
return false;
}
for(int i=nums.length-2; i>=0; i--){
if(nums[i] >= n){
n=1;
}else{
n++;
}
}
if(n == 1){
return true;
}else{
return false;
}
}
10.以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。
在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。
更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径.
请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符串。
示例 1:
输入:"/home/"
输出:"/home"
解释:注意,最后一个目录名后面没有斜杠。
示例 2:
输入:"/../"
输出:"/"
解释:从根目录向上一级是不可行的,因为根是你可以到达的最高级。
示例 3:
输入:"/home//foo/"
输出:"/home/foo"
解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。
示例 4:
输入:"/a/./b/../../c/"
输出:"/c"
示例 5:
输入:"/a/../../b/../c//.//"
输出:"/c"
示例 6:
输入:"/a//bc/d//././/.."
输出:"/a/b/c"
##python##
def simplifyPath(self, path):
"""
:type path: str
:rtype: str
"""
paths = path.split('/')
str = ''
pathlist = [i for i in paths if I]
result = []
for j in range(len(pathlist)):
print(j)
if(pathlist[j] == ".."):
if(result):
result.pop()
elif(pathlist[j] == "."):
continue
else :
result.append(pathlist[j])
if not result:
return '/'
for k in range(len(result)):
str = str + '/' + result[k]
return str
11.给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘’ 的通配符匹配。’?’ 可以匹配任何单个字符。’’ 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。
说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。
示例 1:
输入:
s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。
示例 2:
输入:
s = "aa"
p = "*"
输出: true
解释: '*' 可以匹配任意字符串。
示例 3:
输入:
s = "cb"
p = "?a"
输出: false
解释: '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。
示例 4:
输入:
s = "adceb"
p = "*a*b"
输出: true
解释: 第一个 '*' 可以匹配空字符串, 第二个 '*' 可以匹配字符串 "dce".
示例 5:
输入:
s = "acdcb"
p = "a*c?b"
输入: false
##python##
def isMatch(self, s, p):
si, pi, pj, sj = 0, 0, -1, -1
while si < len(s):
if pi < len(p) and p[pi] == '*':
pi += 1
pj = pi
sj = si
elif pi < len(p) and (p[pi] == '?' or p[pi] == s[si]):
pi += 1
si += 1
elif pj != -1:
pi = pj
sj += 1
si = sj
else:
return False
while (pi < len(p) and p[pi] == '*'):
pi += 1
return pi == len(p)
12.给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
## python ##
class Solution(object):
def addTwoNumbers(self, l1, l2):
n =l1.val + l2.val
l3 = ListNode(n%10)
l3.next = ListNode(n//10)
p1 = l1.next
p2 = l2.next
p3 = l3
while True:
if p1 and p2:
sum = p1.val+ p2.val + p3.next.val
p3.next.val = sum % 10
p3.next.next = ListNode(sum//10)
p1 = p1.next
p2 = p2.next
p3 = p3.next
elif p1 and not p2:
sum = p1.val + p3.next.val
p3.next.val = sum %10
p3.next.next = ListNode(sum // 10)
p1 = p1.next
p3 = p3.next
elif not p1 and p2:
sum = p2.val +p3.next.val
p3.next.val = sum % 10
p3.next.next = ListNode(sum // 10)
p2 = p2.next
p3 = p3.next
else :
if p3.next.val == 0:
p3.next = None
break
return l3
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。