秋招(测试开发)——面试题

目录

一、测试技术

三、操作系统

四、数据库

五、语言(python,c,c++)


一、测试技术

1.怎么样做一个接口测试

结合项目说明 1、具体用什么工具/框架 2、接口的类型/数据格式 3、接口文档/swagger/yapi/ - 抓包/沟通 4、断言 - 会比对哪些数据 5、数据库校验 6、可以再补充说明一些难点处理方式

2.对于集成测试中自顶向下集成和自底向上集成两个策略的理解?(它们各自的优缺点和主要适应于哪种类型测试)

自顶向下:自顶向下的集成测试就是按照系统层次结构图,以主程序模块为中心,自上而下按照深度优先或者广度优先策略,对各个模块一边组装一边进行测试。(目的:从顶层控制(主控模块)开始,采用同设计顺序一样的思路对被测系统进行测试,来验证系统的稳定性。)

自底向上:自底向上集成是从系统层次结构图的最底层模块开始进行组装和集成测试的方式。对于某一个层次的特定模块,因为它的子模块(包括子模块的所有下属模块)已经组装并测试完成,所以不再需要桩模块。在测试过程中,如果想要从子模块得到信息可以通过直接运行子模块得到。也就是说,在集成测试的过程中只需要开发相应的驱动模块就可以了。(从依赖性最小的底层模块开始,按照层次结构图,逐层向上集成,验证系统的稳定性。)

3.LoadRunner(性能测试)分为哪三个模块?请简述各模块的主要功能。

Virtual User Generator:用于录制脚步
 
Mercury LoadRunner Controller:用于创建、运行和监控场景
 
Mercury LoadRunner Analysis:用于分析测试结果

4.QTP(功能测试)中的Action有什么作用?有几种?

Action作用:

1)用Action可以对步骤集进行分组
2)步骤重组,然后被整体调用
3)拥有自己的sheet
4)组合有相同需求的步骤,整体操作
5)具有独立的对象仓库

Action种类:

1)可复用Action
2)不可复用Action
3)外部Action

5.自动化测试框架

1.模块化框架(test script modularity)
2.函数库结构框架(test library architecture)
3.关键字驱动测试框架(keyword-driven/table-driven testing)
4.数据驱动测试框架(data-driven testing)
5.混合型框架(hybrid test automation)

6.性能测试(时间性能:向服务器发送请求,服务器返回响应数据的时间;空间性能:CPU占用,内存占用,磁盘消耗)

1) 负载测试:通过在被测系统上不断加压,直到性能指标达到极限,例如“响应时间”超过预定指标或都某种资源已经达到饱和状态。

2) 压力测试:测试系统在一定饱和状态下,例如cpu、内存在饱和使用情况下,系统能够处理的会话能力,以及系统是否会出现错误。

3) 并发测试:通过模拟用户并发访问,测试多用户并发访问同一个应用、同一个模块或者数据记录时是否存在死锁或其者他性能问题。

4) 配置测试:配置测试方法通过对被测系统的软\硬件环境的调整,了解各种不同对系统的性能影响的程度,从而找到系统各项资源的最优分配原则。

5) 可靠性测试:在给系统加载一定业务压力的情况下,使系统运行一段时间,以此检测系统是否稳定。
 

7.划分等价类得原则

    (1)在输入条件规定了取值范围或值的个数的情况下,可以确立一个有效等价类和两个无效等价类 

    (2)在输入条件规定了输入值的集合或者规定了“必须如何”的条件的情况下,可以确立一个有效等价类和一个无效等价类 

    (3)在输入条件是一个布尔量的情况下,可确定一个有效等价类和一个无效等价类 

    (4)在规定了输入数据的一组值(假定n个),并且程序要对每一个输入值分别处理的情况下,可确立n个有效等价类和一个无效等价类 

    (5)在规定了输入数据必须遵守的规则的情况下,可确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则) 

    (6)在确知已划分的等价类中,各元素在程序处理中的方式不同的情况下,则再将该等价类进一步地划分为更小的等价类

8.selenium的原理是什么;selenium操作;selenium 中登录按钮除了 click 还有什么方式

原理:selenium它是用 http协议来连接webdriver,客户端可以使用 Java 或者 Python 各种编程语言来实现

