0319美团一面
1.自我介绍+项目介绍
2.你在项目担任的职责
1、2问题根据个人,视情况而定
3.Linux常用的命令
ls:查看文件
kill -9:终止进程
su -username:切换用户
pwd:当前目录
cp -r :复制文件包括其子文件到自定目录
创建目录:mkdir
删除目录:rmdir
rm -rf file:删除文件包括其子文件
mv:移动文件
tar -czf:压缩文件
tar -xvzf:解压文件
tail -f:查看日志文件
vi命令
:w :保存当前文件
:x:保存当前文件并退出
:q:退出vi
:q!:不保存文件并退出vi
:wq:保存并退出
4.死锁是什么
所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。 因此我们举个例子来描述,如果此时有一个线程A,按照先锁a再获得锁b的的顺序获得锁,而在此同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁。
5.怎么解决死锁,死锁的类型
行锁,页锁,表锁,数据库锁
一般来说,处理死锁问题有三种方法:
- 通过协议来预防或避免死锁,确保系统不会进入死锁状态。
- 可以允许系统进入死锁状态,然后检测它,并加以恢复。
- 可以忽视这个问题,认为死锁不可能在系统内发生。
6.测试电梯,电梯按钮,电梯门(单元测试)
(1)功能:上升、下降、停止、开门、关门、梯内电话、灯光、指示灯,监控等;
(2)性能:速度、反应时间、关门时间等;
(3)压力:超载、尖锐物碰撞电梯壁等;
(4)安全:停电、报警装置、轿箱停靠位置、有人扒门时的情况等;
(5)可用性:按键高度、操作是否方便、舒适程度,是否是就近原则停靠等;
(6)UI:美观程度、光滑程度、形状、质感等;
(7)稳定性:长时间运行情况等;
(8)兼容性:不同电压是否可工作、不同类型电话是否可安装等。
(9)异常场景: 突然停电时的情况、障碍物阻挡、
(10)交互测试: 多次点击同一楼层号码、与其他电梯之间是否协作良好、同时按关门和开门按钮、电梯运行期间上人下人再按新的楼层等
(11)优化点:比如电梯按钮的设计是否符合一般人的习惯,按钮颜色关门后是否清晰可见数字等等
7.你知道的测试方法(等价类、边界值)
等价类划分法、边界值分析法、场景法、因果图法
8.什么是等价类和边界值
等价类划分法是一种典型的、重要的黑盒测试方法,是指某个输入域的子集。在该子集合中,所有的输入数据对于揭露软件中的错误都是等效的。
边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充,这种情况下,其测试用例来自等价类的边界。边界值分析法是对等价类划分法做补充的一种黑盒测试设计方法。
9.提取json字符串
JSON(JavaScript Object Notation)一种轻量级的数据交互格式
类似于一种数据封装,可以想象为java中student封装类
JSON的数值可以是数字、字符串、布尔值、数组或者对象、null
10.SQL查询语句(三个)
11.一段不均匀的绳子烧可以一个小时,烧1个小时15分钟怎么烧
准备三个绳子a,b,c,同时点燃绳子a和b,绳子a只需点燃一端,绳子b需要点燃两端,当b燃烧完时,再点燃绳子a的另一端,当绳子a燃烧完时,再点燃绳子c的一端,当c燃烧完时,也就是1个小时15分钟了。
12.输入美团地址后会发生什么。说的不详细dns的过程也要细说
总的来说,当你输入在浏览器里输入一个URL到页面加载,发生的顺序如下:
(1)DNS查询
(2)TCP连接
(3)发送HTTP请求
(4)Server处理HTTP请求并返回HTTP报文
(5)浏览器解析并render页面
(6)HTTP连接断开
13.你对测试的了解
我认为测试经验越多,测试能力越高。职业发展是需要时间累积的,一步步向着高级测试工程师奔去。我也有初步的职业规划,前2年累积测试经验,不断的更新自己改正自己,做好测试任务。然后做好测试,需要对业务和软件需求非常清楚,可以根据需求不同选择不同的测试用例设计
14.你了解的脚本语言
Shell:Shell脚本(shell script),是一种为 shell 编写的脚本程序。
JavaScript:JavaScript是互联网上最流行的脚本语言,这门语言可用于 HTML 和 web,更可广泛用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备。
PHP:PHP是服务器端脚本语言。
Python:Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。
Ruby:Ruby是一种类似于 Python的服务器端脚本语言。
15.你觉得脚本语言的优点
优点:
快速开发:脚本语言极大地简化了“开发、部署、测试和调试”的周期过程。
容易部署:大多数脚本语言都能够随时部署,而不需要耗时的编译/打包过程。
同已有技术的集成:脚本语言被Java或者COM这样的组件技术所包围,因此能够有效地利用代码。
易学易用:很多脚本语言的技术要求通常要低一些,因此能够更容易地找到大量合适的技术人员。
动态代码:脚本语言的代码能够被实时生成和执行,这是一项高级特性,在某些应用程序里(例如JavaScript里的动态类型)是很有用也是必需的。
缺点:
脚本语言不够全面:它们会要求一门“真正的”编程语言的存在,必须找一个数据库驱动程序将其内置进脚本语言里。
脚本语言并不是软件工程和构建代码结构的最佳选择,例如面向对象和基于组件的开发。
脚本语言通常不是“通用”语言,但是能够根据专门的应用来调整,例如:PHP。
主要是体现在它是非常的简单易学,很多的脚本语言技术要求都不是特别的高,所以很多的编程人员都是会使用脚本语言的。而在开发上,脚本语言是简化了开发、部署、测试和调试的周期过程,这对于工作来说提供了极大的方便。
关于脚本语言的缺点,它在语言方面是不够全面的,而且它也并不是一个通用的语言,但也是可以根据专门的应用来调整。从总体上来说,脚本语言的优点绝对是大于优点的,对于现在的编程工作来说,帮助也是非常的大。
16你了解的git
Git是一个开源的分布式版本控制,用于敏捷高效处理大或者小的项目。
GIT 与 SVN 区别
Git不仅仅是一个版本控制,他也是一个内容管理系统(CMS),工作管理系统
Git是分布式的,SVN不是
Git按照内容按照原数据的方式储存,而SVN是按照文件
Git分支和SVN的分支不同
Git没有一个全局的版本号,而SVN
Git的完整性要优于SVN,Git 的内容存储使用的是 SHA-1 哈希算法。
17.反问
岗位所在的团队是怎样的?
公司有哪些可以学习培训的机会?
0322美团二面
1.自我介绍+项目介绍
2.项目管理bug方法
3.你们遇到的的困难
4.有没有为项目做过计划
1、2、3、4等问题根据个人,视情况而定
5.对于云计算的了解
云计算是分布式计算技术的一种,云计算就是让用户使用互联网来使用在云端的应用,数据,或者服务。不同的用户,接入到云,获取资源这些应用,数据,或者服务,就是云计算的资源。
IaaS——Infrastructure as a Service(基础设施即服务)
PaaS——Platform as a Service(平台即服务)
SaaS——Software as a Service(软件及服务)
私有云、公有云、混合云、云存储、云游戏、云物联、云安全
6.你对测试开发的了解
测试开发的核心职能依然是测试,只是工程师人员一边具备测试经验、熟练使用测试工具还有开发能力的前提下,可以自己开发平台,或对现有开源工具能够进行二次开发,最终目的是可以提升产品测试效率。
7.测试和测试开发的区别
测试人员的基本要求:基础的测试人员不会要求有太强的编程技术,普通的应用或是代码能看懂就可以。考虑问题时能够全面、细致、有原则,对产品敏感,不会跟着开发和产品走,偏重业务测试。
测试开发,测试为主,开发为辅。
一个偏重业务测试,一个业务测试结合测试工具开发。
8.软件开发和测试开发的区别
测试开发人员首先需要写测试工具,自动化测试代码,有一定的开发编程能力,虽然不会像开发那样熟练掌握一种编程语言,但要对于脚本语言还是要有所掌握的,Java、Python等。
软件开发注重把技术转化为业务,能够编码实现需求文档,对编程能力有较高的要求。他们需要从项目需求提出,知识转移、接口文档提供、架构设计、数据库设计、代码设计等,然后自测通过后再叫给测试。
9.设计测试用例的方法(黑盒:等价类、边界值,白盒:语句覆盖。。。)
白盒测试用例设计常用方法
答:
静态测试:不用运行程序的测试,如文档测试、代码检查等
动态测试:需要执行代码,接口测试、覆盖率分析、性能分析、内存分析等。
逻辑覆盖法:主要包括语句覆盖,判断覆盖,条件覆盖,判断/条件覆盖,条件组合覆盖,路径覆盖等。
六种覆盖标准发现错误的能力由弱到强的变化:
语句覆盖,每条语句至少执行一次。
判断覆盖,每个判断的每个分支至少执行一次。
条件覆盖,每个判段的每个条件应取到的各种可能的值。
判断/条件覆盖,同时满足判断覆盖条件覆盖。
条件组合覆盖,每个判定中各条件的每一种组合至少出现一次。
路径覆盖,使程序中每一条可能的路径至少执行一次。
黑盒测试用例设计常用方法
答:
等价划分类,边界值分析,错误推测法、判定表分析法、因果图法、正交试验设计法、场景法、功能图分析法等。
等价类:等价类是指某个输入域的子集合.在该子集合中,各个输入数据对于揭露程序中的错误都是等效的.因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件,就可以用少量代表性的测试数据.取得较好的测试结果.
等价类划分可有两种不同的情况:有效等价类和无效等价类.
边界值分析法:边界值分析方法是对等价类划分方法的补充。测试工作经验告诉我,大量的错误是发生在输入或输出范围的边界上,而不是发生在输入输出范围的内部.因此针对各种边界情况设计测试用例,可以查出更多的错误.(内点,上点,离点)
错误猜测法:基于经验和直觉推测程序中所有可能存在的各种错误,从而有针对性的设计测试用例的方法.
判定表分析法:等价类未考虑输入条件之间的联系,相互组合等.无效类每个用例只出现一次,不能覆盖多个无效等价类并存的情况。不同的组合用二进制解决。(条件桩和动作桩)
因果图法:输入之间有相互的组合关系,且输入和输出之间有相互的制约和依赖关系,是判定表的复杂版,最终生成的就是判定表,根本上等价
正交表分析法:有时候,大量的参数的组合而引起测试用例数量上的激增,同时,这些测试用例并没有明显的优先级上的差距,而测试人员又无法完成这么多数量的测试,就可以通过正交表来进行缩减一些用例,从而达到尽量少的用例覆盖尽量大的范围的可能性。(打印机)
场景法:指根据用户场景来模拟用户的操作步骤,一般借助流程图来确定基本流和备选流(淘宝下单流程)。
状态图法:针对流程分析法不跨多个界面,状态图法保证每一个功能/状态的可达项都被覆盖,但对无效的路径无法覆盖(MP3).
计算机网络方面
10.Cookie和session的区别
Cookie:
cookie的数据信息存放在客户端浏览器上。
单个cookie保存的数据<=4KB,一个站点最多保存20个Cookie。
cookie中只能保管ASCII字符串,并需要通过编码方式存储为Unicode字符或者二进制数据。
cookie对客户端是可见的,别有用心的人可以分析存放在本地的cookie并进行cookie欺骗,所以它是不安全的。
开发可以通过设置cookie的属性,达到使cookie长期有效的效果。
cookie保管在客户端,不占用服务器资源。对于并发用户十分多的网站,cookie是很好的选择。
cookie支持跨域名访问。
session:
session的数据信息存放在服务器上。
对于session来说并没有上限,但出于对服务器端的性能考虑,session内不要存放过多的东西,并且设置session删除机制。
session中能够存储任何类型的数据,包括且不限于string,integer,list,map等。
session存储在服务器上,对客户端是透明对,不存在敏感信息泄漏的风险。
session依赖于名为JSESSIONID的cookie,而cookie JSESSIONID的过期时间默认为-1,只需关闭窗口该session就会失效,因而session不能达到长期有效的效果。
session是保管在服务器端的,每个用户都会产生一个session。假如并发访问的用户十分多,会产生十分多的session,耗费大量的内存。
session不支持跨域名访问。
11.Put和post的区别
PUT请求是向服务器端发送数据的,从而改变信息,该请求就像数据库的update操作一样,用来修改数据的内容,但是不会增加数据的种类等,也就是说无论进行多少次PUT操作,其结果并没有不同。
POST请求同PUT请求类似,都是向服务器端发送数据的,但是该请求会改变数据的种类等资源,就像数据库的insert操作一样,会创建新的内容。几乎目前所有的提交操作都是用POST请求的。
12.一个url每段都代表什么
网址简化:协议://域名:端口号/资源位置?参数=值
完整的网址(url)中文版本: 协议://主机名(域名):端口号/路径/文件名?查询字符串#锚点
操作系统
13.进程间的通信方式
(1)匿名管道通信
(2)高级管道通信
(3)有名管道通信
(4)消息队列通信
(5)信号量通信
(6)共享内存通信
(7)套接字通信
14.Bash 和 DOS的区别(没答上来)
BASH命令区分大小写,而DOS命令则不区分;
在BASH下,/
character是目录分隔符,\
作为转义字符。
在DOS下,/
用作命令参数分隔符,\
是目录分隔符
DOS遵循命名文件中的约定,即8个字符的文件名后跟一个点,扩展名为3个字符。BASH没有遵循这样的惯例。
数据库
15.SQL查询每门课成绩都大于80分的学生姓名
select name from test.stu
group by name
having min(t.score) > 80;
select name from test.stu
group by name
having count(score) =sum(case when score>80 then 1 else 0 end )
select name from stu
group by name
having name not in (
select name from stu
where score <80)
16.视图的优缺点
使用视图的优点
1,视图着重于特定数据
2,简化数据的操作,易维护
使用视图的缺点
1,操作视图会比直接操作基础表要慢
2,修改限制
优点:
(1)为用户集中数据,简化用户的数据查询和处理。有时用户所需要的数据分散在多个表中,定义视图可将它们集中在一起,从而方便用户的数据查询和处理。
(2)屏蔽数据库的复杂性。用户不必了解复杂的数据库中的表结构,并且数据库表的更改也不影响用户对数据库的使用。
(3)简化用户权限的管理。只需授予用户使用视图的权限,而不必指定用户只能使用表的特定列,也增加了安全性。
(4)便于数据共享。各用户不必都定义和存储自己所需的数据,可共享数据库的数据,这样同样的数据只需存储一次。
(5)可以重新组织数据以便输出到其他应用程序中。
缺点:
(1)性能差
sql server必须把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,sql server也要把它变成一个复杂的结合体,需要花费一定的时间。
( 2 )修改限制
当用户试图修改试图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的试图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。
17.事务是什么
事务是作为单个工作单元而执行的一系列操作,如查询和修改数据,甚至是修改数据的定义。
18.事务的四个特性
ACID
原子性:事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
一致性:事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
隔离性:多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
持久性:已被提交的事务对数据库的修改应该永久保存在数据库中
19.Char 和varchar的区别
char 表示定长,长度固定,varchar表示变长,即长度可变。char如果插入的长度小于定义长度时,则用空格填充;varchar小于定义长度时,还是按实际长度存储,插入多长就存多长。
因为其长度固定,char的存取速度还是要比varchar要快得多,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以会占据多余的空间,可谓是以空间换取时间效率。varchar则刚好相反,以时间换空间。
char类型的长度是固定的,varchar的长度是可变的。char类型的效率比varchar的效率稍高。
对 char 来说,最多能存放的字符个数 255,而 varchar ,最多能存放 65532 个字符。
20.Count(*),count(1)和count(列名)区别
执行效果上 :
count(*)包括了所有的列,相当于行数,在统计结果的时候, 不会忽略列值为NULL
count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候, 不会忽略列值为NULL
count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数, 即某个字段值为NULL时,不统计。
执行效率上:
列名为主键,count(列名)会比count(1)快
列名不为主键,count(1)会比count(列名)快
如果表多个列并且没有主键,则count(1)的执行效率优于count(*)
如果有主键,则select count(主键)的执行效率是最优的
如果表只有一个字段,则select count(*)最优
算法
14.数字1-100逢7和7的倍数跳过用-表示,输出时每5个数进行一次换行。
class Solution {
public static void main(String[] args) {
int count = 0;
for (int i = 1; i <= 100; i++) {
if(i % 10 == 7 || i % 7 == 0 || i / 10 == 7) {
System.out.print("-" + "\t");
}else{
System.out.print(i + "\t");
}
count++;
if(count % 5== 0) {
System.out.println();
}
}
}
}
15.== 和equals()区别
1.==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同
2.==是指对内存地址进行比较 , equals()是对字符串的内容进行比较
3."= =“指引用是否相同, equals()指的是值是否相同,”= ="是java提供的等于比较运算符,用来比较两个变量指向的内存地址是否相同.而equals()是Object提供的一个方法.Object中equals()方法的默认实现就是返回两个对象==的比较结果.但是equals()可以被重写,所以我们在具体使用的时候需要关注equals()方法有没有被重写.
规约: 【强制】所有的相同类型的包装类对象之间值的比较,全部使用 equals 方法比较。 说明:对于 Integer var = ? 在-128 至 127 范围内的赋值,Integer 对象是在IntegerCache.cache 产生,会复用已有对象,这个区间内的 Integer 值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用 equals 方法进行判断。
16.String 和 StringBuffer的区别
String | StringBuffer | StringBuilder |
---|---|---|
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间 | StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量 | 可变类,速度更快 |
不可变 | 可变 | 可变 |
线程安全 | 线程不安全 | |
多线程操作字符串 | 单线程操作字符串 |
String:是对象不是原始类型.
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.
StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.通过它的append方法向其赋值.
sb.append(“hello”);
17.如何理解面向对象?面向对象的特性?
- 面向对象是模型化的,你只需抽象出一个类,这是一个封闭的盒子,在这里你拥有数据也拥有解决问题的方法。需要什么功能直接使用就可以了,不必去一步一步的实现,至于这个功能是如何实现的,管我们什么事?我们会用就可以了。
- 面向对象的底层其实还是面向过程,把面向过程抽象成类,然后封装,方便我们使用的就是面向对象了。
抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
- 封装:把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。
- 继承:是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码。
- 多态:所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定