腾讯测试岗(部分附答案)

腾讯测试岗面试经
软件测试

  1. 你觉得测试是怎么一个工作:保证软件质量,是产品发布的把关过程。主要工作为在测试过程中发现问题,告知开发人员修改问题,并在测试报告中得出软件的质量情况。

  2. 你对系统测试的基础理论知识了解怎样,有哪些【2次】:软件测试过程包括单元测试(测试每个模块的工作是否正常工作),集成测试(将已经测试过的模块组装起来进行测试,检验程序结构问题),确认测试(测试是否满足功能要求)和系统测试(测试与系统其他部分是否协调工作,比如数据库,硬件),验收测试(站在用户的角度检验产品质量)
    软件测试的类型主要分为功能测试(也叫黑盒测试,关注产品的所有功能),性能测试(负载测试和压力测试,关注产品的稳定性和健壮性),界面测试(关注用户的体验)

  3. 怎么看待软件测试的潜力和挑战:首先,软件测试正在快速发展,随着大数据的发展,传统的测试技术可能不在适用,目前自动化测试软件部分代替了传统的手工测试方法,不过自动化测试工具的开发还需要大量的专业人士。站在测试人员的角度,需要深入了解场景并对不同的场景尝试新的测试方法。同时还出现了敏捷测试,Develops
    敏捷测试和传统测试的对比
    传统测试 敏捷测试
    强调测试的计划性,按照计划进行 侧重计划的不断调整以适应需求的变化
    具有阶段性 强调持续测试、持续的质量反馈,模糊了阶段性
    强调任何发现的缺陷要记录下来,区分测试人员和开发人员的各自不同的责任 强调面对面的沟通、协作,强调团队的责任,不太关注对缺陷的记录与跟踪
    更关注bug,围绕bug开展一系列的活动 更关注产品本身,关注可以交付的客户价值
    鼓励自动化测试 基础就是自动化测试
    强调测试的独立性,将“开发人员”和“测试人员”角色分得比较清楚 测试人员需要参与全部开发活动,需要参与整个项目组的所有会议

  4. 你觉得软件测试的核心竞争力是什么:测试人员的核心竞争力在于提早发现问题,并能够发现别人无法发现的问题。早发现问题:问题发现的越早,解决的成本越低。如果一个需求在还未实现的时候就能发现需求的漏洞,那么这种问题的价值是最高的。发现别人无法发现的问题:所有人都能发现的问题,你发现了,那就证明你是可以被替代的。别人发现不了,而你可以发现,那么你就是无法被替代。

  5. 哪些项目有过跟测试有过交互或者有过测试的思想:大规模回归测试用例分析

  6. 你觉得测试和开发需要怎么的结合才能使软件的质量得到更好的保障
    (1) 项目前期。测试跟进开发需求,充分理解功能需求
    (2) 项目开发阶段。测试人员准备测试用例,测试数据,自动化等
    (3) 项目测试阶段。测试执行
    (4) 验收阶段。准备环境给产品负责人验收
    (5) 产品上线后。进行线上测试

  7. 你觉得单元测试可行吗:可行,单元测试可以有效地测试某个程序模块的行为,是未来重构代码的信心保证。事前可以保证质量,事后可以快速复现问题,并在修改代码后做回归自测。可行性考虑的是要用一些可行的方法做到关键的代码可测试,如通过边界条件、等价类划分、错误、因果,设计测试用例要覆盖常用的输入组合、边界条件和异常。

  8. 怎么设计测试用例
    测试用例包括测试编号,用例类型,前置条件,操作步骤,预期结果,实际结果等
    测试用例的特点:步骤清晰(按照执行测试的步骤一步一步编写),结果唯一(一个测试用例只有一个测试结果),可操作性强(不同的平台不同的测试人员测试结果相同)
    设计测试用例的方法:关键点(以最少的用例在合理地时间内发现最多的问题)

  1. 对黑盒测试技术:等价类划分方法(测试每个等价类的代表性数据等同于测试该类的其他数据);边界值(考虑输入输出的边界值);错误猜测(列出所有可能出现的错误或者容易发生错误的清单);因果图(穷举条件获得结果,对结果进行优化合并,得到策略表);正交实验法(从正交表【均匀分布,整齐划一】中找出能以少数代替全面的测试用例);综合策略
  2. 对白盒测试技术: 静态分析方法(控制流分析技术、数据流分析技术、信息流分析技术);动态分析方法(逻辑覆盖率测试(分支测试、路径测试等),程序插装等)
    设计测试用例的步骤:明确用户需求,拆分需求,梳理业务逻辑,区分页面测试和业务逻辑测试
  1. 安卓自动化测试工具
    Robotium(偏白盒):免费的Android UI测试工具,使用robotium需要知道package和acitivity这样的细节,适用于为不同的安卓版本和子版本测试自动化。为了自动化测试还需要修改程序源代码,不适合与系统软件的交互,不能锁定和解锁智能手机或平板电脑,也没有录制回放功能,也不提供截图。
    MoneyRunner(白盒):用于自动化功能测试,不必处理源代码来做自动化测试,可以使用录制工具来创建测试。它必须为每个设备编写脚本,每次测试程序的用户界面变化都需要调整测试脚本。
    Appium: Appium利用WebDriver接口运行测试,它可以控制移动设备上的Safari和Chrome。没有详细的报告,减少了在移动设备上XPath支持。
    Ronaorex: 有详细的截屏报告,能通过Wifi连接智能手机和平板电脑,可以不用XML数据格式来详细编写数据驱动的测试,可以详细声明额外的程序模块,便于后期开发周期中测试更复杂的场景。搜索功能慢,只能在APK文件设备上工作。
    MobileTest(华为): Android APK兼容性自动化遍历测试,基于自动化真机测试,帮助开发者发现缺陷并定位问题。
  2. 兼容性测试怎么测:人工测试(移动app选用不同的机型测试),借助第三方工具测试(比如移动app的兼容性测试可以使用云测平台)
  3. 测试手机里一个app
    测试移动app:内部测试(单个界面测试,界面之间的跳转测试,启动退出更新测试);硬件环境测试(访问权限测试,机型测试);软件环境测试(不同app频繁切换的测试,不同的网络环境的测试);性能测试(耗电量,网络流量)
  4. 移动端有网情况下,从app提取DB速度很慢的原因怎么测
  5. 项目中做过回归测试相关的
    回归测试:在软件维护阶段,对软件进行修改之后进行的测试,目的是检验对软件的修改是否正确
  6. 熟悉的自动化测试工具:selenium(将web操作封装成类,用户通过调用selenium提供的api来进行web操作)