操作:基本上 selenium 提供的一下几大类操作都能够灵活使用,比如说:八大元素定位方式、三大等待方式、用户点击、输入等常见操作,还有窗口切换、iframe 切换操作,比如说 actionchains 文件上传、JS操作 等一些复杂问题的操作;

登录方式:比如说要用到 物理键盘进行操作,发出回车指令;然后,如果说这个登录按钮,在一个表单里面的话,也可以在定位到这个用户输入框,输入完了之后,直接用3D 方法进行提交

9.什么项目适合做自动化测试

关键字:不变的、重复的、规范的

第一点,需求变化不能太频繁;

第二点,项目周期要足够长,如果自动化代码还没有写完,公司就倒闭了,那也不需要自动化了

第三点,脚本可以重复使用:在一些典型的场景,比如说 “冒烟测试、回归测试” 的地方就是经常使用自动化测试;

第四点,被测试的软件是否规范:比如说是不是有需求文档、规范的接口文档、是否有原型图、你的接口设计是不是比较规范;

第五点,手工测试是无法完成的;比如说一个性能测试,不能同时有 一千只手一直做好点点点,自动化测试的成本不是特别高

10.怎么开展自动化测试工作的

第一,根据产品的业务特性整理出来,可以做自动化的一个功能模板;

第二,我们会根据有限级以及人员现状,来制定自动化测试计划;

第三,我们会从功能用例当中挑选合适的用例来转成自动化用例;

第四,是框架选型,选择编制语言或者工具来实现,我们的团队都是会代码的能力还不错,所以我们选择的是 Python 语言来实现的;

第五,就是自动化测试的脚本开发;

第六,根据项目来制定自动化的执行方案;

第七,就是测试报告的分析工作,以及 自动化测试成果的汇报,跟进后期的维护;
 

三、操作系统

1.http通信,三次握手,四次挥手

1)三次握手建立连接:
第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

2)四次挥手断开连接:
第一次挥手:
主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当 然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但此时主动关闭方还可以接受数据。
第二次挥手:
被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
第三次挥手:
被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:
主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。

2.Internet采用哪种网络协议?该协议主要层次结构?Internet物理地址和IP地址转换采用什么协议?

3.TCP、UDP区别(传输层);Http、Https区别(应用层)

TCP(传输控制协议):面向连接的,进程之间通信需要先建立连接,可靠的传输

UDP(用户数据报协议):面向报文的,进程之间通信不需要建立连接,不可靠传输

HTTP(超文本传输协议):信息明文传输;无状态连接(其数据包的发送、传输和接收都是相互独立的);连接端口(80)

HTTPS:加密传输协议;加密传输,身份验证的连接;连接端口(443)

4.互斥锁、悲观锁和乐观锁、自旋锁、死锁;死锁产生的条件

死锁:本质就是多执行流进行资源争抢的时候由于访问的顺序不当,造成相互等待的情况;

死锁产生的条件:互斥(我加了锁别人不能加锁);不可剥夺(我加了锁别人不能解锁);请求保持(我加锁A,然后去请求B,请求不到我也不释放A);环路等待(我加锁A,去请求B,别人加锁B来请求A,互相请求不到互相不解锁)

互斥锁:本身就是一个只有0和1的计数器,描述了一个临界资源的访问状态,当有线程访问临界资源时会先加锁,其他线程再访问的时候就只有在等待队列休眠。

自旋锁:当一个线程在获取锁的时候,如果锁已经被其他线程获取,那么该线程将循环等待,绕后不断的判断锁是否能够成功获取,直到获取到锁才会退出循环。

悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,它的底层原理在每次拿数据的时候都会上锁,这样别人想拿到这个资源就会阻塞,意思就是共享资源每次只给一个线程使用,用完再把资源转让给其他线程(读写锁)

乐观锁:总是认为别人不会修改数据,但在更新的时候回去判断再此期间有没有人更新这个数据,一般用于版本号机制去实现;版本号机制就是加上一个标识符version表示数据被修改的次数,如果被修改version+1;当线程A要更新数据的时候也会读取标识符,只有此时的version和刚开始A读的version一致时候(说明中途没人修改过),才会更新操作,否则一直重复。

5.动态库静态库、动态链接静态链接

