华为软件测试工程师面试题

时间:2024.4.14

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是英文Transmission Control Protocol/Internet Protocol的缩写,意思是"传输控制协议/网际协议"。TCP/IP协议组之所以流行,部分原因是因为它可以用在各种各样的信道和底层协议(例如T1和X.25、以太网以及RS-232串行接口)之上。确切地说,TCP/IP协议是一组包括TCP协议和IP协议,UDP(User Datagram Protocol)协议、ICMP(Internet Control Message Protocol)协议和其他一些协议的协议组。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不保证等等。它们都可以继承,实现多态等。但也有少许区别。比如:

struct A { };

class B : A{ }; //private继承

struct C : B{ }; //public继承

这是由于class默认是private,struct默认是public。 一般说来,struct和class可以换用(当然要注意一些语法问题)。 而struct更适合看成是一个数据结构的实现体,class更适合看成是一个对象的实现体,对私有成员进行保护,还提供与外界的接口。从习惯上更喜欢用class。

05:请讲一讲析构函数和虚函数的用法和作用?

答:置于“~”是析构函数;析构函数因使用"~"符号(逻辑非运算符),表示它为腻构造函数,加上类名称来定义。 析构函数也是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只有在类对象的生命期结束的时候,由系统自动调用。

有适放内存空间的做用!

虚函数是C++多态的一种表现。例如:子类继承了父类的一个函数(方法),而我们把父类的指针指

- 1 -

向子类,则必须把父类的该函数(方法)设为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. 错误推测法:基于经验和直觉推测程序中所有可能存在的各种错误, 从而有针对性的设计测试用例的方法.

错误推测方法的基本思想: 列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据他

- 2 -

们选择测试用例. 例如, 在单元测试时曾列出的许多在模块中常见的错误. 以前产品测试中曾经发现的错误等, 这些就是经验的总结。还有, 输入数据和输出数据为0的情况。输入表格为空格或输入表格只有一行. 这些都是容易发生错误的情况。可选择这些情况下的例子作为测试用例.

4. 因果图方法:前面介绍的等价类划分方法和边界值分析方法,都是着重考虑输入条件,但未考虑输入条件之间的联系, 相互组合等. 考虑输入条件之间的相互组合,可能会产生一些新的情况. 但要检查输入条件的组合不是一件容易的事情, 即使把所有输入条件划分成等价类,他们之间的组合情况也相当多. 因此必须考虑采用一种适合于描述对于多种条件的组合,相应产生多个动作的形式来考虑设计测试用例. 这就需要利用因果图(逻辑模型). 因果图方法最终生成的就是判定表. 它适合于检查程序输入条件的各种组合情况.

5. 正交表分析法:有时候,可能因为大量的参数的组合而引起测试用例数量上的激增,同时,这些测试用例并没有明显的优先级上的差距,而测试人员又无法完成这么多数量的测试,就可以通过正交表来进行缩减一些用例,从而达到尽量少的用例覆盖尽量大的范围的可能性。

6. 场景分析方法:指根据用户场景来模拟用户的操作步骤,这个比较类似因果图,但是可能执行的深度和可行性更好。

您认为做好测试用例设计工作的关键是什么?

白盒测试用例设计的关键是以较少的用例覆盖尽可能多的内部程序逻辑结果

黑盒法用例设计的关键同样也是以较少的用例覆盖模块输出和输入接口。不可能做到完全测试,以最少的用例在合理的时间内发现最多的问题

详细的描述一个测试活动完整的过程。

1. 项目经理通过和客户的交流,完成需求文档,由开发人员和测试人员共同完成需求文档的评审,评审的内容包括:需求描述不清楚的地方和可能有明显冲突或者无法实现的功能的地方。项目经理通过综合开发人员,测试人员以及客户的意见,完成项目计划。然后sqa进入项目,开始进行统计和跟踪

2. 开发人员根据需求文档完成需求分析文档,测试人员进行评审,评审的主要内容包括是否有遗漏或者双方理解不同的地方。测试人员完成测试计划文档,测试计划包括的内容上面有描述。