编程语言

  1. c++和c的主要区别
    C++是面向对象的语言,而C是面向过程的结构化编程语言
    语法上:
    C++具有封装、继承和多态三种特性
    C++相比C,增加多许多类型安全的功能,比如强制类型转换、
    C++支持范式编程,比如模板类、函数模板等
  2. 多态怎么实现
    多态性
    (1)什么是多态性(注意:多态与多态性是两种概念)
    多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。总而言之就是在不考虑对象的类型的情况下直接使用对象。
    (1)增加了程序的灵活性
      以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)
    (2)增加了程序额可扩展性
      通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用
  3. 会Python吗?问的较多【2次】
  4. 具体的开发语言是什么?java?(赶紧说是Python,然后介绍了一波各种Python包)
  5. 自我评价对Python和java的理解程度
  6. 知道哪些设计模式说一下
    创建型模式,共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
    结构型模式,共7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
    行为型模式,共11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
  7. jvm内存管理,垃圾回收
    确定某个对象是需要被回收的: 通过引用计数来判断一个对象是否可以被回收,但是若某些对象循环引用,即使将对象赋值为null也不能回收,采用可达性分析解决这个问题
    典型的垃圾回收算法
  1. Mark-Sweep(标记-清除)算法
  2. Copying(复制)算法
  3. Mark-Compact(标记-整理)算法
  4. Generational Collection(分代收集)算法
    典型的垃圾收集器
  5. Serial/Serial Old
  6. ParNew
  7. Parallel Scavenge
  8. Parallel Old
  9. CMMS
  10. G1
    数据库
  1. 数据库三范式
    第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要求,否则,将有很多基本操作在这样的关系模式中实现不了。
    第二范式:如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。
    第三范式:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF.
  2. 数据库的内连接与外链接
    内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。
    外连接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接。
    左外连接:左边表数据行全部保留,右边表保留符合连接条件的行。
    右外连接:右边表数据行全部保留,左边表保留符合连接条件的行。
    全外连接:左外连接 union 右外连接。
  3. 数据库的事务
    特性:原子性、一致性、隔离性、持久性
  4. 如果数据库里有1000万个数据,查询时怎么优化
    1) 在数据库设计方面:建立索引;分区(MySQL,比如按时间分区);尽量使用固定长度的字段;限制字段长度;
    2) 在数据库I/O方面:增加缓冲区;如果涉及表的级联,不同的表存储在不同的磁盘上,以增加I/O速度;
    3) 在SQL语句方面:优化SQL语句,减少比较次数;限制返回的条目数(MySQL中用limit);
    4) 在Java方面:如果是反复使用的查询,使用PrepaerdStatement减少查询次数。