动态链接:只是在编译的时候把函数实现在库中的位置记录下来,等到链接的时候再去库里面找

静态链接:直接把函数实现在编译的时候直接加载到可执行程序内

动态库:

静态库:

6.进程和线程的区别

进程是一个运行中的程序,是CPU资源分配的最小单位,同时每一个进程都有自己独立的空间;而线程是进程的一个执行流,一个进程可以包含多个线程,是CPU调度的最小单位,创建一个执行流的同时会创建一个pcb,因此我们也常说线程是轻量级进程;

7.timewait这个状态是客户端还是服务端;为什么需要进行time_wait 这个状态

客户端在最后一次断开链接发起者的状态,在最后一次ACK进入time_wait;

因为,客户端发送最后一次ACK之后,可能由于网络比较阻塞,该数据帧在传送过程中丢失了。服务器可能会再次进行确认,但是此时如果客户端已经进入close状态,不会理会其他的请求。因此,采用time_wait来保障如果网络比较阻塞,可以保证正常关闭TCP连接。

8.redis存储登陆信息,和session共享怎么实现的;

session共享(redis实现)_YXXYX的博客-CSDN博客_redis实现session共享

9.OSI七层模型;五层模型

10.Linux命令 怎么查看一个进程 ,怎么杀死一个进程,kill -9 和  kill -15 的区别;

11.线程安全的集合类有哪些;

12.Tcp报文首部

13.Tcp流量控制和拥塞控制怎么实现

14.接收窗口怎么得到的

四、数据库

1.数据库左关联和右关联

left join(左联接) 返回包括左表中的所有记录和右表中关联字段相等的记录

right join(右联接) 返回包括右表中的所有记录和左表中关联字段相等的记录

left join:
    select * from tableA a left join tableB b on a.id=b.id;
right join
    select * from tableA a right join tableB b on a.id=b.id

2.怎么查看是否用到了索引;

索引:索引是对数据库表中的一列或多列值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息。;

通过在SQL查询语句前面添加关键字 explain 就可以分析SQL查询语句的性能了

type:反应查询语句的性能

possibilitie_keys:SQL查询时用到的索引

key:显示SQL实际决定查询结果使用的键(索引)。如果没有使用索引,值为NULL

rows :显示MySQL认为它执行查询时必须检查的行数

3.什么时候需要创建索引;什么时候不会用到索引

需要创建索引:

  1. 主键自动建立唯一索引

  2. 频繁作为查询条件的字段应该创建索引

  3. 查询中排序的字段创建索引将大大提高排序的速度(索引就是排序加快速查找

  4. 查询中统计或者分组的字段;

不会用到索引:

        1.查询语句中使用“like”关键字如果匹配字符串的第一个字符为“%”,索引不会被使用。

        2.多列索引是在表的多个字段上创建一个索引,只有查询条件中使用了这些字段中的第一个字段,索引才会被使用。

        3.查询语句只有 OR 关键字时,如果 OR 前后的两个条件的列都是索引,那么查询中将使用索引。如果 OR 前后有一个条件的列不是索引,那么查询中将不使用索引。

4.一个成绩表查询总分最大的学生的id

五、语言(python,c,c++)

C、C++

1.在c/c++中static有什么用途?

c/c++共有

           1):修饰全局变量时,表明一个全局变量只对定义在同一文件中的函数可见。                   

           2):修饰局部变量时,表明该变量的值不会因为函数终止而丢失。              

           3):修饰函数时,表明该函数只在同一文件中调用。

c++独有: 

           4):修饰类的数据成员,表明对该类所有对象这个数据成员都只有一个实例。即该实例归 所有对象共有。

           5):用static修饰不访问非静态数据成员的类成员函数。这意味着一个静态成员函数只能访问它的参数、类的静态数据成员和全局变量
 

2.引用与指针有什么区别?

3.C++虚函数

4.面向对象和面向过程的区别,面向对象有什么优势;

5.变量的声明和定义有什么区别

为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明,
但是只在一个地方定义。加入 extern 修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间,如外部变量。

6.sizeof 和 strlen 的区别

