- 1. 测试工程师
- 2. 其他基础
测试工程师
什么是软件测试?
从广义上说,软件测试是软件生命周期中的所有检查、评审和确认工作,包括在分析、设计阶段,以及完成开发后确认阶段的各类文档、代码的审查和确认。
从狭义上说,是识别软件缺陷的过程
什么是软件测试工程师?
软件测试工程师(Software Testing Engineer):指理解产品的功能要求,并对其进行测试,检查软件有没有缺陷(Bug),测试软件是否具有稳定性(Robustness)、安全性、易操作性等性能,写出相应的测试规范和测试用例的专门工作人员。
软件测试的目标?
最终目标是确保软件功能符合用户需求,在产品发布或交付前尽可能多的发现并改正缺陷。
软件测试的原则?
- Good-enough原则。一种权衡投入/产出比的原则。
- 保证测试的覆盖度,但穷举测试是不可能的。
- 所有测试都应追溯到用户需求。
- 越早测试越好,测试过程与开发过程应是相互结合的。
- 测试的规模由小到大,从单元测试到系统测试。
- 为了尽可能的发现错误,应由独立的第三方进行测试。
- 不能为了便于测试擅自修改程序。
- 既应该测试软件应该做什么,也应该测试软件不应该做什么。
- 测试只是展示缺陷。测试只能表明有缺陷存在,但不能证明没有缺陷,测试能降低未发现缺陷留存的概率,却不能证明软件是绝对正确的。
- 穷尽测试是不可能的。测试所有的输入和条件组合是不可能的,可以取而代之的是基于风险和优先级的测试。
- 缺陷簇生。要对缺陷发生率高的模块投入更多的测试。少量的模块往往隐藏了大部分的缺陷。缺陷发生率高的模块往往与需求不清、设计不当、编码复杂度高等内在原因关联,所以从风险的角度来看必然较高。
- 杀虫剂悖论。相同的测试再重复多次后就无法再找到缺陷了。测试用例要不断评审修改,不断添加新的和不同的测试,就有可能找到更多缺陷。
- 测试是上下文关联的。测试在不同上下文环境中的执行是不同的。
- 无错谬论。即使修改了系统中存在的大部分缺陷,但若系统本身背离了用户需求,那么发现和修复缺陷就毫无帮助了。
杀虫剂悖论,在软件测试中用来描述这样一种现象,对软件进行越多的测试,那么该软件对软件测试人员的测试就越具有免疫力。
为了克服“杀虫剂悖论”,测试用例需要经常的评审和修改,不断增加新的不同的测试用例来测试软件或系统的不同部分,保证测试用例永远是最新的,即包含着最后一次程序代码或说明文档的更新信息。这样软件中未被测试过的部分或者先前没有被使用过的输入组合就会重新执行,从而发现更多的缺陷。软件测试人员必须不断地编写新的不同的测试来检验程序的不同部分从而找出更多的bug。让其他的人来测试你的程序将有助于打破”杀虫剂悖论”。
相同的测试人员测试同一个模块(功能),因长时间测试,形成了思维定式,因此也容易产生懈怠,忽视一些缺陷的存在,也容易导致杀虫剂悖论。解决办法就是采用交叉测试,不同的测试人员,有不同的测试思路和技巧,容易发现被忽视的缺陷。
软件测试的基本流程?
需求分析、测试计划、测试设计、测试开发、测试执行、测试评估。
- 需求分析
- 阅读需求,理解需求,主要就是对业务的学习,分析需求点,参与需求评审会议
- 测试计划
- 主要任务就是编写测试计划,参考软件需求规格说明书,项目总体计划,内容包括测试范围(来自需求文档),进度安排,人力物力的分配,整体测试策略的制定。风险评估与规避措施有一个制定。
- 测试设计
- 主要是编写测试用例,会参考需求文档(原型图),概要设计,详细设计等文档,用例编写完成之后会进行评审。
- 测试执行
- 搭建环境,执行测试,bug管理直到测试结束
- 测试评估
- 出测试报告,确认是否可以上线
软件测试的度量?
- 测试覆盖率:有多少需求、代码已经被测试了。
- 缺陷发现率:缺陷是何时被发现,且有多少缺陷已经被发现,缺陷可以根据严重性来分类,需要记录的数据有:缺陷数量、缺陷的严重等级等。
- 测试成功率:有多少测试用例已经通过,且有多少运行正常的,需要记录的数据有:通过的测试用例数、未通过的测试用例数、已执行的测试用例数等。
多少测试才足够?
取决于风险程度(商业风险和技术风险)和项目约束条件(时间和经费)。
调试和测试的区别?
- 调试 for 开发人员发现缺陷原因,修复代码并确认缺陷已经被修复;
- 测试 for 测试人员识别缺陷。
什么是缺陷发现率(DDP)?
DDP=Bugs(tester)/(Bugs(tester)+Bugs(customer))
测试人员发现的bug/(测试人员发现的bug+用户发现的bug)
什么是单元测试?
- 定义:又称模块测试,是针对软件设计的最小单位程序模块进行正确性检查的测试工作;可以从程序的内部结构出发设计测试用例,多个模块测试可以平行地独立进行测试。
- 目的:发现模块内部可能存在的各种差错。
- 内容:
- 模块接口测试(数据的流入流出)
- 局部数据结构测试
- 路径测试
- 错误处理测试
- 边界测试。
步骤:
- 利用设计文档设计测试用例;
- 创建被测试模块的桩模块或驱动模块;
- 利用被测试模块、驱动模块和桩模块来建立测试环境,进行测试。
什么是集成测试?
- 定义:又称组装测试或联合测试,在单元测试基础上,将所有模块按概要设计和详细设计进行组装。
- 目的:发现模块连接中的接口可能存在的各种差错。
- 内容:
- 穿越模块之间的数据是否会丢失;
- 一个模块组装后是否会对另一个模块或其他模块存在影响;
- 各个子功能组装在一起是否会达到预期的父功能;
- 全局数据结构是否有问题。
组装方法:一次性组装、增殖式组装。
完成标志:
- 成功地执行了测试计划中规定的所有测试用例;
- 修正了所发现的错误;
- 测试结果通过专门小组的评审。
什么是系统测试?
- 目的:验证和确认系统是否达到其原始目标,而对集成的硬件和软件系统进行的测试。
- 测试内容:在真实或模拟系统运行环境下,检查完整的程序系统能否和系统(硬件、网络、软件)正确配置、连接,满足用户需求。
什么是静态测试?
又称为静态分析技术,不执行被测试软件,对需求分析说明书、软件设计说明书、源程序做结构检测、流图分析、符号执行等找出软件的错误。
什么是动态测试?
通过输入一组预先按照一定的测试准则构造的实例数据动态运行程序,而达到发现程序错误的过程。
什么是自动化测试?
自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。
测试的分类
白盒测试
定义
白盒测试也称为结构测试或逻辑驱动测试,是针对被测单元内部是如何进行工作的测试。它根据程序的控制结构设计测试用例,主要用于软件或程序验证。这种方法是把测试对象看做一个打开的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择 测试用例,对程序所有逻辑路径进行测试。
内容
- 对程序模块的所有独立的执行路径至少测试一遍。
- 对所有的逻辑判定,取“真”与取“假”的两种情况都能至少测一遍。
- 在循环的边界和运行的界限内执行循环体。
- 测试内部数据结构的有效性
方法
- 代码检查法
- 逻辑覆盖法(语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖)
- 基本路径测试法
- 静态结构分析法
- 静态质量度量法
- 符号测试
黑盒测试
定义
软件的黑盒测试意味着测试要在软件的接口处进行。这种方法是把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书
,检查程序的功能是否符合它的功能说明。
内容
- 是否有不正确或遗漏的功能?
- 在接口上,输入是否能正确的接受?能否输出正确的结果?
- 是否有数据结构错误或外部信息(例如数据文件)访问错误?
- 性能上是否能够满足要求?
- 是否有初始化或终止性错误?
方法
- 等价类划分(等价类是指某个输入域的集合,它表示对揭露程序中的错误来说,集合中的每个输入条件是等效的)
- 边值分析法:列出单元功能、输入、状态及控制的合法边界值,设计测试用例,包含全部边界值的方法。
- 因果图
- 判定表法
- 场景法
- 错误推测法
- 正交实验法
灰盒测试
灰盒测试,是介于白盒测试与黑盒测试之间的,可以这样理解,灰盒测试关注输出对于输入的正确性,同时也关注内部表现,但这种关注不象白盒那样详细、完整,只是通过一些表征性的现象、事件、标志来判断内部的运行状态,有时候输出是正确的,但内部其实已经错误了,这种情况非常多,如果每次都通过白盒测试来操作, 效率会很低,因此需要采取这样的一种灰盒的方法。
白盒测试中的逻辑覆盖法介绍
六种覆盖标准:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖发现错误的能力呈由弱至强的变化。语句覆盖每条语句至少执行一次。 判定覆盖每个判定的每个分支至少执行一次。条件覆盖每个判定的每个条件应取到各种可能的值。判定/条件覆盖同时满足判定覆盖条件覆盖。条件组合覆盖每个判定中各条件的每一种组合至少出现一次。路径覆盖使程序中每一条可能的路径至少执行一次。
语句覆盖
语句覆盖就是设计若干个测试用例,运行所测试用例,使得程序里的每条可执行的语句都要至少执行一次,但这种覆盖对检测错误而言并不是完美无缺的,它有时候也不能发现有些错误。
测试用例虽然做到了语句覆盖,但有时候可能发现不了判断中逻辑运算中出现的错误,语句覆盖是最弱的逻辑覆盖
判定覆盖
每个判断的真假分支至少执行一次,就是真要至少取一次,假要至少取一次。
条件覆盖
和判定覆盖思路一样,只是把重点从判定移动到条件上来了,每个判定中的每个条件可能至少满足一次,也就是每个条件至少要取一次真的,再取一次假的。同样它也会遗漏许多路径,条件取真假并不能满足判定也取到真假两次。
判定-条件覆盖
要求判断中的每个条件所有可能至少出现一次,并且每个判定本身的判定结果也要出现一次。判定取真假就覆盖了判定,可是条件取真假两次并不能完全覆盖,因为条件之间还有组合。所以才有了条件组合覆盖
条件组合覆盖
每个判定中条件的各种可能组合至少满足一次。条件各种可能都出现了,必然把判定给覆盖了,它覆盖了上面的4个
路径覆盖
把所有可能路径至少都走一遍,最高阶覆盖
黑盒测试方法介绍
等价类划分法
适用场景:
有数据输入的地方,就可以使用等价类划分法。如:输入框
测试思想:
从大量数据中划分范围(等价类),然后从每个范围中挑选代表数据,这些代表数据要能反应这个范围内数据的测试结果。
- 有效等价类:对程序来说,有意义的、合理的数据(正确的、有效的数据)
- 无效等价类:对程序来说,没有意义、不合理的数据(错误的、无效的数据)
例子: 手机号输入框
无效等价类:汉字、表情、符号、空格等
有效等价类:数字
边界值分析法
根据经验法则,大量的错误是发生在输入或输出范围的边界上的,而不是发生在输入输出范围的内部。因此针对各种边界情况涉及测试用例,可以查出更多的错误。而使用边界值的分析方法涉及测试用例,首先应确定边界情况。通常输入和输出等价类的边界,应当选取正好等于,刚刚大于或者刚刚小于边界的值作为测试数据
适用场景:有数据输入的地方,在实际工作中,一般和等价类划分一起使用
测试思想:边界值是程序员在编程时是最容易出错的位置
因果图法
适用场景:
在一个界面中有多个控件,如果控件之间存在组合关系或者限制关系,不同的控件组合会产生不同的输出结果,为了弄清楚不同的输入组合会产生怎样的输出结果,可以使用因果图或判定表。
概念:
- 因:输入条件
- 果:输出结果
思想:就是通过画图的方式表达输入条件和输出结果之间的关系
测试步骤:
- 找出所有的输入条件
- 找出所有的输出结果
- 分析,列出输入条件之间所有的组合和限制条件
- 确定每组输入条件的组合会产生怎样的输出结果,画因果图,填写判定表
- 编写测试用例 每一列代表一种组合,编写一条测试用例
因果图/判定表的特点:
- 输入条件的排列顺序无关紧要
- 输出结果的排列顺序无关紧要
- 每种组合是独立的
- 先测哪种组合后测哪种组合无关紧要
判定表格式如下:
场景法
适用场景:
业务比较复杂的软件系统都适合使用场景法,场景法是基于软件业务的测试方法,测试人员把自己当成最终用户,尽可能真实的模拟用户在使用此软件的操作情形
重点模拟两类操作:
- 用户正确操作的业务过程--验证软件的业务功能是否正确实现
- 模拟用户错误操作的情形--验证软件的异常处理能力(健壮性)
测试思路:
场景法是模拟用户操作软件时的各种情景,主要用于测试软件的业务逻辑和流程。当拿到一个测试任务是,我们并不先关注某个文本框的等价类等是否满足要求,而是先关注它的主要功能和业务流程是否正确实现,这就需要场景法来完成测试。当业务流程测试没有问题,也就是软件的主要功能没有问题时,我们再去关注控件的等价类、边界值等细节测试。(先整体后细节)
场景划分
- 基本流(有效流、正确流): 模拟用户正确的业务操作流程就是基本流
- 备选流(无效流、错误流): 模拟用户错误的操作流程就是备选流
错误推测法
错误推测法是基于经验和直觉推测程序中所有可能存在的各种错误, 从而有针对性的设计测试用例的方法。
正交排列法
适用场合
在一个界面中有多个控件,每个控件有多个取值,要考虑不同控件不同取值之间的组合 ,且组合数量较大的话,我们就可以使用正交排列法。
思想
使用最少的抽样数据达到最广的,覆盖率最高的统计结果。
正交表公式如下
- L:line 行
- n:表示正交表有几行,需要测试的组合的个数。n值是固定的,一旦正交表确定n值就是固定的,不需要测试人员自己计算。
- m:表示正交表中允许出现的最大值,根据每个控件的取值个数来确定m值
- k:表示正交表有几列
未完待续
https://blog.csdn.net/weixin_30363263/article/details/80110247?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.add_param_isCf&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.add_param_isCf
其他基础
一、网络部分
1、Web页面响应过慢怎么定位问题:从一个浏览器输入url到形成页面经历了什么? 答案参考:https://github.com/ljianshu/Blog/issues/24
2、“三次握手,四次挥手”? 答案参考:https://www.cnblogs.com/qcrao-2018/p/10182185.html
3、HTTP常见面试题 参考答案:https://github.com/ZhongFuCheng3y/3
4、HTTP缓存机制及原理 参考答案:http://www.cnblogs.com/chenqf/p/6386163.html
5、GET和POST的区别? 参考答案:https://segmentfault.com/a/1190000018129846
二、算法与数据结构
面试中需要掌握的8中数据结构 参考答案:https://mp.weixin.qq.com/s/MM6q9-IO0eQtbEQ_D-mLAQ
1、链表算法面试问题。 参考答案:https://mp.weixin.qq.com/s/Kxcld56hjEukti0PwHOKSQ
2、树相关 1)什么是2-3树? 参考答案:https://mp.weixin.qq.com/s/b_J-Sw9mJ0p-c4t3ey81Xw
2)什么是红黑树? 参考答案:https://www.jianshu.com/u/1d933ff900e7
3)为什么MySQL数据库要用B+树存储索引? 参考答案:https://mp.weixin.qq.com/s/9oAc5QgJ7kub2-HISTnW6A
4)AVL树 参考答案:https://www.61mon.com/index.php/archives/218/
3、十大经典排序算法。 参考答案:https://mp.weixin.qq.com/s/mq2NSG3xMqIs28nU354TjQ
4、什么是堆排序? 参考答案:https://mp.weixin.qq.com/s/KJldeFePHSTLUaxIj9Czpg
5、栈和队列手写 参考答案:https://mp.weixin.qq.com/s/6CacG5kDmKimTMYpZdSEEA
6、什么是散列表? 参考答案:https://mp.weixin.qq.com/s/Zks_Du7Qr2T5iDlT61gEXg
7、什么是哈希表? 参考答案: https://mp.weixin.qq.com/s/1o8TZlyuikaE0mbtqQjg4A
8、程序员面试最常见问题TOP 48 参考答案:https://hackernoon.com/50-data-structure-and-algorithms-interview-questions-for-programmers-b4b1ac61f5b0
三、数据库
1、Redis面试必问题目 参考答案:(1)https://mp.weixin.qq.com/s/XJzu8yyVYZYmcOui_xXnvw (2)https://mp.weixin.qq.com/s/HeHvINDdXiPjgkE8TYdNYQ
2、MySQL面试必问题目 参考答案:https://mp.weixin.qq.com/s/Hj67Ll1jXarGedBQxr2ecw
四、Linux常用命令 参考答案:http://blog.csdn.net/qwe6112071/article/details/50806734
五、测试部分 参考链接:https://www.cnblogs.com/czhang2-12/p/9649835.html