3. 测试人员根据修改好的需求分析文档开始写测试用例,同时开发人员完成概要设计文档,详细设计文档。此两份文档成为测试人员撰写测试用例的补充材料。

4. 测试用例完成后,测试和开发需要进行评审。

5. 测试人员搭建环境

6. 开发人员提交第一个版本,可能存在未完成功能,需要说明。测试人员进行测试,发现bug后提交给bugzilla。

7. 开发提交第二个版本,包括bug fix以及增加了部分功能,测试人员进行测试。

8. 重复上面的工作,一般是3-4个版本后bug数量减少,达到出货的要求。

9. 如果有客户反馈的问题,需要测试人员协助重现以及回归测试。

您认为性能测试工作的目的是什么?做好性能测试工作的关键是什么?

主要是保障在大量用户的情况下,服务能正常使用。

在您以往的工作中,一条软件缺陷(或者叫bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(bug)记录?

一条Bug记录最基本应包含:编号、Bug所属模块、Bug描述、Bug级别、发现日期、发现人、修改日期、修改人、修改方法、回归结果等等;要有效的发现Bug需参考需求以及详细设计等前期文档设计出高效的测试用例,然后严格执行测试用例,对发现的问题要充分确认肯定,然后再向外发布如此才能提高提交Bug的质量。

高质量的bug记录就是指很容易理解的bug记录,所以,对于描述的要求高,能提供的信息多且准确,很好的帮助开发人员定位。

- 3 -

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测试。

系统测试的策略有:功能测试,性能测试,可靠性测试,负载测试,易用性测试,强度测试, 安全测试,配置测试,安装测试,卸载测试,文挡测试,故障恢复测试,界面测试,容量测试, 兼容性测试,分布测试,可用性测试,(有的可以合在一起,分开写只要写出15就满分哦)

- 4 -

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.数

- 5 -

据库表中有过多的空字段

D类—较小错误:1.界面不规范 2.辅助说明描述不清楚 3.输入输出不规范 4.长操作未给用户提示 5. 提示窗口文字未采用行业术语 6.可输入区域和只读区域没有明显的区分标志

E类—测试建议

1。什么是预编译,何时需要预编译:

答案:1、总是使用不经常改动的大型代码体。

2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。

2。 char * const p

char const * p

const char *p 上述三个有什么区别?

答案:char * const p; //常量指针,p的值不可以修改

char const * p;//指向常量的指针,指向的常量值不可以改

const char *p; //和char const *p

9。写一个“标准”宏,这个宏输入两个参数并返回较小的一个。

答案:.#define Min(X, Y) ((X)>(Y)?(Y):(X)) //结尾没有‘;’

10。嵌入式系统中经常要用到无限循环,你怎么用C编写死循环。

答案:while(1){}或者for(;;)

11。关键字static的作用是什么?

这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:

1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。

12。关键字const有什么含意?

我只要一听到被面试者说:“const意味着常数”,我就知道我正在和一个业余者打交道。去年Dan Saks已经在他的文章里完全概括了const的所有用法,因此ESP(译者:Embedded Systems Programming)的每一位读者应该非常熟悉const能做什么和不能做什么.如果你从没有读到那篇文章,只要能说出const意味着“只读”就可以了。尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。(如果你想知道更详细的答案,仔细读一下Saks的文章吧。)如果应试者能正确回答这个问题,我将问他一个附加的问题:下面的声明都是什么意思?

const int a;

int const a;

const int *a;

int * const a;

int const * a const;

前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。顺带提一句,也许你可能会问,即使不用关键字const,也

- 6 -

还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?我也如下的几下理由:

1). 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)

2). 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。

3). 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

13。关键字volatile有什么含意?并举出三个不同的例子?

答案:提示编译器对象的值可能在编译器未监测到的情况下改变。一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。1). 并行设备的硬件寄存器(如:状态寄存器)2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)3). 多线程应用中被几个任务共享的变量

回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。

假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。

1). 一个参数既可以是const还可以是volatile吗?解释为什么。

2). 一个指针可以是volatile 吗?解释为什么。

3). 下面的函数有什么错误:

int square(volatile int *ptr)

{return *ptr * *ptr;}

下面是答案:

1). 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

2). 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。

3). 这段代码的有个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:

int square(volatile int *ptr)

{int a,b;

a = *ptr;

b = *ptr;

return a * b;}

由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:

long square(volatile int *ptr)

{int a;

a = *ptr;

return a * a;}

位操作(Bit manipulation)

14。int (*s[10])(int) 表示的是什么啊?

答案:int (*s[10])(int) 函数指针数组,每个指针指向一个int func(int param)的函数。

- 7 -

21.进程之间通信的途径 答案:共享存储系统;消息传递系统;管道:以文件系统为基础

22.进程死锁的原因 答案:资源竞争及进程推进顺序非法

23.死锁的4个必要条件 答案:互斥、请求保持、不可剥夺、环路

24.死锁的处理 答案:鸵鸟策略、预防策略、避免策略、检测与解除死锁

25. 操作系统中进程调度策略有哪几种?

答案:FCFS(先来先服务),优先级,时间片轮转,多级反馈

26.类的静态成员和非静态成员有何区别?

答案:类的静态成员每个类只有一个,非静态成员每个对象一个

27.纯虚函数如何定义?使用时应注意什么? 答:virtual void f()=0;是接口,子类必须要实现

28.数组和链表的区别

答案:数组:数据顺序存储,固定大小; 连表:数据可以随机存储,大小可动态改变

30:(void *)ptr 和 (*(void**))ptr的结果是否相同?其中ptr为同一个指针

答案:.(void *)ptr 和 (*(void**))ptr值是相同的

31:问函数既然不会被其它函数调用,为什么要返回1?

答案:mian中,c标准认为0表示成功,非0表示错误。具体的值是某中具体出错信息

33,已知一个数组table,用一个宏定义,求出数据的元素个数

答案:#define NTBL

#define NTBL (sizeof(table)/sizeof(table[0]))

34。线程与进程的区别和联系? 线程是否具有相同的堆栈? dll是否有独立的堆栈?

答案:进程是死的,只是一些资源的集合,真正的程序执行都是线程来完成的,程序启动的时候操作系统就帮你创建了一个主线程。每个线程有自己的堆栈。

DLL中有没有独立的堆栈,这个问题不好回答,或者说这个问题本身是否有问题。因为DLL中的代码是被某些线程所执行,只有线程拥有堆栈,如果DLL中的代码是EXE中的线程所调用,那么这个时候是不是说这个DLL没有自己独立的堆栈?如果DLL中的代码是由DLL自己创建的线程所执行,那么是不是说DLL有独立的堆栈?

以上讲的是堆栈,如果对于堆来说,每个DLL有自己的堆,所以如果是从DLL中动态分配的内存,最好是从DLL中删除,如果你从DLL中分配内存,然后在EXE中,或者另外一个DLL中删除,很有可能导致程序崩溃

2.用两个栈实现一个队列的功能?要求给出算法和思路!

答案:设2个栈为A,B, 一开始均为空.

入队:

将新元素push入栈A;

出队:

(1)判断栈B是否为空;