(1)sizeof 是一个操作符,strlen 是库函数。
(2)sizeof 的参数可以是数据的类型,也可以是变量,而 strlen 只能以结尾为‘\0‘的字符串作参数。
(3)编译器在编译时就计算出了 sizeof 的结果。而 strlen 函数必须在运行时才能计算出来。并且 sizeof 计算的是数据类型占内存的大小,而 strlen 计算的是字符串实际的长度。
(4)数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了。


7.C中的 malloc 和C++中的 new 有什么区别

(1) new、delete 是操作符,可以重载,只能在 C++中使用。
(2) malloc、free 是函数,可以覆盖,C、C++中都可以使用。
(3) new 可以调用对象的构造函数,对应的 delete 调用相应的析构函数。
(4) malloc 仅仅分配内存,free 仅仅回收内存,并不执行构造和析构函数
(5) new、delete 返回的是某种数据类型指针,malloc、free 返回的是 void 指针。


8.简述 C、C++程序编译的内存分配情况

(1) 从静态存储区域分配:
内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。速度快、不容易出错,因为有系统会善后。例如全局变量,static 变量等。
(2) 在栈上分配:
在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配:
即动态内存分配。程序在运行的时候用 malloc 或 new 申请任意大小的内存,程序员自己负责在何时用 free 或 delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活。如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,另外频繁地分配和释放不同大小的堆空间将会产生堆内碎块。


9.简述 strcpy、sprintf 与 memcpy 的区别

(strcpy、sprintf 与 memcpy 都可以实现拷贝的功能,但是针对的对象不同,根据实际需求,来选择合适的函数实现拷贝功能)

(1) 操作对象不同,strcpy 的两个操作对象均为字符串,sprintf 的操作源对象可以是多种数据类型,目的操作对象是字符串,memcpy 的两个对象就是两个任意可操作的内存地址,并不限于何种数据类型。
(2) 执行效率不同,memcpy 最高,strcpy 次之,sprintf 的效率最低。
(3) 实现功能不同,strcpy 主要实现字符串变量间的拷贝,sprintf 主要实现其他数据类型格式到字符串的转化,memcpy 主要是内存块间的拷贝。

10.面向对象的三大特征

面向对象的三大特征是封装性、继承性和多态性:
(1)封装性:将客观事物抽象成类,每个类对自身的数据和方法实行 protection(private, protected, public)。
(2)继承性:广义的继承有三种实现形式:实现继承(使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)。
(3)多态性:是将父类对象设置成为和一个或更多它的子对象相等的技术。用子类对象给父类对象赋值之后,父类对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。 

11.C++的空类有哪些成员函数

缺省构造函数;缺省拷贝构造函数;缺省析构函数;缺省赋值运算符;缺省取址运算符;缺省取址运算符 const。

12.谈谈你对拷贝构造函数和赋值运算符的认识

拷贝构造函数和赋值运算符重载有以下两个不同之处:
(1) 拷贝构造函数生成新的类对象,而赋值运算符不能。
(2) 由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检验源对象是否和新建对象相同。而赋值运算符则需要这个操作,另外赋值运算中如果原来的对象中有内存分配要先把内存释放掉


13.简述类成员函数的重写、重载和隐藏的区别

(1)重写和重载主要有以下几点不同。
范围的区别:被重写的和重写的函数在两个类中,而重载和被重载的函数在同一个类中。
参数的区别:被重写函数和重写函数的参数列表一定相同,而被重载函数和重载函数的参数列表一定不同。
virtual 的区别:重写的基类中被重写的函数必须要有 virtual 修饰,而重载函数和被重载函数可以被virtual 修饰,也可以没有。
(2)隐藏和重写、重载有以下几点不同。
与重载的范围不同:和重写一样,隐藏函数和被隐藏函数不在同一个类中。
参数的区别:隐藏函数和被隐藏的函数的参数列表可以相同,也可不同,但是函数名肯定要相同。当参数不相同时,无论基类中的参数是否被 virtual 修饰,基类的函数都是被隐藏,而不是被重写。
说明:虽然重载和覆盖都是实现多态的基础,但是两者实现的技术完全不相同,达到的目的也是完全不同的,覆盖是动态态绑定的多态,而重载是静态绑定的多态。
 

14.简述多态实现的原理

