华为软件测试工程师面试题.docx
《华为软件测试工程师面试题.docx》由会员分享,可在线阅读,更多相关《华为软件测试工程师面试题.docx(24页珍藏版)》请在冰豆网上搜索。
华为软件测试工程师面试题
Q1:
请你分别划划OSI的七层网络结构图,和TCP/IP的五层结构图?
答:
七层结构从上到下依次是:
7应用层;6表示层;5会话层;4传输层;3网络层;2数据链路层;1物理层
五层结构是
5应用层;4运输层;3网络层;2链路层;1物理层。
Q2:
请你详细的解释一下IP协议的定义,在哪个层上面,主要有什么作用?
TCP与UDP呢?
答:
UDP,TCP在传输层,IP在网络层,
TCP/IP是英文TransmissionControlProtocol/InternetProtocol的缩写,意思是"传输控制协议/网际协议"。
TCP/IP协议组之所以流行,部分原因是因为它可以用在各种各样的信道和底层协议(例如T1和X.25、以太网以及RS-232串行接口)之上。
确切地说,TCP/IP协议是一组包括TCP协议和IP协议,UDP(UserDatagramProtocol)协议、ICMP(InternetControlMessageProtocol)协议和其他一些协议的协议组。
TCP/IP协议并不完全符合OSI的七层参考模型。
传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。
该模型的目的是使各种硬件在相同的层次上相互通信。
这7层是:
物理层、数据链路层、网路层、传输层、话路层、表示层和应用层。
而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
这4层分别为:
应用层:
应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。
传输层:
在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到
Q3:
请问交换机和路由器分别的实现原理是什么?
分别在哪个层次上面实现的?
一般意义上说交换机是工作在数据链路层。
但随着科技的发展,现在有了三层交换机,三层交换机已经扩展到了网络层。
也就是说:
它等于“数据链路层+部分网络层”。
交换机中传的是帧。
通过存储转发来实现的。
路由器是工作在网络层。
路由器中传的是IP数据报。
主要是选址和路由。
Q4:
请问C++的类和C里面的STRUCT有什么区别?
答:
除关键字不同外(class,struct)的唯一区别是,
结构在默认情况下的成员是公共(public)的,而类在默认情况下的成员是私有(private)的。
在C++中,结构是特殊的类。
class是从struct发展而来的。
之所以将struct和class都保留,是因为:
1、提出class是为了强调一种概念。
2、保留struct是为了照顾到大多数人的习惯。
struct和class是有区别的。
struct保证成员按照声明顺序在内存中存储。
class不保证等等。
它们都可以继承,实现多态等。
但也有少许区别。
比如:
structA{};
classB:
A{};//private继承
structC:
B{};//public继承
这是由于class默认是private,struct默认是public。
一般说来,struct和class可以换用(当然要注意一些语法问题)。
而struct更适合看成是一个数据结构的实现体,class更适合看成是一个对象的实现体,对私有成员进行保护,还提供与外界的接口。
从习惯上更喜欢用class。
05:
请讲一讲析构函数和虚函数的用法和作用?
答:
置于“~”是析构函数;析构函数因使用"~"符号(逻辑非运算符),表示它为腻构造函数,加上类名称来定义。
析构函数也是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只有在类对象的生命期结束的时候,由系统自动调用。
有适放内存空间的做用!
虚函数是C++多态的一种表现。
例如:
子类继承了父类的一个函数(方法),而我们把父类的指针指向子类,则必须把父类的该函数(方法)设为virturl(虚函数)。
使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。
如果父类的函数(方法)根本没有必要或者无法实现,完全要依赖子类去实现的话,可以把此函数(方法)设为virturl函数名=0我们把这样的函数(方法)称为纯虚函数。
如果一个类包含了纯虚函数,称此类为抽象类
Q6:
全局变量和局部变量有什么区别?
实怎么实现的?
操作系统和编译器是怎么知道的?
答:
主要的区别是变量的作用范围不同。
全局变量在全局范围内都有效,而局部变量只在声明此变量的作用域内有效。
全局变量是属于实例的,在初始化对象的时候初始化,生命周期与该实例相同,之所以叫全局变量是因为该实例中的所有方法或属性都可以引用;局部变量是在实例方法内或static块中,生命周期从调用该方法到该方法退出,并且只有该方法能够引用之。
全局变量和局部变量的区别是在存储器中位置不同,具体说,全局变量存储在数据段中,局部变量都有可能,一般来说在堆栈段
Q7:
一些寄存器的题目,主要是寻址和内存管理等一些知识。
答:
寻址方式
表示指令中操作数所在的方法称为寻址方式。
8086/8088有七种基本的寻址方式:
立即寻找,寄存器寻址,直接寻址,寄存器间接寻址,寄存器相对寻址,基址加变址寻址,相对基址加变址寻址
直接寻址、寄存器间接寻址、寄存器相对寻址、基址加变址寻址和相对基址加变址寻址,这五种寻址方式属于存储器寻址,用于说明操作数所在存储单元的地址。
由于总线接口单元BIU能根据需要自动引用段寄存器得到段值,所以这五种方式也就是确定存放操作数的存储单元有效地址EA的方法。
有效地址EA是一个16位的无符号数,在利用这五种方法计算有效地址时,所得的结果认为是一个无符号数。
除了这些基本的寻址方式外,还有固定寻址和I/O端口寻址等。
内存管理:
主要包括内存的分配和回收整理等,实现内存的高效利用。
Q8:
8086是多少位的系统?
在数据总线上是怎么实现的?
答:
16位系统,8位数据传送,通过总线控制逻辑实现数据线和地址线的分时复用.
8086是Inter的16位微处理器
有16根数据线和20根地址线,它既能处理16位数据,也能处理8位数据
内部数据总线都是按16位设计的,单外部数据总线只有8条.
常见的测试用例设计方法都有哪些?
请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。
1.等价类划分:
常见的软件测试面试题划分等价类:
等价类是指某个输入域的子集合.在该子集合中,各个输入数据对于揭露程序中的错误都是等效的.并合理地假定:
测试某等价类的代表值就等于对这一类其它值的测试.因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件,就可以用少量代表性的测试数据.取得较好的测试结果.等价类划分可有两种不同的情况:
有效等价类和无效等价类.
2.边界值分析法:
边界值分析方法是对等价类划分方法的补充。
测试工作经验告诉我,大量的错误是发生在输入或输出范围的边界上,而不是发生在输入输出范围的内部.因此针对各种边界情况设计测试用例,可以查出更多的错误.
使用边界值分析方法设计测试用例,首先应确定边界情况.通常输入和输出等价类的边界,就是应着重测试的边界情况.应当选取正好等于,刚刚大于或刚刚小于边界的值作为测试数据,而不是选取等价类中的典型值或任意值作为测试数据.
3.错误推测法:
基于经验和直觉推测程序中所有可能存在的各种错误,从而有针对性的设计测试用例的方法.
错误推测方法的基本思想:
列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据他们选择测试用例.例如,在单元测试时曾列出的许多在模块中常见的错误.以前产品测试中曾经发现的错误等,这些就是经验的总结。
还有,输入数据和输出数据为0的情况。
输入表格为空格或输入表格只有一行.这些都是容易发生错误的情况。
可选择这些情况下的例子作为测试用例.
4.因果图方法:
前面介绍的等价类划分方法和边界值分析方法,都是着重考虑输入条件,但未考虑输入条件之间的联系,相互组合等.考虑输入条件之间的相互组合,可能会产生一些新的情况.但要检查输入条件的组合不是一件容易的事情,即使把所有输入条件划分成等价类,他们之间的组合情况也相当多.因此必须考虑采用一种适合于描述对于多种条件的组合,相应产生多个动作的形式来考虑设计测试用例.这就需要利用因果图(逻辑模型).因果图方法最终生成的就是判定表.它适合于检查程序输入条件的各种组合情况.
5.正交表分析法:
有时候,可能因为大量的参数的组合而引起测试用例数量上的激增,同时,这些测试用例并没有明显的优先级上的差距,而测试人员又无法完成这么多数量的测试,就可以通过正交表来进行缩减一些用例,从而达到尽量少的用例覆盖尽量大的范围的可能性。
6.场景分析方法:
指根据用户场景来模拟用户的操作步骤,这个比较类似因果图,但是可能执行的深度和可行性更好。
您认为做好测试用例设计工作的关键是什么?
白盒测试用例设计的关键是以较少的用例覆盖尽可能多的内部程序逻辑结果
黑盒法用例设计的关键同样也是以较少的用例覆盖模块输出和输入接口。
不可能做到完全测试,以最少的用例在合理的时间内发现最多的问题
详细的描述一个测试活动完整的过程。
1.项目经理通过和客户的交流,完成需求文档,由开发人员和测试人员共同完成需求文档的评审,评审的内容包括:
需求描述不清楚的地方和可能有明显冲突或者无法实现的功能的地方。
项目经理通过综合开发人员,测试人员以及客户的意见,完成项目计划。
然后sqa进入项目,开始进行统计和跟踪
2.开发人员根据需求文档完成需求分析文档,测试人员进行评审,评审的主要内容包括是否有遗漏或者双方理解不同的地方。
测试人员完成测试计划文档,测试计划包括的内容上面有描述。
3.测试人员根据修改好的需求分析文档开始写测试用例,同时开发人员完成概要设计文档,详细设计文档。
此两份文档成为测试人员撰写测试用例的补充材料。
4.测试用例完成后,测试和开发需要进行评审。
5.测试人员搭建环境
6.开发人员提交第一个版本,可能存在未完成功能,需要说明。
测试人员进行测试,发现bug后提交给bugzilla。
7.开发提交第二个版本,包括bugfix以及增加了部分功能,测试人员进行测试。
8.重复上面的工作,一般是3-4个版本后bug数量减少,达到出货的要求。
9.如果有客户反馈的问题,需要测试人员协助重现以及回归测试。
您认为性能测试工作的目的是什么?
做好性能测试工作的关键是什么?
主要是保障在大量用户的情况下,服务能正常使用。
在您以往的工作中,一条软件缺陷(或者叫bug)记录都包含了哪些内容?
如何提交高质量的软件缺陷(bug)记录?
一条Bug记录最基本应包含:
编号、Bug所属模块、Bug描述、Bug级别、发现日期、发现人、修改日期、修改人、修改方法、回归结果等等;要有效的发现Bug需参考需求以及详细设计等前期文档设计出高效的测试用例,然后严格执行测试用例,对发现的问题要充分确认肯定,然后再向外发布如此才能提高提交Bug的质量。
高质量的bug记录就是指很容易理解的bug记录,所以,对于描述的要求高,能提供的信息多且准确,很好的帮助开发人员定位。
3、界面测试题及设计题。
请找出下面界面中所存在的问题并分别列出;用黑盒测试的任何一种方法设计出此登陆窗体的测试用例。
(中级)(6分)
答:
1、窗体的标题栏中为空,没有给出标题。
2、用户名和密码控件的字体不一致并且没有对齐。
3、文本框的大小不一致没有对其。
4、确定和取消按钮控件的大小不一致。
4、黑盒测试和白盒测试是软件测试的两种基本方法,请分别说明各自的优点和缺点!
(中级)(5分)
答:
黑盒测试的优点有:
1)比较简单,不需要了解程序内部的代码及实现;
2)与软件的内部实现无关;
3)从用户角度出发,能很容易的知道用户会用到哪些功能,会遇到哪些问题;
4)基于软件开发文档,所以也能知道软件实现了文档中的哪些功能;
5)在做软件自动化测试时较为方便。
黑盒测试的缺点有:
1)不可能覆盖所有的代码,覆盖率较低,大概只能达到总代码量的30%;
2)自动化测试的复用性较低。
白盒测试的优点有:
帮助软件测试人员增大代码的覆盖率,提高代码的质量,发现代码中隐藏的问题。
白盒测试的缺点有:
1)程序运行会有很多不同的路径,不可能测试所有的运行路径;
2)测试基于代码,只能测试开发人员做的对不对,而不能知道设计的正确与否,可能会漏掉一些功能需求;
3)系统庞大时,测试开销会非常大。
5、根据自己的理解回答什么是软件测试,软件测试分为哪几个阶段。
(初级)(5分)
答:
软件测试是一个为了寻找软件中的错误而运行软件的过程,一个成功的测试是指找到了迄今为止尚未发现的错误的测试。
软件测试一般分为单元测试、集成测试和系统测试。
6、根据自己的理解什么是测试用例和测试规程,设计一个测试用例应当从哪几方面考虑?
(中级)(10分)
答:
狭义的讲,一个测试用例就是测试人员用以测试被测软件的某个特性或特性组合的一组数据。
这组数据可能是从用户处得来的实际的一组数据,也可能是测试人员专门设计出来的测试软件某些功能的一组数据。
测试规程就是详细的对测试用例设计方法、测试方法、测试工具、测试环境和测试数据进行描述的文档,还可以包括能把某个或某一组测试用例应用到被测软件上完成某项测试的一系列的操作步骤。
设计测试用例应当从以下几方面考虑:
边界值,等价类划分,有效/无效值等。
7、什么是软件质量保证?
软件质量保证人员与开发人员的关系如何?
(高级)(10分)
答:
软件质量保证就是通过确保软件过程的质量,来保证软件产品的质量。
软件质量保证人员和开发人员之间具有管理上的严格的独立性,两个小组的管理员都不能越权管理另一组,但都可以向更高层的管理者汇报软件开发中的问题
填空:
1.软件验收测试包括:
正式验收测试,alpha测试,beta测试。
2.系统测试的策略有:
功能测试,性能测试,可靠性测试,负载测试,易用性测试,强度测试,
3.安全测试,配置测试,安装测试,卸载测试,文挡测试,故障恢复测试,界面测试,容量测试,
4.兼容性测试,分布测试,可用性测试,(有的可以合在一起,分开写只要写出15就满分哦)
3.设计系统测试计划需要参考的项目文挡有:
软件测试计划,软件需求工件和迭代计划。
4.对面向过程的系统采用的集成策略有:
自顶向下,自底向上两种。
3简述集成测试的过程
系统集成测试主要包括以下过程:
1.构建的确认过程。
2.补丁的确认过程。
3.系统集成测试测试组提交过程。
4.测试用例设计过程。
5.测试代码编写过程。
6.Bug的报告过程。
7.每周/每两周的构建过程。
8.点对点的测试过程。
9.组内培训过程。
4怎么做好文档测试
仔细阅读,跟随每个步骤,检查每个图形,尝试每个示例。
P142
检查文档的编写是否满足文档编写的目的;内容是否齐全,正确;内容是否完善;标记是否正确
5白盒测试有几种方法
总体上分为静态方法和动态方法两大类。
静态:
关键功能是检查软件的表示和描述是否一致,没有冲突或者没有歧义
动态:
语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖。
6系统测试计划是否需要同行审批,为什么
需要,系统测试计划属于项目阶段性关键文档,因此需要评审。
7Alpha测试与beta的区别
Alpha测试在系统开发接近完成时对应用系统的测试;测试后仍然会有少量的设计变更。
这种测试一般由最终用户或其它人员完成,不能由程序或测试员完成。
Beta测试当开发和测试根本完成时所做的测试,最终的错误和问题需要在最终发行前找到。
这种测试一般由最终用户或其它人员完成,不能由程序员或测试员完成。
8比较负载测试,容量测试和强度测试的区别
负载测试:
在一定的工作负荷下,系统的负荷及响应时间。
强度测试:
在一定的负荷条件下,在较长时间跨度内的系统连续运行给系统性能所造成的影响。
容量测试:
容量测试目的是通过测试预先分析出反映软件系统应用特征的某项指标的极限值(如最大并发用户数、数据库记录数等),系统在其极限值状态下没有出现任何软件故障或还能保持主要功能正常运行。
容量测试还将确定测试对象在给定时间内能够持续处理的最大负载或工作量。
容量测试的目的是使系统承受超额的数据容量来发现它是否能够正确处理。
容量测试是面向数据的,并且它的目的是显示系统可以处理目标内确定的数据容量。
9测试结束的标准是什么?
用例全部测试。
覆盖率达到标准。
缺陷率达到标准。
其他指标达到质量标准
10描述软件测试活动的生命周期?
测试周期分为计划、设计、实现、执行、总结。
其中:
计划:
对整个测试周期中所有活动进行规划,估计工作量、风险,安排人力物力资源,安排进度等;
设计:
完成测试方案,从技术层面上对测试进行规划;
实现:
进行测试用例和测试规程设计;
执行:
根据前期完成的计划、方案、用例、规程等文档,执行测试用例。
总结:
记录测试结果,进行测试分析,完成测试报告。
11软件的缺陷等级应如何划分?
A类—严重错误,包括以下各种错误:
1.由于程序所引起的死机,非法退出2.死循环3.数据库发生死锁4.因错误操作导致的程序中断5.功能错误6.与数据库连接错误7.数据通讯错误
B类—较严重错误,包括以下各种错误:
1.程序错误2.程序接口错误3.数据库的表、业务规则、缺省值未加完整性等约束条件;
C类—一般性错误,包括以下各种错误:
1.操作界面错误(包括数据窗口内列名定义、含义是否一致)2.打印内容、格式错误3.简单的输入限制未放在前台进行控制4.删除操作未给出提示5.数据库表中有过多的空字段
D类—较小错误:
1.界面不规范2.辅助说明描述不清楚3.输入输出不规范4.长操作未给用户提示5.提示窗口文字未采用行业术语6.可输入区域和只读区域没有明显的区分标志
E类—测试建议
1。
什么是预编译,何时需要预编译:
答案:
1、总是使用不经常改动的大型代码体。
2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。
在这种情况下,可以将所有包含文件预编译为一个预编译头。
2。
char*constp
charconst*p
constchar*p上述三个有什么区别?
答案:
char*constp;//常量指针,p的值不可以修改
charconst*p;//指向常量的指针,指向的常量值不可以改
constchar*p;//和charconst*p
9。
写一个“标准”宏,这个宏输入两个参数并返回较小的一个。
答案:
.#defineMin(X,Y)((X)>(Y)?
(Y):
(X))//结尾没有‘;’
10。
嵌入式系统中经常要用到无限循环,你怎么用C编写死循环。
答案:
while
(1){}或者for(;;)
11。
关键字static的作用是什么?
这个简单的问题很少有人能回答完全。
在C语言中,关键字static有三个明显的作用:
1).在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2).在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。
它是一个本地的全局变量。
3).在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。
那就是,这个函数被限制在声明它的模块的本地范围内使用。
大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。
这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。
12。
关键字const有什么含意?
我只要一听到被面试者说:
“const意味着常数”,我就知道我正在和一个业余者打交道。
去年DanSaks已经在他的文章里完全概括了const的所有用法,因此ESP(译者:
EmbeddedSystemsProgramming)的每一位读者应该非常熟悉const能做什么和不能做什么.如果你从没有读到那篇文章,只要能说出const意味着“只读”就可以了。
尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。
(如果你想知道更详细的答案,仔细读一下Saks的文章吧。
)如果应试者能正确回答这个问题,我将问他一个附加的问题:
下面的声明都是什么意思?
constinta;
intconsta;
constint*a;
int*consta;
intconst*aconst;
前两个的作用是一样,a是一个常整型数。
第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。
第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。
最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。
顺带提一句,也许你可能会问,即使不用关键字const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?
我也如下的几下理由:
1).关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。
如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。
(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。
)
2).通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
3).合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。
简而言之,这样可以减少bug的出现。
13。
关键字volatile有什么含意?
并举出三个不同的例子?
答案:
提示编译器对象的值可能在编译器未监测到的情况下改变。
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
1).并行设备的硬件寄存器(如:
状态寄存器)2).一个中断服务子程序中会访问到的非自动变量(Non-automaticvariables)3).多线程应用中被几个任务共享的变量
回答不出这个问题的人是不会被雇佣的。
我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。
嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。
不懂得volatile内容将会带来灾难。
假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。
1).一个参数既可以是const还可以是volatile吗?
解释为什么。
2).一个指针可以是volatile吗?
解释为什么。
3).下面的函数有什么错误:
intsquare(volatileint*ptr)
{return*ptr**ptr;}
下面是答案:
1).是的。
一个例子是只读的状态寄存器。
它是volatile因为它可能被意想不到地改变。
它是const因为程序不应该试图去修改它。