(2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;

(3)将栈B的栈顶元素pop出;

这样实现的队列入队和出队的平摊复杂度都还是O(1), 比上面的几种方法要好。

3.在c语言库函数中将一个字符转换成整型的函数是atol()吗,这个函数的原型是什么?

答案:函数名: atol 功能: 把字符串转换成长整型数 用法: long atol(const char *nptr);

4。对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?

答案:c用宏定义,c++用inline

5。直接链接两个信令点的一组链路称作什么? 答案:PPP点到点连接

7。软件测试都有那些种类?

答案:黑盒:针对系统功能的测试 白合:测试函数功能,各函数接口

- 8 -

8。确定模块的功能和模块的接口是在软件设计的那个队段完成的? 答案:概要设计阶段

问答题:

1.IP Phone的原理是什么?答案:IPV6

2.TCP/IP通信建立的过程怎样,端口有什么作用?

答案:三次握手,确定是哪个应用程序使用该协议

1、局部变量能否和全局变量重名?

答案:能,局部会屏蔽全局。要用全局变量,需要使用"::"

局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内

2、如何引用一个已经定义过的全局变量?

答案:extern

可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错

3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?

答:可以,在不同的C文件中以static形式来声明同名全局变量。可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错

1、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?

答案:全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。

而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。

static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件

static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;

static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;

static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

2、局部变量存在于(栈)中,全局变量存在于(静态区)中,动态申请数据存在于( 堆)中。

4、队列和栈有什么区别? 答案:队列先进先出,栈后进先出÷

6、已知一个单向链表的头,请写出删除其某一个结点的算法,要求,先找到此结点,然后删除。 答案:slnodetype *Delete(slnodetype *Head,int key){}中if(Head->number==key)

{

Head=Pointer->next;

- 9 -

free(Pointer);

break;

}

Back = Pointer;

Pointer=Pointer->next;

if(Pointer->number==key)

{ Back->next=Pointer->next;

free(Pointer);

break;

}

void delete(Node* p)

{ if(Head = Node)

while(p);

}

8。抽象类和接口的区别是什么?

(1)接口可以被多重implements,抽象类只能被单一extends

(2)接口只有定义,抽象类可以有定义和实现

(3)接口的字段定义默认为:public static final, 抽象类字段默认是"friendly"

1. 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。

#define MIN(A,B) ((A) <= (B) (A) : (B))

这个测试是为下面的目的而设的:

1). 标识#define在宏中应用的基本知识。这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。

2). 三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。

3). 懂得在宏中小心地把参数用括号括起来

5. 用变量a给出下面的定义

a) int a; // 整型数

b) int *a; // 指向整型数的指针

c) int **a; // 一个指向指针的的指针,它指向的指针是指向一个整型数

d) int a[10]; // 一个有10个整型数的数组

e) int *a[10]; // 一个有10个指针的数组,该指针是指向一个整型数的

f) int (*a)[10]; // 一个指向有10个整型数数组的指针

g) int (*a)(int); // 一个指向函数的指针,该函数有一个整型参数并返回一个整型数

h) int (*a[10])(int); // 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数.

2.单元测试、集成测试、系统测试的侧重点是什么?

单元测试的重点是系统的模块,包括子程序的正确性验证等。

集成测试的重点是模块间的衔接以及参数的传递等。

系统测试的重点是整个系统的运行以及与其他软件的兼容性。

3.设计用例的方法、依据有那些?

白盒测试用例设计有如下方法:基本路径测试\等价类划分\边界值分析\覆盖测试\循环测试\数据流测试\程序插桩测试\变异测试.这时候依据就是详细设计说明书及其代码结构吧;

- 10 -

黑盒测试用例设计方法:基于用户需求的测试\功能图分析方法\等价类划分方法\边界值分析方法\错误推测方法\因果图方法\判定表驱动分析方法\正交实验设计方法.依据是用户需求规格说明书,详细设计说明书

4.一个测试工程师应具备那些素质和技能?

掌握基本的测试基础理论

本着找出软件存在的问题的态度进行测试,即客观吧,不要以挑刺形象出现

可熟练阅读需求规格说明书等文档

以用户的观点看待问题

有着强烈的质量意识

细心和责任心

良好的有效的沟通方式(与开发人员及客户)

具有以往的测试经验

能够及时准确地判断出高危险区在何处.

5.集成测试通常都有那些策略?

大爆炸集成;自顶向下集成;自底向上集成;三明治集成;分层集成;基干集成;基于功能的集成;基于消息的集成;基于风险的集成;基于进度的集成.

7.一个缺陷测试报告的组成?

缺陷跟踪报告:

编号,如:ut-dt00016

标题,如:文字排版功能.字间距.MarchCalculator计算错误

版本号,如:V1.3

执行状态,如:空白/草稿/提交/审批/分发/正在修改/修改完毕/正在确认/关闭…

修改记录,如:20xx年7月2日;肖睿编制/修改;原因

测试环境和版本号码、程序编写人员

错误严重程度和优先级别

错误详细描述

