面试:
1、说一说软件测试的过程或流程?(软件测试P28)
软件测试按照阶段划分,一般分为5个阶段:单元测试、集成测试、确认测试、系统测试和验收测试。
软件测试的工作范畴可以分为两个层次:
• 软件测试工作的组织与管理:制定测试策略、测试计划,确认所采用的测试方法与规范,控制测试进度,管理测试资源。
• 软件测试工作的实施:编制符合标准的测试文档,搭建测试环境,开发测试脚本,与开发组织协作实现各阶段的测试活动。
• 测试组织和管理:
o 建立测试队伍,设立不同功能或执行不同任务的测试小组,并对测试用例、软件缺陷、测试执行、测试文档等管理。
• 测试计划:
o 确定测试目标和测试范围,分析哪些功能要测试,哪些功能不要测试,识别测试风险,对测试工作量进行预估,已决定人力资源和做出合理的进度安排,一般,开发组负责编制单元测试计划和说明,而测试组负责编制功能、系统等其他阶段的测试和说明。
• 测试用例设计:
o 需要考虑各种软件的使用场景和操作路径,设计出最优可能发现缺陷的用例。
• 测试实施:
o 按测试计划和测试说明的定义对测试对象进行相应的测试,填写测试报告中相应的表格。
• 测试结果分析:
o 对测试结果进行定量和定性的分析,以检查测试工作的执行状态
• 测试评审和报告:
o 根据软件测试评审准则在各个测试阶段评审时提交类型完整测试文档。
2、白盒测试和黑盒测试是什么?说一说什么时候选用白盒测试,什么时候选用黑盒测试?(P30)
• 概念
白盒测试是已知产品的内部工作过程,清楚最终生成软件产品的计算机程序结构及语句,按照程序内部的结构测试程序,检验程序中的每条通路是否都能按预定要求正确工作。
• 白盒测试是基于覆盖的测试,具体方法有:
• 逻辑覆盖
语句覆盖
判定覆盖
条件覆盖
判定/条件覆盖
条件组合覆盖
• 循环覆盖
• 基本路径覆盖
• 白盒测试主要用于单元测试。
黑盒测试也称功能测试在测试过程中,把程序看成一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,只依靠被测试程序的输入和输出之间关系或程序的功能来设计测试用例。
• 黑盒测试的方法:
• 等价类划分
• 边界值分析
• 错误推测法
• 因果图法
• 优缺点比较:
o 黑盒测试 优点:较为简单,能知道软件中有哪些功能,在自动化测试时较为方便;
缺点:覆盖率低、复用性低
o 白盒测试
优点:覆盖率高,能发现隐含问题,提高代码质量;
缺点:不可能测试所有路径,系统庞大时开销大,只能知道测试开发人员做的对不对,而不能知道设计是否正确,可能会漏掉一些功能需求
• 应用
• 白盒测试方法可以在更早的时候进行,只要有一段程序被完成就可以进行,而黑盒测试必须等到一个单元全部完成或等到整个系统完成后才能进行。
• 黑盒测试人员偏重于业务方面,而白盒测试人员侧重于实现方式;黑盒测试注重整体,而白盒测试则更注重局部。
• 白盒测试是对过程的测试,黑盒测试是对结果的测试。
• 在一个项目中测试工程师还是以黑盒测试为主,白盒测试为辅。因为你首先要用黑盒测试来验证结果是否正确,或者说目标是否正确,如果结果正确,然后再用白盒测试来验证,这个正确的结果是不是由于正确的过程产生的。如果结果不正确,那么用白盒测试来找到过程中错误的地方。只有先做好黑盒测试,然后用白盒测试验证,这个测试才能说做的完整了。
3、集成测试、功能测试、回归测试,功能测试和回归测试的区别,为什么要有回归测试?
测试 概念 测试阶段 依据
集成
测试 是将已分别通过测试的单元按照设计要求组合起来在进行的测 试,以检查这些单元之间的接口是否存在问题。一般由若干个不同测试组成。 在单元测试之后 需求规格说明书、概要设计文档、详细设计说明书
功能
测试 根据产品规格说明书,来检验被测系统是否满足各方面功能的使用要求。 可在单元测试、系统测试、集成测试中 产品规格说明书
回归
测试 是指修改了旧代码之后,重新进行的测试以及确认没有引入新的错误或导致其他代码产生错误,不需要全面测试,只需根据修改进行有效测试。 所做的修改达到了预定目的,新功能得到了实现;不影响软件原有功能的正确性
4、说出一个你写过的软件测试的case,它是用来测什么的,属于哪种测试类型?
曾经写过的软件测试的case,用来测试job-service,分为两种,分别为normal-tests和error-tests,大致过程是,在其中的一个TestCase中添加多个Step,用来创建各种类型的Job,其中有ondemand、Schedule等,之后创个多个TestCase,进行getJob,updateJob,triggerJob,getInstance,getResult,deleteInstance,DeleteJob等操作。主要用这些测试Case中的步骤测试Jobservice中创建Job,并进行运行、修改、触发、和获取、删除时的结果能够达到预期效果。
• 每个testSuite中有多个TestCase,之下又有多个Step,不知道能不能看做一个集成测试。
• 进行job更新后,有triggerJob,不知道能不能看作回归测试。
5、描述一下实习的测试架构?
Jenkins创建一个Pipeline的project,在github中有一个Groovy的库,用来存储所有的运行接口,在每个项目中有一个.ci文件夹,其下有Jenkinsfile、release、docker和kubernates相关配置,数据库信息等,jenkinsfile中存储了各个阶段的运行,通过运行项目中的soapui.xml中的case进行测试。
6、java属于object的类有哪些?
Hashcode(),equals(),wait(),notify(),botifyall(),finalize(),clone(),toString(),getClass()
equals()返回boolean型,hashcode返回int型
7、”==“ 和equals的区别,hashcode,为什么要用hashcode,equals和hashcode都是返回什么类型?
• ==
Java中的数据类型,可分为两类:
1)基本数据类型,也称原始数据类型
byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值。
2)引用类型(类、接口、数组)
• 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。
• 对象是放在堆中的,栈中存放的是对象的引用(地址)。由此可见'=='是对栈中的值进行比较的。如果要比较堆中对象的内容是否相同,那么就要重写equals方法了。
• equals() 返回boolean
1)、默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一个地址(是不是同一个对象), 定义的equals与==是等效的。
2)、要是类中覆盖了equals方法,那么就要根据具体的代码来确定equals方法的作用了,覆盖后一般都是通过对象的内容是否相等来判断对象是否相等。
• hashCode() 返回int
用来判断两个对象是否相等,Object中的hashcode方法返回对象在内存地址地址转换成一个int值,所以未重写之前,所有的hashcode值是不相等的。
• Java采用了哈希表的原理。这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。 如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存,不相同就散列其它的地址。所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次.
• hashcode和equals比较:
1)、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。
2)、如果两个对象不equals,他们的hashcode有可能相等。
3)、如果两个对象hashcode相等,他们不一定equals。
4)、如果两个对象hashcode不相等,他们一定不equals。
• 覆盖
在每个覆盖了equals方法的类中,也必须覆盖hashCode方法。如果不这样做的话,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集合包括HashMap、HashSet和Hashtable。
8、描述一下hash表?
• 定义:Hash表也称散列表,也有直接译作哈希表,Hash表是一种特殊的数据结构,它同数组、链表以及二叉排序树等相比较有很明显的区别,它能够快速定位到想要查找的记录,而不是与表中存在的记录的关键字进行比较来进行查找。这个源于Hash表设计的特殊性,它采用了函数映射的思想将记录的存储位置与记录的关键字关联起来,从而能够很快速地进行查找。
• 查找复杂度直接降到O(1)
• 构建hash函数,解决hash冲突
• 开放定址法、链地址法
• Hash表的优缺点:Hash表存在的优点显而易见,能够在常数级的时间复杂度上进行查找,并且插入数据和删除数据比较容易。但是它也有某些缺点,比如不支持排序,一般比用线性表存储需要更多的空间,并且记录的关键字不能重复。
9、List和Array的区别?若开发过程中Array空间不够用,该怎么扩展?
Array和List都属于顺序表。
Array
连续的存储结构,int[] i=new int[3]
i其实记录的是数组的首地址,而i[1]其实相当于在i的地址的基础上加上1个整数的地址偏移,然后再取这块地址中的值。
基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。但是要删除数据却是开销很大的,因为这需要重排数组中的所有数据。
数组必须要在初始化时分配固定的大小,比如说int[] a=new int[3];如果我们仅仅写int[] a=new int[];编译器就会无情地给我们报错。
List
不连续的存储结构,
List的每个节点都有着一个Next属性,这个属性则记录着他的下一个节点的地址。
List—是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式,它继承Collection。
List由于空间不必连续,所以无须指定初始大小
• 总结:
array为定长的数组,不确定大小时最好用List
当需要大量的查找操作时,最好使用Array
10、协议有哪些?Http的构成,Http的协议类型有哪些?post和put有何区别?head是做什么的?1xx,2xx,3xx,4xx,5xx的意思?
o Http协议、soap协议、rest是架构不是协议。
o Http协议:
http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。
o http请求由四部分组成,分别是:请求行、消息报头、空行、请求正文
请求行
• 请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。
• HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
请求头部
• 请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
请求数据
• 请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。
o Http响应类型:
1xx:指示信息--表示请求已接收,继续处理。
2xx:成功--表示请求已被成功接收、理解、接受。
3xx:重定向--要完成请求必须进行更进一步的操作。
4xx:客户端错误--请求有语法错误或请求无法实现。
5xx:服务器端错误--服务器未能实现合法的请求。
o Http请求方法的介绍:
o GET(获取资源):GET用于信息获取,而且应该是安全的和幂等的。get的请求参数是明文传递的,可在地址栏中看到,其安全性不高,用来获取响应内容;
o POST(传输实体文本):向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
1、GET方法用于信息获取,它是安全的(安全:指非修改信息,如数据库方面的信息),而POST方法是用于修改服务器上资源的请求;
2、GET请求的数据会附在URL之后,而POST方法提交的数据则放置在HTTP报文实体的主体里,所以POST方法的安全性比GET方法要高;
3、GET方法传输的数据量一般限制在2KB,其原因在于:GET是通过URL提交数据,而URL本身对于数据没有限制,但是不同的浏览器对于URL是有限制的,比如IE浏览器对于URL的限制为2KB,而Chrome,FireFox浏览器理论上对于URL是没有限制的,它真正的限制取决于操作系统本身;POST方法对于数据大小是无限制的,真正影响到数据大小的是服务器处理程序的能力.
o HEAD(获得报文首部): HEAD方法和GET方法一样,知识不返回豹纹的主体部分,用于确认URI的有效性及资源更新的日期时间等。
具体来说:1、判断类型; 2、查看响应中的状态码,看对象是否存在(响应:请求执行成功了,但无数据返回); 3、测试资源是否被修改过
HEAD方法和GET方法的区别: GET方法有实体,HEAD方法无实体。
o PUT(传输文件):把消息本体中的消息发送到一个URL,跟POST类似,但不常用。
通常用于向服务器发送请求,如果URI不存在,则要求服务器根据请求创建资源,如果存在,服务器就接受请求内容,并修改URI资源的原始版本。
• PUT是幂等的,POST不是幂等的。POST在请求的时候,服务器会每次都创建一个文件,但是在PUT方法的时候只是简单地更新,而不是去重新创建。因此PUT是幂等的。
幂等(idempotent、idempotence)是一个抽象代数的概念。在计算机中,可以这么理解,一个幂等操作的特点就是其任意多次执行所产生的影响均与依次一次执行的影响相同。
11、Spring的注解@Autowired,它有什么作用,它注入的类是在什么时候进行加载的?
o @Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法。
o 使用@Autowired进行自动注入:
Spring通过@Autowired实现依赖注入,@Autowired默认使用类型匹配的方式,在容器中查找匹配的Bean,当且仅有一个匹配的Bean时,Spring将其注入到@Autowired标注的变量中。可使用@Qualifier制定注入Bean的名称。
o 对方法进行标注:
@Autowired可对类成员变量及方法的入参进行标注。
o 注入时间:
o 使用@Autowired默认是启动时进行对应类的注入的,若设置了@Lazy注解,项目启动时不加载,仅仅在注解被扫描到时才生成一个实例。
o @Autowired和@Resource的区别:
@Autowired是Spring的注解默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false;
@Resource 是J2EE的注解,默认按照名称进行装配,若未提供名称,则可按类型进行装配。
o Spring的注解:@Component、@Autowired、@Controller、@Service、@Repository
@Scope注解,@Scope("prototype")表示将Action的范围声明为原型,可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理,避免struts中Action的线程安全问题。spring 默认scope 是单例模式(scope="singleton"),这样只会创建一个Action对象,每次访问都是同一Action对象,数据不安全,struts2 是要求每次次访问都对应不同的Action,scope="prototype" 可以保证当有请求的时候都创建一个Action对象
12、描述一下springboot,它是spring的一个分支吗?还是独立于spring,它的思想是什么?
Springboot不是spring的一部分,是一个在Spring 的基础上搭建的全新的微框架,其目的是简化Spring的搭建和开发过程。
• 直接嵌入Tomcat, Jetty或者Undertow作为Servlet container。
• 自动进行Spring框架的配置,节省程序员大量的时间和精力,能够让程序员专注在业务逻辑代码的编写上不需要任何第三方系统。
• 直接启动应用程序,不需要部署。
• 不需要一堆xml配置文件。
13、垃圾回收的方法,垃圾回收中的stop world是什么意思?是在什么时候进行垃圾回收?
14、在实习时,开发的过程中,你是如何定义一个rest接口的,需要提供什么参数?
15、二叉树的镜像,如果用递归实现,树的深度过大会出现什么异常,该怎么解决?
树深度不大时用递归的方式,若树的深度过大会造成栈的溢出。
二叉树镜像的非递归方式:可以使用队列进行二叉树的层次遍历,首先根节点入队,若对不为空,则将对中元素一次取出,每次访问取出的元素时,将它的左右字数进行镜像翻转。
10、一个无序的数组,每个元素可能出现多次,找出出现次数最多的前k个。
首先使用hashmap统计每个数字出现的次数,key为数组中的元素,value为次数。
求前k个最大值。。。
17、Java的多态是什么意思?实现机制是什么?覆盖时加载那个方法,什么时候进行加载?
http://www.importnew.com/20079.html
Java实现多态有三个必要条件:继承、重写、向上转型。继承:在多态中必须存在有继承关系的子类和父类。重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
• 多态有两种形式:重载和覆盖;
o 重载:发生在同一个类中;
o 覆盖:发生在子类与父类之间;
• 靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。
18、String、StringBuffer和SpringBuilder的关系和异同,什么情况下StringBuilder线程不安全?
String,StringBuffer,StringBuilder 效率StringBuilder>StringBuffer>String
都是final类,都不能被继承;
String长度不可变,是不可变类,StringBuffer、StringBuilder长度可变;
StringBuffer线程安全,StringBuilder非线程安全
SpringBuffer的append()、insert()的方法上有synchronized标识符。
String不变性的理解:
• String类是被final修饰的,不能被继承;用+链接字符串相当于StringBuilder的append()方法,会创建新的字符串,效率较低,尽量使用StringBuffer或者StringBuilder构建新的字符串;
• String s=new String("Hello World");可能创建两个对象或一个对象,若静态区中有“Hello World”字符串常量,则仅在堆中进行创建对象,否则,在堆中和静态区都要创建对象;
19、异常的处理方式有哪些?异常抛出后,接下来的代码怎么执行,会跳到哪一步?
异常处理机制为:抛出异常,捕捉异常。
//代码1
public static void test() throws Exception {
throw new Exception("参数越界");
System.out.println("异常后"); //编译错误,「无法访问的语句」
}
//代码2 try{ throw new Exception("参数越界"); }catch(Exception e) { e.printStackTrace(); } System.out.println("异常后");//可以执行
//代码3 if(true) { throw new Exception("参数越界"); } System.out.println("异常后"); //抛出异常,不会执行
若一段代码前有异常抛出,并且这个异常没有被捕获,这段代码将产生编译时错误「无法访问的语句」。
若一段代码前有异常抛出,并且这个异常被try...catch所捕获,若此时catch语句中没有抛出新的异常,则这段代码能够被执行,否则,同第1条。
若在一个条件语句中抛出异常,则程序能被编译,但后面的语句不会被执行。
20、什么是平衡二叉树,它的查找时间复杂度是多少?
(1)完全二叉树——只有最下面的两层结点度小于2,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树;
(2)满二叉树——除了叶结点外每一个结点都有左右子叶且叶结点都处在最底层的二叉树,。
(3)平衡二叉树——当且仅当两个子树的高度差不超过1时,这个树是平衡二叉树。(二叉排序树)
平衡二叉树,又称AVL树。它或者是一棵空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的高度之差之差的绝对值不超过1.。
(4)二叉排序树/二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树:
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
它的左、右子树也分别为二叉排序树。
21、Ajax用过吗?它有什么特点?平时怎么用?
• 什么是AJAX?
AJAX全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术。
• AJAX的工作原理
Ajax的工作原理相当于在用户和服务器之间加了—个中间层(AJAX引擎),使用户操作与服务器响应异步化。并不是所有的用户请求都提交给服务器,像—些数据验证和数据处理等都交给Ajax引擎自己来做, 只有确定需要从服务器读取新数据时再由Ajax引擎代为向服务器提交请求。
o Ajax的一个最大的特点是无需刷新页面便可向服务器传输或读写数据(又称无刷新更新页面),这一特点主要得益于XMLHTTP组件XMLHTTPRequest对象。
o 无刷新更新数据、异步与服务器通信、前后端负载平衡、基于标准被广泛支持、界面与应用分离。
22、代码调试都是怎么做的?怎们看是哪那个类调用了当前方法?
单步调式
查看被调用的类可以右键Prferences->project查看
23、怎么区分线程是哪一个?java能获取当前线程的ID吗
可以使用getThreadId获取一个线程的ID,可以获取当前线程的Name,等线程信息
24、类加载机制,什么时候加载?jvm加载?
笔试:
1、给定一个n,求最少有几个平方数的和是n, (递归)
平方数为1,4,9,16,。。。
N = 1时:n=1;
N=12 时,n=4+4+4;
N=13时,n=9+4;
…
2、判断一颗二叉排序树
3、一个矩阵中的元素有正有负,求这个矩阵子矩阵的最大和
答案:http://blog.csdn.net/beiyeqingteng/article/details/7056687
4、给定一个字符串,判断其是不是一个整数,整数的标志是由0-9组成,可包含【、】,-;
如[123]]为123
第一题:http://blog.csdn.net/big_c_god/article/details/52344934
int MixFuntion(int n)
{
int i = sqrt(n);
if (ii == n)
return 1;
int minLen = INT_MAX;
for(;ii >= n/2;i--)
{
int len = 1 + MinExpressionInteger(n - i*i);
if (minLen > len)
minLen = len;
}
return minLen;
}