操作系统

  1. 说说Java多线程间的通信Wait(),notify(),notifyAll(),锁等
    notify()方法是随机唤醒一个线程
    notifyAll()方法是唤醒所有线程
    JDK5之前无法唤醒指定的一个线程
    如果多个线程之间通信, 需要使用notifyAll()通知所有线程, 用while来反复判断条件
    Java多线程开发中,我们常用到wait()和notify()方法来实现线程间的协作,简单的说步骤如下:
  2. A线程取得锁,执行wait(),释放锁;
  3. B线程取得锁,完成业务后执行notify(),再释放锁;
  4. B线程释放锁之后,A线程取得锁,继续执行wait()之后的代码;
  5. 多进程、多线程,操作系统层面的差别和联系

计算机网络

  1. 什么时候用TCP ,什么时候用 UDP(我提到了QQ用的是UDP)
    两种协议都是传输层协议,为应用层提供信息载体。TCP协议是基于连接的可靠协议,有流量控制和差错控制,也正因为有可靠性的保证和控制手段,所以传输效率比UDP低;UDP协议是基于无连接的不可靠协议,没有控制手段,仅仅是将数据发送给对方,因此效率比TCP要高。
    TCP一般用于文件传输(FTP HTTP 对数据准确性要求高,速度可以相对慢),发送或接收邮件(POP IMAP SMTP 对数据准确性要求高,非紧急应用),远程登录(TELNET SSH 对数据准确性有一定要求,有连接的概念)等等。
    UDP一般用于即时通信(QQ聊天 对数据准确性和丢包要求比较低,但速度必须快),在线视频(RTSP 速度一定要快,保证视频连续,但是偶尔花了一个图像帧,人们还是能接受的),网络语音电话(VoIP 语音数据包一般比较小,需要高速发送,偶尔断音或串音也没有问题)等等。
  2. 为什么QQ用UDP,QQ如何保证信息传输安全的
    使用UDP协议的软件,通过应用程序本身来保证传输的正确性,而且即使是UDP协议,现在的网络需要重传的数据包时很少的。
    首先每一个 QQ 客户端实际上都适合服务器交互,再由服务器转发给正在通信的用户,如果每一个 QQ 从一上线到下线的这段时间全部采用 tcp 长连接,这对服务器的负担很大,而如果采用 tcp 短连接,频繁的连接断开也会造成网络负担,而采用 udp 则可以避开上述麻烦,减少服务器的负担。
    不管 udp 还是 tcp,最终登陆成功之后,QQ 都会有一个 tcp 连接来保持在线状态。这个 tcp 连接的远程端口一般是80,采用 udp 方式登陆的时候,端口是8000。 udp 协议是无连接方式的协议,它的效率高,速度快,占资源少,但是其传输机制为不可靠传送,必须依靠辅助的算法来完成传输控制。QQ 采用的通信协议以 udp 为主,辅以 tcp 协议。由于 QQ 的服务器设计容量是海量级的应用,一台服务器要同时容纳十几万的并发连接,因此服务器端只有采用 udp 协议与客户端进行通讯才能保证这种超大规模的服务。  
    QQ 客户端之间的消息传送也采用了 udp 模式,因为国内的网络环境非常复杂,而且很多用户采用的方式是通过代理服务器共享一条线路上网的方式,在这些复杂的情况下,客户端之间能彼此建立起来 tcp 连接的概率较小,严重影响传送信息的效率。而udp 包能够穿透大部分的代理服务器,因此 QQ 选择了 udp 作为客户之间的主要通信协议。采用 udp 协议,通过服务器中转方式。因此,现在的 IP 侦探在你仅仅跟对方发送聊天消息的时候是无法获取到IP的。
  3. socket套接字的建立过程【2次】
    服务器端程序的编写步骤:
    第一步:调用socket()函数创建一个用于通信的套接字。
    第二步:给已经创建的套接字绑定一个端口号,这一般通过设置网络套接口地址和调用bind()函数来实现。
    第三步:调用listen()函数使套接字成为一个监听套接字。
    第四步:调用accept()函数来接受客户端的连接,这是就可以和客户端通信了。
    第五步:处理客户端的连接请求。
    第六步:终止连接。
    客户端程序编写步骤:、
    第一步:调用socket()函数创建一个用于通信的套接字。
    第二步:通过设置套接字地址结构,说明客户端与之通信的服务器的IP地址和端口号。
    第三步:调用connect()函数来建立与服务器的连接。
    第四步:调用读写函数发送或者接收数据。
    第五步:终止连接。
  4. 三次握手四次挥手
    第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
    第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
    第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
    1)客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
    2)服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
    3)客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
    4)服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
    5)客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
    6)服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
  5. 四次挥手时,其中两次等待分别是什么时候,TIME_WAIT为什么要等待两个时间周期
    虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
  6. 浏览一个网页,从客户端开始用到了哪些协议
    上网肯定离不开TCP/IP协议,访问网页应该是HTTP超文本传输协议。涉及到上传下载还要用到FTP文件传输协议。
    TCP/IP协议又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。
    超文本传输协议(HTTP)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。
    FTP 是File Transfer Protocol的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:“下载”(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。
  7. qq是怎么实现在线大文件的传输的
    通过“md5(‘文件内容’)”生成“唯一标识符”,然后根据这个标识符去判断服务器上是否已经存在这个文件,如果存在,则不需要再次上传。此外,md5(‘文件内容’)还可以校验文件的完整性和文件内容是否被修改过。
    为何根据文件内容生成唯一的标识符没有效率问题:实验证明,不存在效率问题,487M的文件,只用了3.29秒

Linux

  1. Linux的熟悉程度?软链接了解吗?
    软链接:linux软连接、类似window的快捷方式可以跨磁盘块(硬连接不可以)。
    所以貌似软连接更屌也更常用,硬连接唯一的特性就是删掉任意一个其他的还存在,不过我感觉这个特性貌似并没有什么卵用,反而容易被滥用
  2. Linux下查看内存使用情况的命令,设置定时任务的命令
    cat /proc/meminfo
    sudo atop
    free –h

代码和算法

  1. 字符串的逆序 手写代码
  2. 二叉树遍历
  3. 怎么求两条链表的交点
  4. 怎么判断链表环【之前看过】
  5. 快速排序原理,平均复杂度,最坏最好情况时间复杂度且数组满足什么要求
  6. 测试用例设计(考察边界、逻辑)一串数字,闰年的判别
  7. 给出一些输入样例,关于是否是闰年的测试用例

其他

  1. 深度学习的一些应用:
  2. 语音识别——语音转义
  3. 图像处理——人脸识别、猪脸识别、运动监测、
  4. 自然语言领域——神经机器翻译,问答系统,文摘生成
  5. 深度强化学习——Alpha Go
  6. 项目的架构图 边画边讲述

你可能感兴趣的:(面试之测试岗)