编译器发现一个类中有虚函数,便会立即为此类生成虚函数表 vtable。虚函数表的各表项为指向对应虚函数的指针。编译器还会在此类中隐含插入一个指针 vptr(对 vc 编译器来说,它插在类的第一个位置上)指向虚函数表。调用此类的构造函数时,在类的构造函数中,编译器会隐含执行 vptr 与 vtable 的关联代码,将 vptr 指向对应的 vtable,将类与此类的 vtable 联系了起来。另外在调用类的构造函数时,指向基础类的指针此时已经变成指向具体的类的 this 指针,这样依靠此 this 指针即可得到正确的 vtable,。
如此才能真正与函数体进行连接,这就是动态联编,实现多态的基本原理。

15.链表和数组有什么区别

(1) 存储形式:数组是一块连续的空间,声明时就要确定长度。链表是一块可不连续的动态空间,长度可变,每个结点要保存相邻结点指针。
(2) 数据查找:数组的线性查找速度快,查找操作直接使用偏移地址。链表需要按顺序检索结点,效率低。
(3) 数据插入或删除:链表可以快速插入和删除结点,而数组则可能需要大量数据移动。
(4) 越界问题:链表不存在越界问题,数组有越界问题。
 

16.C++的引用和 C 语言的指针有什么区别

(1) 引用必须被初始化,但是不分配存储空间。指针不声明时初始化,在初始化的时候需要分配存储空间。
(2) 引用初始化以后不能被改变,指针可以改变所指的对象。
(3) 不存在指向空值的引用,但是存在指向空值的指针

17.typedef 和 define 有什么区别

(1) 用法不同:typedef 用来定义一种数据类型的别名,增强程序的可读性。define 主要用来定义常量,以及书写复杂使用频繁的宏。
(2) 执行时间不同:typedef 是编译过程的一部分,有类型检查的功能。define 是宏定义,是预编译的部分,其发生在编译之前,只是简单的进行字符串的替换,不进行类型的检查。
(3) 作用域不同:typedef 有作用域限定。define 不受作用域约束,只要是在 define 声明后的引用都是正确的。
(4) 对指针的操作不同:typedef 和 define 定义的指针时有很大的区别。


18.关键字 const 是什么

const 用来定义一个只读的变量或对象。主要优点:便于类型检查、同宏定义一样可以方便地进行参数的修改和调整、节省空间,避免不必要的内存分配、可为函数重载提供参考。

19.static 有什么作用

static 在 C 中主要用于定义全局静态变量、定义局部静态变量、定义静态函数。在 C++中新增了两种作用:定义静态数据成员、静态函数成员。

20.extern 有什么作用

extern 标识的变量或者函数声明其定义在别的文件中,提示编译器遇到此变量和函数时在其它模块中寻找其定义。

Python

1. python 标准库

os操作系统,time时间,random随机,pymysql连接数据库,queue队列

第三方库:requests,re,PIL,PyQt

常用的科学计算库:Numpy,scipy,pandas,matplotlib

2.python元组(tuple)和(列表)list区别

共同点:都是一种序列的形式,可以储存不同类型的数据

区别:1.列表是动态数组,它们可变且可以重设长度(改变其内部元素的个数)

        2. 元组是静态数组,它们不可变,且其内部数据一旦创建便无法改变

3.字典的展开顺序和存放顺序是一致的吗;python字典是有序的吗

python3.6之前是无序的,python3.6以后是有序的(字典的底层数据结构发生变化了)

4.数据集train set ,val set,test set;val set 和test set 可以混用吗

train set 训练集:训练集是用来训练模型的。

val set 验证集:用来对训练集训练出来的模型进行测试,通过测试结果来不断地优化模型。

test set 测试集:在训练结束后,对训练出的模型进行一次最终的评估所用的数据集。

5.过拟合,欠拟合介绍一下

6. Python闭包;装饰器;修饰器

闭包:在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。

装饰器:python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能

修饰器:在

7.深度学习的框架

8.HTTP的get请求和post请求的区别

9.python异常处理

10.pytest特点(python测试框架)

  • 简单灵活,容易上手
  • 支持参数化
  • 能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests)
  • pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等
  • 测试用例的skip和xfail处理
  • 可以很好的和jenkins集成
  • report框架----allure 也支持了pytest

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值