- 熟悉软件测试的流程,掌握常用的编写测试用例的方法,如等价类、边界值、因果图、场景法等;
软件测试的流程:需求分析,测试计划,测试设计,测试开发,测试执行,测试评估。
软件开发的生命周期: 需求分析、计划、设计、编码、测试、运行维护。
等价类:依据需求将输入(特殊情况下会考虑输出)划分为若干个等价类,从等价类中选出一个测试用例,如果这个测试用例测试通过,则认为所代表的等价类测试通过,这样就可以用较少的测试用例达到尽量多的功能覆盖,解决了不能穷举测试的问题。
有效等价类:对于程序的规格说明书是合理的、有意义的输入数据构成的集合,利用有效等价类验证程序是否实现了规格说明中所规定的功能和性能。
无效等价类:根据需求说明书,不满足需求的集合。
边界值:对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充,这种情况下,其测试用例来自等价类的边界。
因果图:是一种简化了的逻辑图,能直观地表明程序输入条件(原因)和输出动作(结果)之间的相互关系。
适用场景:被测试程序具有多种输入条件、程序的输出又依赖于输入条件的各种情况。
因果图法设计测试用例的步骤如下:
(1)分析所有可能的输入和可能的输出。
(2)找出输入与输出之间的对应关系。
(3)画出因果图。
(4)把因果图转换成判定表。
(5)把判定表对应到每一个测试用例。
正交法:研究多因素多水平的一种设计方法,原理是根据正交性,选出输入的最优的组合进行测试,分析这些测试的结果,以分析整个实验的结果。
因素:测试中需要考察的变量(变量);因素数:变量的个数;
水平:一个变量的取值;水平数(T):变量的取值(每个变量的水平数一般不同);
例如:注册功能,姓名、邮箱、密码、确认密码、验证码(均为必填项,这里只考虑填与不填),则共有2^5=32种可能出现的结果,因素有姓名、邮箱、密码、确认密码、验证码,因素数为5,水平为填、不填,水平数为2(这里较为特殊,每个变量的水平数相同)
因素数是正交表列的个数(C)。
正交表L=N(CT),其中N为正交表的行数。
当每个变量的水平数相等时,N=(水平数-1)*因素数+1。
正交表的两条性质:
a. 每一列中各数字出现的次数都一样多。
b. 任何两列所构成的各有序数对出现的次数都一样多
如何根据正交法设计测试用例(步骤):
1,找出因素,因素数,水平,水平数
2,根据因素数和水平数选择一个合适的正交表
3,根据正交表的性质填写正交表
4,根据完成的正交表设计测试用例,每一行为一个测试用例
5,补充认为可能的测试用例
场景法:把各个孤立的功能点串起来想成一个业务场景进行测试,分为基本事件流和备选事件流。
这里以ATM机银行卡取款为例:插卡-输入密码-输入金额-取钱-退卡。
基本流程:插卡成功,密码输入成功,输入金额小于银行卡余额,出钞成功,退卡。
备选流程:
1,插卡失败(卡芯片损坏,卡识别不出来);
2,连续三次密码输入失败,账户锁定;
3,前两次输入密码失败,最后一次输入成功,输入金额小于银行卡余额,出钞成功,退卡;
4,银行卡没有激活;
5,输入金额大于银行卡余额,再次输入金额小于银行卡余额,出钞成功,退卡;
6,ATM余额不足;
7,操作等待时间太长,ATM吞卡;
8,身份证信息过期;
9,网络异常;
10,输入的金额不是100的整数倍,或超过5万;
…
错误猜测法:错误猜测法是经验丰富的测试人员喜欢使用的一种测试方法。
基于经验和直觉,找出程序中认为可能出现的错误,有针对性地设计测试用例。经验可能来自于在对某项业务的测试较多,也可以来自于售后用户的反馈意见,或者从故障管理库中整理bug。梳理出产品以往哪些地方容易出现问题,问题越多的地方,潜在的bug也就越多。 - 了解白盒测试和黑盒测试技术,了解软件测试的V模型和W模型以及敏捷开发的流程;
(1)黑盒测试
黑盒测试也称功能测试,测试中把被测的软件当成一个黑盒子,不关心盒子的内部结构是什么,只关心软件的输入数据与输出数据。
测试方法:等价类,边界值,因果图,正交法,场景设计法,错误分析法。
(2)白盒测试
白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒指的打开盒子,去研究里面的源代码和程序结果,关心程序内部逻辑结构和源代码。Java的白盒测试框架是Junit。
白盒测试方法:
1,语句覆盖法;
2,逻辑覆盖法:判定法,条件法,判定和判定组合,条件和条件组合,判定和条件组合;
3,循环覆盖法:for,while;
4,路径覆盖法:switch,try,catch;
(3)灰盒测试
介于白盒测试与黑盒测试之间,多用于集成测试阶段,不仅关注输出、输入的正确性,同时也关注程序内部的情况。
(1)V模型
优点:后期的测试阶段和前期的阶段可以一一对应起来,清楚的标注每一个测试阶段的依据。
缺点:仅仅把测试作为在编码之后的一个阶段,未在需求阶段就进入测试。
(2)W模型(双V模型)
特点:测试的对象不仅是程序,需求、设计等同样要测试,测试与开发是同步进行的。
优点:测试介入早,有利于尽早的全面的发现问题。
缺点:阶段性比较强,上一阶段完全结束,才可正式开始下一个阶段工作。无法支持敏捷开发模式。
(4)敏捷开发:
敏捷开发有很多种方式,其中scrum是比较流行的一种。
scrum里面的角色:
PO:product owner,产品经理,负责把用户需求转换成user story;
SM:scrum master,项目经理,负责召开各种会议,协调项目,为研发团队服务;
ST:scrum team,研发团队,交付一个高质量可用的产品;
scrum的基本流程:
产品负责人负责整理user story,形成左侧的product backlog。
发布计划会议:product owner负责讲解user story,对其进行估算和排序,发布计划会议的产出就是制定出这一期迭代要完成的story列表,sprint backlog。
迭代计划会议:项目团队对每一个story进行任务分解,分解的标准是完成该story的所有任务,每个任务都有明确的负责人,并完成工时的初估计。
每日例会:每天scrum master召集站立会议,团队成员回答昨天做了什么,今天计划做什么,有什么问题。
演示会议:迭代结束之后,召开演示会议,相关人员都受邀参加,团队负责向大家展示本次迭代取得的成果。期间大家的反馈记录下来,由po整理,形成新的story。
回顾会议:项目团队对本期迭代进行总结,发现不足,制定改进计划,下一次迭代继续改进,已达到持续改进的效果。
敏捷/scrum的特点:轻文档,轻流程,重目标,重产出
轻量级:迭代周期短(1-4周),参与人员少(5-9人) - 会使用Junit框架进行单元测试,了解项目管理工具禅道,性能测试工具Loadrunner;
单元测试的步骤
1,在maven项目的.pom文件中引入junit依赖(建议不要手动输入,从maven仓库中下载,地址:https://mvnrepository.com/);
2,下载junit、JunitGenerator插件(IDEA中setting->pluging);
3,修改Other settings里面的Junit4文件去掉方法名前的test;
4,创建测试用例类(选中要被测试的类名,按Ctrl+shift+T);
禅道是国产的开源项目管理软件,专注研发项目管理,内置需求管理、任务管理、bug管理、缺陷管理、用例管理、计划发布等功能,实现了软件的完整生命周期管理。
性能测试的分类:
1、 基准测试
有基础的标准,这样能通过对比发现系统的不同点与变化。
2、负载测试 15min
负载测试是在被测系统上不断增加压力,直到各项指标达到饱和,例如“响应时间”超过预定指标或者某种资源使用已经达到饱和状态。这种测试方法可以找到系统的处理极限,为系统调优提供数据。
并发测试:在一定的软硬件环境下,系统的其他指标不变,测试系统在不同的用户数量级别下,系统性能的表现。
容量测试:在一定的软硬件环境下,系统的其他指标不变,测试系统数据库在不同的数据量级别下,系统性能的表现。
3/5/8原则:等待3秒用户认为最佳,5秒就有些用户不耐烦了,8秒大部分用户不满意。
3、压力测试 15min
测试时实际负载要高于系统的最高负载,查看系统各项指标和系统整体的表现情况。
4、配置测试
测试系统在不同的软硬件配置下,系统性能的表现,目的是为了找出系统在哪一种配置下性能表现最佳。
5、可靠性测试
实际负载低于最高负载(60%~85%),长时间运行系统(12h/24h/1周),查看系统整体的表现。
性能测试的参数:
1、并发数:
广义并发数:同一时刻向服务器发送HTTP请求的用户数量,可能不是一个功能。
狭义并发数:同一时刻正对系统的同一个功能向服务器发送请求的用户数。
系统用户数:简单地说就是该系统的注册用户数。
在线用户数:即登录系统的用户。
2、响应时间
用户发出请求到看到期待的信息所花费的时间。
响应时间=用户反应时间+网络传送时间(请求+响应)+服务器处理时间(包含数据库处理时间)
3、事务的响应时间
事务是指一组密切相关的操作组合。该数值对用户的意义更直观。
4、每秒事务通过数(Transaction Per Second)
TPS ,是指每秒系统能够处理的事务数。
5、点击率
每秒点击数代表用户每秒向Web 服务器提交的HTTP请求数。
点击率越大,服务器压力越大。
这里的点击并不是鼠标的一次点击,一次点击可能有多次HTTP请求。
6、吞吐量
一段时间内系统处理的客户请求的数量,直接体现软件系统的性能承载能力,一般来说用请求数/秒或是页面数/秒来衡量,从业务的角度,也可以用访问人数/天或是处理的业务数/小时来衡量,从网络的角度来说,也可以用字节数/天来衡量。
吞吐率
单位时间内系统处理的客户请求的数量。
7、资源利用率
不同系统资源的使用情况。CPU,Memory,磁盘,网络,电源,GPU等。 - 掌握自动化测试工具selenium,会使用selenium + Python编写Web自动化测试脚本;
selenium:轻量级免费的自动化测试工具,支持多语言(Java,C#,Python,ruby,JavaScript),多平台(windows、linux、MAC),多浏览器(Chrome,IE,Firefox,Safari,edge,oprea),分布式(靠selenium grid)
自动化测试方法
测试对象:UI、接口、代码;
测试过程:系统测试、集成测试、单元测试;
执行人员:测试人员、开发人员;
UI自动化和接口自动化的区别
UI自动化:
页面相关性强,必须后期介入,即在系统测试功能相对稳定、前端页面开发完成后进行,适合于页面功能相对稳定的项目;
接口自动化:
页面相关性小,可在产品前期介入,即在后端开发完成并相对稳定时就可以进行,适合接口变动较小,界面变动频繁的项目;
selenium工具集:
selenium1(thougthworks公司):selenium RC 编写自动化脚本(已弃用)、selenium IDE 录制自动化测试脚本、selenium Grid 实现分布式
selenium2:selenium1+Webdriver(谷歌公司)
selenium3:增加了一些浏览器的原生驱动,Safari,edge(微软公司)
webdriver的工作原理:
我们可以把WebDriver驱动浏览器类比成出租车司机开出租车。
在开出租车时有三个角色:
乘客:他/她告诉出租车司机去哪里,大概怎么走
出租车司机:他按照乘客的要求来操控出租车
出租车:出租车按照司机的操控完成真正的行驶,把乘客送到目的地
在WebDriver中也有类似的三个角色:
工程师写的自动化测试代码:自动化测试代码发送请求给浏览器的驱动(比如火狐驱动、谷歌驱动);
浏览器的驱动:它来解析这些自动化测试的代码,解析后把它们发送给浏览器;
浏览器:执行浏览器驱动发来的指令,并最终完成工程师想要的操作。
所以在这个类比中,工程师写的自动化测试代码就相当于是乘客,浏览器的驱动就相当于是出租车司机,浏览器就相当于是出租车。
webdriver 提供了一系列的对象定位方法,常用的有以下几种:id、name、class name、link text、partial link text、tag name、xpath、css selector。
操作测试对象
定位只是第一步,定位之后需要对这个原素进行操作。鼠标点击呢还是键盘输入,这要取决于定位的是按钮还输入框。
一般来说,webdriver 中比较常用的操作对象的方法有下面几个:
click 点击对象;send_keys 在对象上模拟按键输入;clear 清除对象的内容,如果可以的话;submit 清除对象的内容,如果可以的话;text 用于获取元素的文本信息
添加等待:固定等待,time.sleep(5),设置几秒就等待几秒;智能等待,implicitly_wait(5),等待的时间为0~5秒。
打印信息:title(打印的是上一个页面的),url
浏览器的操作
浏览器最大化:maximize_window();
浏览器最小化:minimize_window();
设置浏览器宽、高:set_window_size(480, 800) # 宽480、高800;
操作浏览器的前进、后退:forward(),back();
控制浏览器滚动条:
js=“var q=document.documentElement.scrollTop=10000” # 10000表示拖到底部,0表示拖到顶部;
driver.execute_script(js);
键盘事件
(1)键盘按键用法
要想调用键盘按键操作需要引入keys 包:
from selenium.webdriver.common.keys import Keys
通过send_keys()调用按键:send_keys(Keys.TAB) ,send_keys(Keys.ENTER)
(2)键盘组合键用法
send_keys(Keys.CONTROL,‘a’) # 等于ctr+a 全选
send_keys(Keys.CONTROL,‘x’) # 等于ctr+x 剪切
鼠标事件
context_click() 右击,double_click() 双击,drag_and_drop() 拖动,move_to_element() 移动 - 了解C语言基本编程,熟悉Java编程,了解面向对象编程及封装、继承、多态基本思想;
面向对象的设计:找对象,建对象,用对象,并维护对象之间的关系。
封装可以降低代码的管理复杂程度。
继承是为了代码重复使用,把一些公共的属性、方法放在父类。
多态的前提:1,发生向上转型(父类引用,引用子类对象);2,子类和父类有同名的重写方法;3,引用父类的引用调用该重写方法。
多态的好处:
类的调用者对类的使用成本进一步降低;
能够降低代码的“圈复杂度”,避免使用大量的if-else;
可扩展能力更强。 - 了解JVM内存区域划分,垃圾回收机制,类加载过程;
JVM内存的划分:
1、堆(运行时常量池),存放new的对象;
2、方法区,存放加载好的类,静态成员;
3、栈(JVM栈和本地方法栈),存放局部变量;
4、程序计数器,存放的是地址,描述当前线程接下来要执行的指令在内存的哪个地方。
note:
1、一个java进程中,可能包含着多个线程,多个线程之间公用同一份堆和方法区,但是每个线程都有自己的栈和程序计数器。
2、static方法和普通方法的区别
普通方法中有this,和实例相关,static方法没有this,和类相关。
GC垃圾回收机制
自动回收垃圾,能够一定程度的避免内存泄露,但是会引入一些额外的开销。
主要回收堆里的内存,方法区也有一些,栈和程序计数器不需要回收。
回收的基本单位是对象,每个对象都持有一定的内存,释放对应的对象,也就回收了对应的内存。
回收对象的基本思路:
一、标记:找出这个对象到底是否需要回收(判断对象的生死)。
1、引用计数法
记录当前这个对象,是否有引用指向(有几个引用)。
每个对象都专门分配一个计数器变量,有新的引用指向该对象,引用计数+1,有旧的引用指向别的对象了,就引用计数-1,当引用为0表示该对象没有引用了,于是这个对象就可以被回收了。
致命缺陷:无法解决循环引用的问题。
2、可达性分析
遍历这个对象关系的图,如果某个对象可以被遍历到,就不是垃圾,也就是可达的,如果无法遍历到,就是不可达。
从哪开始遍历:
a. 针对每个线程的每个栈帧的局部变量表;
b. 常量池中引用的对象;
c. 方法区中静态变量引用的对象;
遍历的起点不是一个,而是很多起点,每个起点都要往下遍历,同程为GCRoot。
3、回收方法区类对象的规则
a、该类的所有实例都已经被回收了;
b、加载该类的CLassLoader也已经被回收了;
c、该类对象没有在代码中被使用(通过可达性分析出来)了(包括各种静态成员,反射等)。
同时具备这三个条件,就认为该类对象是可以被回收的。
二、回收:把死了的对象回收回去。
1、标记清除(适合老年代)
清除就是直接释放。
优点:简单高效;
缺点:造成内存碎片问题;
2、标记复制(适合新生代)
把内存区域一分为二,把不是垃圾的对象拷贝到内存区域的另一边,然后整体释放左侧的内存区域。
优点:解决内存碎片问题,保证内存回收后,并不存在碎片;
缺点:需要一块额外的内存空间,如果生存的对象较多就很低效。
3、标记整理(适合老年代)
标记清除后,出现了内存碎片,就把后面的对象往前搬运,把碎片挤掉。
优点:不再像复制一样依赖更大的内存空间,也没有内存碎片;
缺点:搬运效率较低,不适合频繁进行。
分代回收(垃圾分类)
按照对象的年龄(使用对象活过的GC轮次),把堆内存分为新生代、老年代。
一个对象的人生
1、对象诞生于新生代伊甸区;
2、第一轮GC扫描(可达性分析)伊甸区后,就会把大量的对象干掉,少数没有干掉的对象,就会被拷贝(标记复制算法)到生存区;
3、进入生存区的对象,也会被GC进行扫描,如果发现该对象不可达,就被销毁,没有被销毁的对象,拷贝到另一个生存区;
a、两个生存区拷贝是为了更好的施展复制算法(生存区对象存活率很低,施展复制算法成本不高)。
b、生存区的对象,来源于两个地方:伊甸区,另外一个生存区。
4、对象在生存区中经历了若干轮次的拷贝之后,也没有被回收,此时说明这个对象存活时间会比较久,就拷贝到老年代;
5、老年代的对象也要经历GC扫描,但是由于老年代的对象,存活时间比较久,所以扫描老年代的周期比扫描新生代的周期长很多。
类加载
1、类加载基本过程
加载:根据类名,找到文件,读取文件,解析架构,把内容放到内存中,并构造出对应的类对象。
链接:如果该类依赖了一些其他类,链接过程就是把依赖内容进行引入。
初始化:初始化静态变量,并且执行静态代码块。
2、什么时候会触发某个类的加载?
a、构造该类的实例;
b、调用该类的静态属性或者方法;
c、使用子类时会触发父类的加载。
3、类加载器有哪些?
a、BootstrapClassLoader加载标准库中的类;
b、ExtClassLoader加载一个特殊目录的类;
c、AppCLassLoader加载应用程序自己写的类。
4、啥是双亲委派模型
描述的是类加载中,根据类名找类的.class文件的查找过程。
三个类加载器之间存在“父子关系”(和继承无关),类加载器中有一个parent属性,指向了自己的父亲。
AppCLassLoader拿到类名,先给自己的父亲ExtClassLoader,ExtClassLoader拿到又给自己的父亲BootstrapClassLoader,BootstrapClassLoader只能自己查找,查找到加载即可,查找不到又归还给ExtClassLoader,ExtClassLoader,ExtClassLoader查找不到的话又归还给AppCLassLoader,AppCLassLoader也查不到,就会抛出一个ClassNotFoundException。
目的:尽量让标准库的类优先被加载。
5、能否违背双亲委派模型?
可以,只是标准库中的三大类加载器要遵守。 - 熟悉数据结构,比如栈、队列、链表、树、堆、hash表,熟悉基本的排序算法;
快速排序算法的原理:以升序为例,分为以下几步:1,在数组中选一个基准数,比如最左侧第一个;2,将数组中小于基准数的数据移到基准数左边,大于基准数的数移到基准数右边;3,对于基准数左边和右边的数组分别重复的进行前两步,直到每个子集只有一个元素,即排序完成。
- 熟悉MySQL数据库增删查改的基本语句,了解事务的特性;
事务:把一组操作封装到一起,成为了一个共同的执行单元,此时执行整个事务就能避免一些问题。
事务的特性:
原子性:事务中的若干个操作,要么全部执行成功,要么就全都不执行(回滚);
一致性:执行事务前后,数据始终处于一种合法的状态;
持久性:事务一旦执行完毕,此时对于数据的修改就是持久生效的;
隔离性:为了保证数据的准确,可以在满足数据准确要求的前提下,尽可能的提高并发事务。 - 熟悉TCP/IP五层模型结构,了解TCP协议和UDP协议的区别;
五层模型:应用层,传输层,网络层,数据链路层,物理层。
TCP和UDP的区别:
UDP:无连接,不可靠,面向数据报;
TCP:有连接,可靠传输,面向字节流;
1、TCP适用于对可靠性要求高的场景,UDP适用于对可靠性求不高,但是对效率要求高的场景;
2、UDP能实现广播,TCP只能一对一传播;
3、TCP对系统资源要求较多,UDP对系统资源要求较少。 - 了解TCP协议连接建立与断开及其相关细节,了解HTTP协议的构成及状态码;
(1)三次握手(我要和你建立连接,你真的要和我建立连接么,我真的要和你建立连接,成功):
1.第一次握手:客户端给服务器发送一个SYN,客户端进入syn_sent状态,等待服务器确认。
2.第二次握手:服务器收到SYN后,知道客户端请求建立连接,服务器给客户端发送一个SYN和ACK,以确认连接请求,Server进入syn_rcvd状态。
3.第三次握手:客户端收到确认后,给服务器返回一个ACK,服务器检查ACK是否为1,如果正确则连接建立成功,客户端和服务器进入established状态,完成三次握手,随后客户端和服务器之间可以开始传输数据了。
(2)四次挥手(我要和你断开连接;好的,断吧。我也要和你断开连接;好的,断吧)
第一次挥手:客户端发送一个FIN,用来关闭客户端到服务器的数据传送,客户端进入fin_wait_1状态。
第二次挥手:服务器收到FIN后,发送一个ACK给客户端,服务器进入Close_wait状态。此时TCP连接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收。
第三次挥手:服务器发送一个FIN,用来关闭服务器到客户端的数据传送,服务器进入Last_ack状态。
第四次挥手:客户端收到FIN后,客户端进入Time_wait状态,接着发送一个ACK给服务器,服务器接收到ACK后进入Closed状态,完成四次挥手。
Q:四次挥手,三次挥完行不行?
不行,中间的FIN和ACK触发的时机不一样,ACK是收到FIN后立刻由内核返回的数据包,FIN是应用程序处理处理完接收缓冲区的数据之后,调用的close方法触发的。但是,如果触发了延时应答机制,就可以三次挥完。
TCP是怎么保证可靠性的
确认应答,超时重传,连接管理三个机制。
滑动窗口:用来提高传输效率的机制,批量发送数据,批量等待ACK。
流量控制:限制滑动窗口的大小,使传输效率不要太快,保证可靠性。
拥塞控制:限制滑动窗口的大小,以限制传输效率。
延时应答:为了提高效率,在流量控制的基础上,尽量返回一个合理的但是又比较大的窗口。
HTTP协议原理
HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型,一次HTTP操作分为四步:1,首先客户端与服务器建立连接;2,建立连接后,客户端发送一个请求给服务器,请求包含方法,URL,协议版本号,请求修饰符,客户端信息等;3,服务器接到请求后,给予相应的响应信息,包括版本号,状态码,状态码描述,服务器信息,实体信息等;4, 断开连接。
HTTP常见方法:get,post,put,push,delete
http://www.yunlianip.com/News-getInfo-id-158.html
get和post的区别:
get数据在url中,post数据在body中。
①get请求用来从服务器上获得资源,而post是用来向服务器提交数据;
②get将表单中数据按照name=value的形式,添加到action 所指向的URL 后面,并且两者使用"?“连接,而各个变量之间使用”&"连接;post是将表单中的数据放在HTTP协议的请求头或消息体中,传递到action所指向URL;
③get传输的数据要受到URL长度限制(1024字节);post可以传输大量的数据,上传文件通常要使用post方式;
④使用get时参数会显示在地址栏上,如果这些数据不是敏感数据可以使用get;对于敏感数据还是应用使用post。
HTTP常见状态码
Http和Https的区别
Http协议运行在TCP之上,明文传输,客户端和服务器都无法验证对方的身份;Https运行于SSL之上,SSL运行于TCP之上,是添加了加密和认证机制的Http。
端口不同:http和https使用不同的连接方式,用的端口也不一样,前者是80端口,后者是443端口;
资源消耗不同:和http通信相比,https通信会由于加减密处理消耗更多的CPU和内存资源;
开销:https通信需要证书,而证书一般需要向认证机构购买。
https的加密机制是一种共享密钥加密和公开加密并用的混合加密机制。
补充问题:
软件测试与开发的区别?
难易程度:开发广度小,专业度高。测试广度大,专业度低
工作环境:基本类似
薪水:中小企业总体比研发低,自动化等专业测试领域和研发基本无差距。大厂研发测试基本无差别
发展前景:自动化测试、安全测试等领域发展前景和研发基本一致。
繁忙程度:一般比研发轻松,但敏捷模式下差距不大,产品发布前压力比较大
技能要求:测试要求更广泛,业务能力,设计和架构分析能力,测试手段和工具使用,用户模型分析和理解,编程能力
为什么选择软件测试这个岗位?
思维模式:逆向思维(比如考虑用户正确操作系统的实际输出,也要考虑用户非法操作系统可能会出现的问题),发散性思维(测试一台自动售票机,不仅要考虑它的基本功能,还要考虑性能,耗电量,断电,外观,没零钱等)
兴趣:是真的感兴趣,能尽早的找出项目的缺陷而感到一种成就感,而不是说为了少加班,逃避编程等问题
性格特征:对事物有好奇心、在完成工作时有成就感、对bug比较敏感、细心不浮躁、有批判性思维
能力:快速学习能力、沟通能力、文字能力、开发能力
责任感和压力:测试往往是产品的最后一个检验者,测试的工作成效很难衡量,测试用例执行、bug数目的多少都无法说明产品是否能够交给用户使用。所以,责任感是最重要的测试必备素质之一。来自开发人员、用户、上级、自己的压力。测试人员的要承受压力比想象中的要大
如何描述一个bug?
描述bug的目的是让开发人员更好的定位bug
要素:版本号,测试环境(硬件,软件),操作步骤,预期结果,实际结果
其他:截图,修改意见,错误日志,出现问题的时间,测试数据(重要)
由于一个bug和开发人员产生冲突怎么办?
(1)先检查自身,是否bug描述不清楚
(2)站在用户角度考虑问题 ,去劝说开发人员
(3)BUG定级要按照公司的标准,规范
(4)提高自身的技术和业务水平. 不光要提出问题, 最好也能提出解决方案
(5)发起Bug评审