重现步骤和方式、对应的测试记录编码

附件

建议修改方式

修改内容、结果及修改人员签字/日期

03. 您所熟悉的软件测试类型都有哪些?请试着分别比较这些不同 04. 的测试类型的区别与联系(如功能测试、性能测试……)

测试类型有:功能测试,性能测试,界面测试。

功能测试在测试工作中占的比例最大,功能测试也叫黑盒测试。是把测试对象看作一个 黑盒子。利用黑盒测试法进行动态测试时,需要测试软件产品的功能,不需测试软件产品的 内部结构和处理过程。采用黑盒技术设计测试用例的方法有:等价类划分、边界值分析、错 误推测、因果图和综合策略。

性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各 项性能指标进行测试。负载测试和压力测试都属于性能测试,两者可以结合进行。通过负载 测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指 标的变化情况。压力测试是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能 提供的最大服务级别的测试。

界面测试,界面是软件与用户交互的最直接的层,界面的好坏决定用户对软件的第一印 象。而且设计良好的界面能够引导用户自己完成相应的操作,起到向导的作用。同时界面如 - 11 -

同人的面孔,具有吸引用户的直接优势。设计合理的界面能给用户带来轻松愉悦的感受和成 功的感觉,相反由于界面设计的失败,让用户有挫败感,再实用强大的功能都可能在用户的 畏惧与放弃中付诸东流。

区别在于,功能测试关注产品的所有功能上,要考虑到每个细节功能,每个可能存在的 功能问题。性能测试主要关注于产品整体的多用户并发下的稳定性和健壮性。界面测试更关 注于用户体验上,用户使用该产品的时候是否易用,是否易懂,是否规范(快捷键之类的), 是否美观(能否吸引用户的注意力),是否安全(尽量在前台避免用户无意输入无效的数据, 当然考虑到体验性,不能太粗鲁的弹出警告)?做某个性能测试的时候,首先它可能是个功 能点,首先要保证它的功能是没问题的,然后再考虑该功能点的性能测试

05. 请试着比较一下黑盒测试、白盒测试、单元测试、集成测试、系统测试、验收测试的

区别与联系。

黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。 白盒测试:已知产品的内部工作过程,可以通过测试证明每种内部操作是否符合设计规 格要求,所有内部成分是否以经过检查。

软件的黑盒测试意味着测试要在软件的接口处进行。这种方法是把测试对象看做一个黑 盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书, 检查程序的功能是否符合它的功能说明。因此黑盒测试又叫功能测试或数据驱动测试。黑盒 测试主要是为了发现以下几类错误:

1、是否有不正确或遗漏的功能?

2、在接口上,输入是否能正确的接受?能否输出正确的结果?

3、是否有数据结构错误或外部信息(例如数据文件)访问错误?

4、性能上是否能够满足要求?

5、是否有初始化或终止性错误?

软件的白盒测试是对软件的过程性细节做细致的检查。这种方法是把测试对象看做一个 打开的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例, 对程序所有逻辑路径进行测试。通过在不同点检查程序状态,确定实际状态是否与预期的状 态一致。因此白盒测试又称为结构测试或逻辑驱动测试。白盒测试主要是想对程序模块进行 如下检查:

1、对程序模块的所有独立的执行路径至少测试一遍。

2、对所有的逻辑判定,取“真”与取“假”的两种情况都能至少测一遍。

3、在循环的边界和运行的界限内执行循环体。

4、测试内部数据结构的有效性,等等。

单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、 很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下 某个特定函数的行为。

单元测试是由程序员自己来完成,最终受益的也是程序员自己。可以这么说,程序员有 责任编写功能代码,同时也就有责任为自己的代码编写单元测试。执行单元测试,就是为了 证明这段代码的行为和我们期望的一致。

集成测试(也叫组装测试,联合测试)是单元测试的逻辑扩展。它的最简单的形式是: 两个已经测试过的单元组合成一个组件,并且测试它们之间的接口。从这一层意义上讲,组 件是指多个单元的集成聚合。在现实方案中,许多单元组合成组件,而这些组件又聚合成程 序的更大部分。方法是测试片段的组合,并最终扩展进程,将您的模块与其他组的模块一起 测试。最后,将构成进程的所有模块一起测试。

