测试常见八股之快问快答24条
[问题1] 为什么选择测试或者测开
(1)最初上学的时候有学长有在做这一行的,有时候一起交流时了解过,后来就自己查资料,了解到这个行业薪资还不错,发展空间比较大,测试岗位注重业务经验积累、职业寿命比较长,我自己也非常感兴趣。所以就通过自学学习了软件测试岗位的一些工作技术(如:用例设计、linux、数据库、自动化等)。实习中发现软件测试的岗位职责非常重要,它是软件质量保障的最后一个环节,找到软件中遗留的bug非常有成就感。
(2)在之前的实习工作中,随着各种自动化测试技术和测试理念的发展,测试行业普遍在讲究测试前移。我越来越清楚地了解到,一位符合企业需要的优秀测试人员,除了要有软性的耐心细心责任心、交流能力、逻辑分析能力,还得要有硬性的测试用例设计能力、代码技术能力,合计为5大能力
(3)我可以利用之前积累的测试用例的设计经验、以及逻辑分析能力,设计出比较完善的测试用例;我自己也比较细心,可以尽可能的找到软件中的各种潜藏的bug;我可以使用各种接口、UI自动化测试的技术来对项目进行自动化测试,同时具体一定的运维知识,可以进行自动化的环境搭建,自动化的项目部署等工作。可以充分发挥自己的技术特长来提升测试效率。另外,我沟通能力不错,能很好的在测试工作中同公司的UI、产品、开发、运维等各个岗位的同时进行互动,而我个人也非常喜欢与他们打交道,因为可以在工作中学习到各个领域的很多新知识,从不同的人身上学习到不同的东西。
(4) 因此,从事软件测试工作是符合我长期的职业发展规划的,我会使用现有的所有技能、经验快速上手项目的测试工作,同时在项目过程中不断学习新知识,提高工作的测试效率和软件的质量。我认为自己是非常适合咱们公司的这个测试岗位的。
[问题2] 你的职业发展是什么
测试经验越多,测试能力越高。所以我的职业发展是需要时间积累的,一步步向着高级测试工程师奔去。而且我也有初步的职业规划,前3年积累测试经验,按如何做好测试工程师的要点去要求自己,不断更新自己改正自己,做好测试任务。优势在于我对测试坚定不移的信心和热情,虽然经验还不够,但测试需要的基本技能我有信心在工作中得以发挥。
作为软件测试工程师,职业规划是非常重要的,它能帮助你明确职业目标,提升技能和知识,并在职业生涯中取得成功。
一、短期规划(1-3年)
- 掌握基础知识:学习软件测试的基本概念、原理和方法,了解常见的测试工具和技术。
- 提升技能水平:通过实际项目经验,提高测试设计、测试执行和缺陷管理的能力。
- 拓展知识领域:了解软件开发流程、数据库基础、网络知识等相关领域,为未来的职业发展打下基础。
二、中期规划(3-5年)
- 深化专业领域:专注于某个测试领域,如性能测试、自动化测试、安全测试等,成为该领域的专家。
- 提升管理能力:学习项目管理、团队管理等知识,提升自己在团队中的影响力。
- 拓宽视野:关注行业动态,了解新技术和新方法,为职业发展提供更多可能性。
三、长期规划(5年以上)
- 成为行业领军人物:通过不断学习和实践,成为软件测试领域的领军人物,为行业发展做出贡献。
- 拓展职业领域:可以考虑向质量管理、项目管理等方向发展,拓宽自己的职业领域。
- 创业或自主发展:在积累足够的经验和资源后,可以考虑创业或自主发展,实现个人价值。
在职业规划过程中,软件测试工程师还需要注意以下几点:
- 持续学习:软件测试是一个不断发展和变化的领域,要保持对新技术和新方法的敏感度,不断学习新知识。
- 提升沟通能力:软件测试工程师需要与开发人员、产品经理等多个角色进行沟通,因此良好的沟通能力是非常重要的。
- 建立人脉关系:参加行业会议、技术交流会等活动,与同行建立联系,分享经验和资源。
- 关注个人成长:除了职业发展,软件测试工程师还需要关注自己的个人成长,如提升自信心、培养领导力等。
[问题3] 软件测试工作流程
1、软件测试标准定义:
软件测试是使用人工或自动的手段来运行或测定某个软件系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。通俗来说就是在软件中发现缺陷的过程。
2、软件测试目的
软件测试的目的是尽可能早的发现软件缺陷并确保其得以修复,因此软件测试是提高软件质量的重要手段,软件测试越早参与到软件开发过程中越好,这样开发出来的软件质量相对越高,时间和物力也越经济。
测试工作的最终目的是确保软件的质量,确保用户能够使用到优质量的软件,并且测试的时候,要站在用户的角度考虑软件的质量和性能。
具体流程:1.项目启动 2.项目规划 3.需求分析 4.架构设计 5.开发 6.功能测试 7.端到端测试 8.用户验收测试 9.上线 10.收尾
[问题4] 从实习中的收获
经历了这段时间的学习,除了收获知识、软件开发的流程,
1.首先学会了善于求教,理论知识不全面,几乎是每个实习生都会面临的问题,一开始我并不好意思求助于各位前辈,只是依赖自我钻研,这处理简单问题时是极其有效的,但一碰到难度,就会牺牲大量宝贵时间,影响效率。
2.学习严谨认真,从事测试工程师,必须要做到严谨认真
[问题5] 产品上线出现Bug,如何处理?
针对这类问题,原则是:快速响应并及时处理
如果问题严重影响客户使用,开发会第一时间在线上进行处理,临时解决掉满足用户的使用。
如果问题不严重,会将这类问题进行汇总,在后续版本中解决掉,主要从以下方面分析:
问题ID--问题描述--问题类型(是WISH需求还是BUG)--问题是否可以复现--问题遗漏原因分析--问题解决时间--问题责任人
作为测试人员,属于BUG类的问题的责任人,针对线上问题处理过程:
先确认弄清楚线上问题详情 针对线上BUG在现有版本(和发布到线上的版本一致)环境上进行复现 向开发反馈复现情况 ---- 可以复现的问题:弄清楚复现步骤-》反思BUG遗漏的原因-》制定后续改进规避策略,保证后续不要出现类似的问题
----不可以复现的问题:和客户进一步确认问题出现时操作步骤,客户那是必现还是偶现,在家按客户提供的步骤进一步复现
反思线上出现BUG原因:
(1)测试用例覆盖不全面----优化测试用例:把遗漏用户场景补充全;后续加强测试用例的评审
(2)测试时间不足,导致未在测试范围---合理规划测试时间,需要提前将可能存在风险反馈并进行评估
(3)测试条件受限:测试环境无法覆盖(如无对应的硬件环境,无对应的测试数据)---尽量提供充分的硬件条件,若无条件覆盖的,在测试结果中提前报出该类风险以让各方知晓以考虑其他方式覆盖
(4)开发人员在修复其他问题过程中,引入的问题:针对开发修复的问题,需要开发明确代码修改范围,可能受影响的功能范围
[问题6] 测试发现bug而开发不认为是bug 你怎么办?
1.找到需求文档或者是原型图进行匹对
2.尝试多种测试环境和多种测试方式来确认是否为bug
3.整理bug的复现的步骤和出现的频率
4.开发坚持不认为是bug的时候找项目经理测试经理进行沟通来确认是否为bug
5.将客户经理 测试 测试经理和项目经理进行开确认会来判定是否为bug
6.测试人员需要将bug整理并写入测试总结中
[问题7] 测试用例评审:开发、产品、测试人员都覆盖了哪些内容?
测试用例评审的参与人员是:开发、产品、测试人员。
产品人员参与,可以方便核对测试用例是否覆盖产品需求,在评审的过程中完善产品说明文档,完善产品的逻辑。
开发人员参与用例评审,可以从代码实现角度给出建议,防止漏测或过度测试,保证测试的全面性,减少无效测试,增加重点模块的测试。
测试人员参与用例评审,可以审查用例是否规范,对于交互模块的用例覆盖的是否齐全。
[问题8] 软件交付时间紧,赶着上线怎么办
1、培养多面手
2、更准确的预估上线时间
3、敏捷交付(敏捷开发以用户的需求进化为核心,采用达代、循序渐进的方法进行软件开发。)
我们可以尝试以下几个方法来应对时间不够用的情况:
- 优先级划分:我们可以根据需求的重要性和风险程度,对测试任务进行优先级划分。优先测试那些关键和重要的功能,确保它们的质量和稳定性。
- 自动化测试:如果项目中还没有实现自动化测试,那么可以考虑引入自动化测试工具来加快测试速度。自动化测试可以重复执行相同的测试用例,提高测试效率,并减少人为错误。
- 减少测试范围:如果时间确实非常紧张,我们可以考虑减少测试范围,只测试那些最关键的部分。当然,这样做会增加风险,所以需要在风险和时间之间做出权衡。
- 增加测试资源:如果条件允许的话,可以尝试增加测试人员或者延长测试时间。这样可以分担测试任务,加快测试进度。
- 与项目团队沟通:与项目团队成员保持密切的沟通,了解项目的整体进度和可能的风险。如果测试时间确实无法满足需求,可以向团队提出这个问题,并一起讨论解决方案。
- 使用合适的测试方法和工具:选择合适的测试方法和工具,以提高测试效率。比如,使用等价类划分、边界值分析等方法来减少测试用例的数量,同时保证测试的覆盖率。
- 快速反馈与调整:在测试过程中,要及时记录并反馈发现的问题,与开发团队紧密合作,快速修复问题。同时,根据测试进展和反馈,不断调整测试策略,确保测试工作的高效进行。
[问题9] 产品经理不合理的需求
1、明确指出问题:每一项需求都要经得住推敲。产品经理难免会出现思考不充分或存在疏漏的情况,这个时候,程序员要直接明确地指出存在的问题,敦促产品经理重新进行梳理。
2、强化职场沟通的能力
3、引入外援,一起讨论
4、寻求 leader 的支持
5、熟悉产品经理的特点
7、决定要做的,也要想出切实可行的办法
[问题10] 三个词形容自己
如果只用三个词的话,我觉得会是“规划意识”,“落地执行”和“复盘总结”。
首先呢,就我个人的产品工作方法来讲,我对规划意识比较强。
正所谓,凡事预则立,不预则废,好的工作规划对于产品落地和快速上线都至关重要,我在工作中形成了规划管理的习惯,希望通过科学规划和清单思维对后续的测试工作形成有效指导。
其次,我觉得是“落地执行”,正所谓产品工作要从“大处着眼、小处着手”,不仅要有科学合理的规划,还要有落地能力。
最后,我觉得是“复盘总结”,产品工作错综复杂,出现问题很正常,关键是要有解决问题的意识和能力,那这就要求要学会复盘总结,将工作经验逐渐转化为知识体系,只有养成复盘总结的习惯,才能从失败走向成功,从一个成功走向另一个成功。
[问题11] 测试工程师的职责
1、测试经理
- 制定测试计划
- 确保测试过程正常进行。
2、测试工程师
- 编写测试用例
- 搭建测试环境
- 执行测试
[问题12] 软件测试的对象
软件测试并不等于程序测试。软件测试应贯穿于软件定义与开发的整个期间。
需求分析、概要设计、详细设计以及程序编码等各阶段所得到的文档,包括需求规格说明、概要设计规格说明、详细设计规格说明以及源程序,都应成为软件测试的对象
[问题13] 测试结束的标准是什么
- 用例全部执行。2.覆盖率达到标准。3.缺陷率达到标准。4.其他指标达到质量标准
[问题14] 测试人员需要何时参加需求分析?
越早越好:如果条件循序 原则上来说 是越早介入需求分析越好 因为测试人员对需求理解越深刻 对测试工作的开展越有利 可以尽早的确定测试思路 减少与开发人员的交互 减少对需求理解上的偏差
[问题15] 比较负载测试、压力测试,容量测试和强度测试区别
性能测试:负载测试、强度测试、数据库容量测试、基准测试等
- 负载测试:在一定的工作负荷下,系统的负荷及响应时间。通过逐步增加系统负载,最终确定在满足性能指标的情况下,系统能承受的最大负载量的测试。
- 压力测试:通过逐步增加系统负载,最终确定在什么负载条件下系统性能将处于崩溃状态,以此获得系统能提供的最大服务级别的测试。
- 强度测试:又称疲劳强度测试,在系统稳定运行的情况下能够支持的最大并发用户数,持续执行一段时间业务,通过综合分析,确定系统处理最大工作量强度性能的过程。一定负荷条件下,在较长时间 跨度内的系统连续运行给系统性能所造成的影响。疲劳强度测试可以反映出系统的性能问题,例如内存泄漏等
- 容量测试:容量测试目的是通过测试预先分析出反映软件系统应用特征的某项指标的极限值(如最大 并发用户数、数据库记录数等),系统在其极限值状态下没有出现任何软件故障或还能保持主要功能正常运行。
[问题16] 你觉得对于测试有哪些基本素质要求
(1) 细心,只有细心才能保证不遗漏测试点并及时发现问题。
(2) 善于怀疑,在测试的过程中总会遇到开发会说这个功能肯定没有问题,这个时候就要小心开 发给你埋下的坑了。
(3) 要有追根究底的精神,我们有的时候发现一些不好复现的 bug,对于这样的 bug 一定要有不找出问题不罢休的精神。
(4) 考虑问题要周到,需要测试结合需求业务流程,和不同手机的兼容等多个方面来考虑问题。
(5) 要有良好的沟通能力,不要让开发说服你这个问题修补修改,如果你认为这个问题比较严重 需要说服开发来修改他/她认为不用修改的问题。
[问题17] 软件测试和软件开发之间有什么关系
开发和测试是一个有机的整体!在产品的发布之前,开发和测试是循环进行的, 测出的缺陷要经开发人员修改后继续测试。在开发的同时测试经理开始编写测试用例,测试文档要参考开发文档,所以开发和测试是不可分割的,少了任何一个都不能开发出产品。
从角色方面看,像理论和实验的关系,开发人员通过自己的想象创造出一套思想,之后测试人员再对它进行检验、证伪,开发人员再修改的过程从而不断丰富产品。从方法方面看,是演绎和归纳的关系,一个要掌握大量的技术,一个要不断的从实例中学习。因这两方面的不同,所以开发和测试看上去做的工作很不一样。
开发与测试是相辅相承、密不可分的,开发人员开发出新的产品后要通过测试判断产品是否完全满足用户的需求。如果发现缺陷,提交给开发人员进行修复,然后再转交测试人员进行回归测试,直到产品符合需求规格说明。一个符合用户需求的产品是开发和测试共同努力的成果。
[问题18] 性能测试与功能测试的关系和区别
焦点不一样
- 功能测试:验证软件系统操作功能是否符合产品功能需求规格,主要焦点在功能(正向、逆向);
- 性能测试:验证软件系统是否满足业务需求场景,主要焦点是业务场景的满足(时间、资源);
关系
- 功能测试和性能测试是相辅相成的,对于一款优秀的软件产品来讲,它们是不可减少的2个重要测试环节;
- 注意:一般新项目中,先功能测试通过后,再进行性能测试。
[问题19] 什么是系统瓶颈
瓶颈主要是指整个软硬件构成的软件系统某一方面或者几个方面能力不能满足用户的特定业务要求, “特定”是指瓶颈会在某些条件下会出现,因为毕竟大多数系统在投入前。 严格的从技术角度讲,所有的系统都会有瓶颈,因为大多数系统的资源配置不是协调的,例如 CPU 使用率刚好达到 100%时,内存也正好耗尽的系统不是很多见。因此我们讨论系统瓶颈要从应用的角度讨论:关键是看系统能否满足用户需求。在用户极限使用系统的情况下,系统的响应仍然正常,我们可以认为该系统没有瓶颈或者瓶颈不会影响用户工作。 因此我们测试系统瓶颈主要是实现下面两个目的:
发现“表面”的瓶颈。主要是模拟用户的操作,找出用户极限使用系统时的瓶颈,然后解决瓶颈, 这是性能测试的基本目标。
发现潜在的瓶颈并解决,保证系统的长期稳定性。主要是考虑用户在将来扩展系统或者业务发生变化时,系统能够适应变化。满足用户目前需求的系统不是最好的,我们设计系统的目标是在保证系统整个软件生命周期能够不断适应用户的变化,或者通过简单扩展系统就可以适应新的变化。
[问题20] 冒烟测试和回归测试
冒烟测试:版本验证测试,主要确认新的版本是否存在致命性bug,冒烟测试最大的优点在于节约测试的时间成本,减少测试轮数。冒烟测试就是在每日build(构建版本)建立后,对系统的基本功能进行简单的测试。这种测试强调程序的主要功能进行的验证,而不会对具体功能进行更深入的测试。
回归测试:是软件维护阶段对软件修改后进行的测试,指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。
[问题21] 说一下测试用例
- 测试用例的内容:用例编号、用例标题、所属项目模块、优先级、前置条件、测试步骤、测试数据、预期结果和实际结果
- 测试用例编写规则:一般是根据产品需求来定的,比如一个注册功能,产品需求上需要验证哪些,用户名, 密码,邮箱,等等有什么要求,根据这个产品效果图或者产品需求来定测试用例怎么去编写。当然还要考 虑到普通用户使用软件的习惯,以及一些特殊情况和极端情况。
- 编写测试常用的方法:一般有这么常用的几种,有等价类划分法, 就是一类信息,我们在测试的时候, 只测试一种,没有必要所有的都进行测试。还有像边界值法,一般注册登录的时候,或者涉及到数学测试的时候会用到。项目中就用到了边界值测试法,比如需要上传学生成绩信息,做数据分析,学生成绩的测试用例,就牵扯到边界值法。还有一些场景法,设定不同的场景,不同场景就会有不同的操作。 嗯,这是写测试用例时我们常用到的测试方法。
- 需求理解:深入理解业务需求,确保每个功能点、业务规则和场景都被充分理解。与产品、开发等团队成员密切沟通,确保对需求的准确理解。
- 场景覆盖:覆盖正常业务流程和异常情况,特别是边缘和极端情况。考虑到不同用户、不同设备和不同网络环境下的使用情况。
- 逻辑验证:验证功能的内部逻辑,包括数据处理、状态转换等。确保逻辑的正确性和健壮性,防止因逻辑错误导致的功能缺陷。
- 异常处理:验证系统对异常输入、错误操作等异常情况的处理能力。确保系统能够给出明确的错误提示,并避免程序崩溃或数据丢失。
- 功能覆盖:确保所有功能点都被测试到,无遗漏。制定详细的测试计划,按照功能模块进行划分和测试。
- 兼容性测试:在不同的操作系统、浏览器和设备上进行测试,确保功能的兼容性。考虑不同版本的兼容性问题,避免因为版本差异导致的问题。
- 性能测试:对系统进行压力测试、负载测试等,确保在高并发、大数据量等场景下系统的稳定性和性能。验证系统的响应时间、吞吐量等指标是否符合预期。
- 安全测试:验证系统的安全性,包括用户认证、数据加密、防止SQL注入等。确保系统能够抵御常见的安全攻击和威胁。
- UI/UX测试:验证界面的布局、样式和交互是否符合设计要求。确保用户体验的流畅性和舒适性。
[问题22] postman和jemeter的作用和区别
Postman和JMeter都是用于软件开发的测试工具,但它们的用途和功能略有不同。
Postman是一个接口测试工具,它主要模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获取对应的响应结果,从而验证响应中的结果数据是否和预期值相匹配。这有助于开发人员及时发现并处理接口中的bug,确保产品上线后的稳定性和安全性。其界面分为左边的侧边栏和右边的请求构建器,允许用户快速创建几乎任何类型的请求,并设置HTTP请求的URL、Method、Headers、Body等部分。
JMeter则是Apache组织基于Java开发的压力测试工具,主要用于对软件进行性能测试。它可以模拟大量的用户同时访问一个应用程序、网络、Web服务、数据库或其他服务器,以评估这些系统在负载情况下的性能和稳定性。此外,JMeter还支持多种协议,包括HTTP、FTP、JDBC、SOAP、JMS和SMTP等,能测试各种应用程序的性能和功能。同时,JMeter提供了强大的分析和报告工具,有助于测试人员和开发人员找到性能问题的根本原因。
[问题23] 如何保证测试用例的深度和广度
一、深度保证
二、广度保证
[问题24] 浏览器输入http到响应的整个过程
1. 用户输入 URL
- 用户操作: 用户在浏览器地址栏中输入 URL(例如 http://www.example.com)并按下 Enter 键。
- URL 解析: 浏览器解析 URL,提取协议(http)、域名(www.example.com)、路径(如 /index.html),以及可选的查询字符串和片段标识符。
2. DNS 解析
- DNS 查询: 浏览器需要将域名转换为 IP 地址。它会查询 DNS 服务器以获取对应的 IP 地址。
- DNS 缓存: 浏览器、操作系统和网络设备通常会缓存 DNS 记录,以提高解析速度。
3. 建立 TCP 连接
- TCP 三次握手: 浏览器与目标服务器之间建立 TCP 连接。SYN: 浏览器发送一个 SYN(同步)包到服务器,表示开始连接。SYN-ACK: 服务器回应一个 SYN-ACK(同步-确认)包,确认收到连接请求。ACK: 浏览器发送一个 ACK(确认)包,完成握手。
4. 发送 HTTP 请求
- 请求构造: 浏览器构造 HTTP 请求报文,包括请求方法(如 GET、POST)、请求路径、HTTP 版本、请求头(如 User-Agent、Accept)和可选的请求体(如 POST 数据)。
- 请求发送: 浏览器通过已建立的 TCP 连接将请求报文发送到服务器。
5. 服务器处理请求
- 请求接收: 服务器接收并解析 HTTP 请求。
- 请求处理: 服务器处理请求,根据请求的路径和方法执行相应的操作(如读取文件、查询数据库)。
- 生成响应: 服务器构造 HTTP 响应报文,包括响应状态码(如 200 OK)、响应头(如 Content-Type)和响应体(如 HTML 内容)。
6. 接收和渲染响应
- 响应接收: 浏览器接收 HTTP 响应报文。
- 响应解析: 浏览器解析响应头,识别响应体的内容类型。
- 渲染内容:HTML 解析: 浏览器解析 HTML 内容,并构建 DOM(文档对象模型)树。CSS 解析: 解析 CSS 样式表,构建 CSSOM(CSS 对象模型)树。JavaScript 执行: 执行 JavaScript 代码,可能会修改 DOM 和 CSSOM。布局和绘制: 浏览器计算页面的布局,绘制页面内容到屏幕上。
7. 关闭 TCP 连接
- 持久连接(Keep-Alive): 如果使用持久连接,TCP 连接会保持打开,以便将来可以重用。
- 连接关闭: 如果不使用持久连接,服务器会发送一个 TCP 连接关闭的信号,浏览器关闭连接。
8. 缓存和后续请求
- 缓存: 浏览器可能会缓存响应内容(如 HTML、CSS、JavaScript 文件)以提高后续请求的速度。
- 后续请求: 如果页面中包含其他资源(如图片、样式表、脚本),浏览器会重复上述步骤发送额外的 HTTP 请求来获取这些资源。