- 12 -

系统测试是将经过测试的子系统装配成一个完整系统来测试。它是检验系统是否确实能 提供系统方案说明书中指定功能的有效方法。(常见的联调测试)

系统测试的目的是对最终软件系统进行全面的测试,确保最终软件系统满足产品需求并 且遵循系统设计。

验收测试是部署软件之前的最后一个测试操作。验收测试的目的是确保软件准备就绪, 并且可以让最终用户将其用于执行软件的既定功能和任务。

验收测试是向未来的用户表明系统能够像预定要求那样工作。经集成测试后,已经按照设计 把所有的模块组装成一个完整的软件系统,接口错误也已经基本排除了,接着就应该进一步 验证软件的有效性,这就是验收测试的任务,即软件的功能和性能如同用户所合理期待的那 样。

07. 您认为做好测试计划工作的关键是什么?

1. 明确测试的目标,增强测试计划的实用性

编写软件测试计划得重要目的就是使测试过程能够发现更多的软件缺陷,因此软件测试 计划的价值取决于它对帮助管理测试项目,并且找出软件潜在的缺陷。因此,软件测试计划 中的测试范围必须高度覆盖功能需求,测试方法必须切实可行,测试工具并且具有较高的实 用性,便于使用,生成的测试结果直观、准确

2.坚持“5W”规则,明确内容与过程

“5W”规则指的是“What (做什么)”、“Why (为什么做)”、“When (何时做)”、“Where (在哪里)”、“How (如何做)”。利用“5W”规则创建软件测试计划,可以帮助测试团队理 解测试的目的(Why ),明确测试的范围和内容(What ),确定测试的开始和结束日期(When ), 指出测试的方法和工具(How ),给出测试文档和软件的存放位置(Where )。

3.采用评审和更新机制,保证测试计划满足实际需求

测试计划写作完成后,如果没有经过评审,直接发送给测试团队,测试计划内容的可能不准 确或遗漏测试内容,或者软件需求变更引起测试范围的增减,而测试计划的内容没有及时更 新,误导测试执行人员。

4. 分别创建测试计划与测试详细规格、测试用例

应把详细的测试技术指标包含到独立创建的测试详细规格文档,把用于指导测试小组执 行测试过程的测试用例放到独立创建的测试用例文档或测试用例管理数据库中。测试计划和 测试详细规格、测试用例之间是战略和战术的关系,测试计划主要从宏观上规划测试活动的 范围、方法和资源配置,而测试详细规格、测试用例是完成测试任务的具体战术。

11. 您以往是否曾经从事过性能测试工作?如果有,12. 请尽可能的详细描述您以往的性能 测试工作的完整过程。

性能测试类型包括负载测试,强度测试,容量测试等

负载测试:负载测试是一种性能测试指数据在超负荷环境中运行,程序是否能够承担。 强度测试: 强度测试是一种性能测试,在系统资源特别低的情况下软件系统运行情况 容量测试:确定系统可处理同时在线的最大用户数

在网站流量逐渐加大的情况下,开始考虑做性能测试了,首先要写好性能测试计划,根 据运营数据得出流量最大的页面(如果是第一次的话,一般是首页,下载页,个人帐户页流 量最大,而且以某种百分比),

Web服务器指标指标:

* Avg Rps: 平均每秒钟响应次数=总请求时间/秒数;

* Successful Rounds:成功的请求;

* Failed Rounds :失败的请求;

* Successful Hits :成功的点击次数;

- 13 -

* Failed Hits :失败的点击次数;

* Hits Per Second :每秒点击次数;

* Successful Hits Per Second :每秒成功的点击次数;

* Failed Hits Per Second :每秒失败的点击次数;

* Attempted Connections :尝试链接数;

3、你认为公司的BUG测试流程是什么?

1)当测试工程师发现了一个bug而且在bug tracking tool里面没有相同的bug, 他需要填写所有需要的bug信息并且把这个bug分配给test leader

2)如果这个bug不是一个真正的bug, test leader需要close这个bug

3)test leader需要审查bug的各种信息都完备,如果有信息不完整,他需要把状态改成”feedback” 并重新assign给提交者

4)如果这个bug是一个真正存在的bug, test leader需要把这个bug分配给相关的开发团队的PM, 并且把bug状态改成Assigned

5)如果这个bug属于另外一个开发团队,PM需要把这个bug重新分配给那个开发团队的PM

6)PM审查bug,并且分配给相应的开发人员去改正。

7)开发人员收到bug以后,对相关的缺陷进行改正,并且重新分配给提交bug的测试人员并且把状态改成”Fixed”

8)测试人员需要对这个bug进行重新测试,保证相关的缺陷已经改正,测试人员可以reopen这个bug如果缺陷依然存在并且重新分配给相关的开发人员或者close这个bug如果缺陷已经改正。 准备知识:

- 14 -

更多相关推荐:
软件测试工程师面试经验之谈

很多软件测试朋友都想找份好工作,找一份待遇好、环境好,又有自己用武之地和发展空间的工作。以下是一位从事软件测试工作的朋友在招聘和面试的一些经验与心得之谈,希望对大家找工作能有所帮助。第一步、投递简历投递简历,让…

软件测试工程师面试技巧

核心提示第一个问题自我介绍心理学首因效应告诉我们第一印象非常重要自我介绍最重要的是能够在面试官心目中留下一个好的第一感觉说得更直白一点是让面试官舒服但是我发现很多人就是直接简单的介绍了一下过去的经历但是实际上一...

软件测试工程师面试经验总结

首先说明我算上找实习的时候的面试总共就经历了不到5次,没有多少经验,就在网上和书上摘录了些我认为比较重要的,分享给大家,希望各位都能找到一份适合自己的好工作。1.笔试题对于笔试,有的公司笔试题是不区分开发和测试…

软件测试工程师面试过程中遇到的问题

前段时间公司招聘软件测试人员虽然基本上都是招的应届毕业生但我还是从现实以及网络上找到了一些应聘软件测试QA的面试问题集当然这个也都不会有标准答案的现在只是以偶的一点理解加上网上的一些内容列举出来供有需要的XDJ...

20xx软件工程师求职自我介绍

20xx软件工程师求职自我介绍软件编程是现在it行业很火的的职业尽管这样的工作比较伤脑力但报酬却还是非常不错的下面是由随笔吧整理的软件工程师求职自我介绍欢迎阅读需要浏览更多会求职自我介绍请关注本栏目软件工程师求...

软件测试英文自我介绍加强版

WellitsmypleasuretointroducemyselfImyangchengfromHuBeiprovinceandIgraduatedfromHuBeiUniversityfornationalitieslasty...

软件测试英文自我介绍

WellitsmypleasuretointroducemyselfImyangchengfromHuBeiprovinceandIgraduatedfromHuBeiUniversityfornationalitieslasty...

对日软件工程师自我介绍(速成版)

日本語自己紹介私小張今年22歳学校江蘇理工学院私専攻工程常州来英語四級証書持私三等奨学金取曾获奖好HTML上手私学生管理銀行管理私性格明友达交际好貴社入思願

软件相关面试自我介绍模板

应届生自我介绍写作要点我能胜任这份工作1当成议论文写论点论据论证这里着重强调论点和论据论证不需要2围绕这个主题给出几个论点自己是优秀的学生学生成绩获取奖项奖学金两三项没有的拿别人的用用专业知识过硬是相关专业熟练...

java程序员面试简历(列子)

java程序员面试简历(列子),内容附图。

应聘java软件工程师

应聘java软件工程师个人简历第1页个人简历第2页个人简历第3页

面试自我介绍一分钟

面试自我介绍一分钟一段短短的自我介绍其实是为了揭开更深入的面谈而设的一分钟的自我介绍犹如商品广告在短拿着简历回答问题若接电话时正好手边有简历记住一定要把它拿出来对照着回答问题一般来说面试方会进行常规的简历信息核...

软件测试工程师面试自我介绍(8篇)