软件测试
1.功能测试
一.测试用例方法
(1)等价类
等价类概述:把程序的输入域划分成若干个部分,列出哪些数据是有效的,哪些数据是无效的
使用等价类划分法设计测试用例,首先必须分析需求规格说明书,然后列出有效等价类和无效等价类。以下是划分等价类的几个原则:
-
如果程序规定了输入域的取值范围,则可以确定一个有效等价类和 2 个无效等价类。
例如:程序要求输入的数值是 50 到 100,那么一个有效等价类就是 50~100,而 2 个无效等价类就是小于 50,大于 100 的区域数据。
-
如果程序规定了输入值的集合,不是一个范围,则可以确定一个有效等价类和一个无效等价类。
-
表格样式
输入条件 有效等价类 编号 无效等价类 编号 …… …… ① …… ③ …… …… ② …… ④
案列图
(2)边界值
边界值概述:选取正好等于、刚刚大于、刚刚小于边界的值作为测试数据。
常见的边界值:
-
对于 int 类型的整数而言,-2 的 15 次方 和 2 的 15 次方 -1 是它的边界,也就是 -32768 和 32767 是边界;
-
对于屏幕的光标焦点来说,屏幕上光标的最左上、最右下的位置是它的边界;
-
对于报表来说,报表的第一行和最后一行是它的边界;
-
对于数组来说,数组元素的第一个和最后一个是它的边界;
-
对于循环条件来说,循环的第 0 次、第 1 次和倒数第 2 次以及最后一次是它的边界。
-
同等价类划分法一样,边界值分析法也应遵循一定的原则:
上点、离点、内点的确定
-
上点:边界上的点,区间的终点值。
-
离点:离上点最近的点称为离点。开区间的离点,就是开区间中 上点 内侧紧邻的点。闭区间的离点,就是闭区间中 上点 外侧紧邻的点。
-
内点:上点之间(域范围内)的任意一点。
程序中输入域语句编写错误,不管是由于需求界定不准确、设计不严密、程序书写手误或者其他原因造成的,都可以依据边界值分析法选出的测试点把它们找出来。边界值分析法多应用于以下几个场景中:
(1)输入(输出)条件规定了取值范围或值的个数;
(2)程序规格说明书中提到的输入或输出是一个有序的集合;
(3)可以通过分析找出程序的边界。
不管是哪种场景,边界值分析法的运用都没有太大差别,首先都是要确定取值范围,然后确定边界,分析预期结果,输出测试用例。
3.常见边界值
如果是字符的话,我们常常考虑它的:正常长度、最大长度、最大长度+1、最小长度-1、空值、只有空格、字符前后有空格。
如果是整数的话,我们常常考虑它的:正常长度、最小值、最小值-1、最小值+1、最大值、最大值-1、最大值+1、中间值、字母、特殊字符、非整数、有小数点。
案列图
(3)判定表
判定表的概念:判定表又称“决策表”,是一种表格状的图形工具,适用于处理判断条件较多,各条件又相互组合、有多种决策方案的情况。
判定表通常由 4 个部分组成:
条件桩(Condition Stub):指所有条件的名称,列出的条件的先后次序无关紧要。
动作桩(Action Stub):指所有可能采取的操作,顺序没有约束。
条件项(Condition Entry):条件桩中的条件所有可能的取值。
动作项(Action Entry):与条件项紧密相关,列出在条件项的各组取值情况下应该采取的动作。
案列图
需求:超市中如果某产品的【销售好并且库存低】,则继续销售并增加该产品的进货;如果该产品【销售好,但库存量不低】,则继续销售;若该产品【销售不好,但库存量低】,则该产品下架;若该产品【销售不好,且库存量不低】,如果有空货架则继续销售,如果【没有空货架】,则该产品下架。
分析需求,列出所有的条件桩和条件项。如下表所示。
条件桩 | 条件项 |
---|---|
C1:销售好? | True(T)或 False(F) |
C2:库存低? | True(T)或 False(F) |
C3:有空货架? | True(T)或 False(F) |
分析需求,列出所有的条件组合所产生的动作。
-
A1:增加进货
-
A2:继续销售
-
A3:产品下架
对于本题有 3 个条件(销售、库存、有空货架),每个条件有 2 个取值(是或否),根据“组合”的原理,共有 23=8 种规则。
简化判定表
(4)因果图法
因果图法概述:因果图法是一种利用图解法分析输入的各种组合情况,从而设计测试用例的方法,它适合于检查程序输入条件的各种情况的组合。
因果图实际上是一种数字逻辑电路(一个组合的逻辑网络),但没有使用标准的电子学符号,而是使用了稍微简单点的符号。
用直线连接左右结点,其中左结点 c 表示输入状态(或称原因),右结点 e 表示输出状态(或称结果)。c 和 e 取值都是 0 或者 1,0 表示该条件不出现,1 表示该条件出现。
案列图
某软件的规格说明中对登录名输入包含这样的要求:输入的第一个字符必须是”$”或英文字母,第二个字符必须是一个数字,在此情况下进入第二个窗口;但如果第一个字符不正确,则给出信息 M;如果第二个字符不是数字,则给出信息 N。
用例编号 | 输入数据 | 预期输出 |
---|---|---|
TC-001 | $5 | 进入第 2 个窗口 |
TC-002 | $a | 给出信息 N |
TC-003 | a9 | 进入第 2 个窗口 |
TC-004 | cb | 给出信息 N |
TC-005 | 42 | 给出信息 M |
TC-006 | @% | 给出信息 M 和信息 N(是否会弹出信息 N,具体要看程序是否有 M 约束屏蔽发生) |
(5)正交法
正交法概述:正交实验法是一种基于正交表的、高效率、快速、经济的实验设计方法,它研究的“多因素多水平”的情况,然后套用正交表来随机地产生用例(用例之间没有主次之分),是一种提高测试覆盖率的简单易用的方法。
因素(Factor):在一项实验中,凡是被考查的变量就称为因素。
水平(Level):在实验范围内,因素被考查的值称为水平。
L 行数(水平数因素数)
行数(Runs):正交表中行的个数,也就是实验的次数,也指测试用例的个数。
因素数(Factors):指正交表中列的个数。
水平数(Levels):任何单个因素能够取得的值的最大个数。
正交法公式表图
链接:http://support.sas.com/techsup/technote/ts723_Designs.txt
案列图
(6)场景法
场景法概述:场景法一般包含基本流和备选流,从一个流程开始,通过描述经过的路径来确定测试用例的过程,经过遍历所有的基本流和备选流来完成整个场景。
基本流也叫有效流或正确流,主要是模拟正确的业务操作过程的情景。
备选流也叫无效流或错误流,主要是模拟错误的业务操作过程的情景。
如何识别出基本流和备选流,有以下几个识别原则:
-
一个业务只存在一个基本流;
-
基本流只有一个起点,一个终点;
-
基本流是主流,备选流是支流;
-
备选流可以起始于基本流,也可以起始于其它的备选流;
-
备选流的终点,可以是一个流程出口,也可以是回到基本流,还可以是汇入其它的备选流;
-
如果在流程图中出现了两个不相上下的基本流,一般需要把它们分开对待。
案例图
(7)大纲法
大纲法概述:大纲法是一种着眼于需求功能的方法,是从宏观上检验需求的完成度。
说白了,就是通过列大纲的方式,检测未被覆盖的功能点,从而发现系统的缺陷。
案例图
(8)错误推测法
错误推测法是经验丰富的测试人员喜欢使用的一种测试用例设计方法。实际工作中,你可能会发现,有些人貌似天生就是做测试的能手,总能发现别人发现不了的缺陷,他们也没有什么特殊的方法,却似乎天生有发现缺陷的能力。对此的一个解释就是这些人更多是在下意识中,把错误推测法运用的很好的缘故。
错误推测法就是基于经验和直觉推测程序中所有可能存在的各种错误,有针对性地设计测试用例的方法。也就是列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据这些情况选择测试用例。
它是一项依赖于直觉的非正规的过程,所以无法描述出它的设计步骤。但它的基本思想是列举出可能犯的错误或错误易发情况的清单,然后编写测试用例。
测试人员的经验越足,工作越细心,就越容易使用错误推测法来发现缺陷。
二.编写测试用例
往往第一条测试都是冒烟测试方法,添加所有的需求,然后实行是否运行
第二条就可以开始一个一个需求来测试了
案列图
三.缺陷报告
缺陷报告其实就是找到软件需求的缺陷,用例编号:功能名称-BUG-001
缺陷标题:描述清楚,不能过于详细,抓住重点
缺陷级别:1级是重大,2级是需要改进
2.自动化测试
一.自动化测试
利用xpath查询地址
driver.findElement(By.xpath("/html/body/div[3]/div/div[1]/div[2]/div/div[2]/div/dl/dt/a")).click();
利用name查询地址
driver.findElement(By.name("i_location")).click();
利用class来查询地址
driver.findElement(By.name("location-left light-font-color")).click();
利用css样式查询地址
driver.findElement(By.name("#i_location")).click();
进入iframe方法
driver.swtchTo.frame(driver.findElement(By.xpath("/html/body/div/div/div[3]/iframe[3]")))
driver.swtchTo.frame(driver.findElement(By.xpath(1)))
退出iframe方法
driver.switchTo().defaultContent();
多态iframe
WebElement div = driver.findElement(By.xpath("/html/body/div/div/div[3]"));
WebElement iframe02 = div.findElement(By.xpath("/html/body/div/div/div[3]/iframe[2]"));
driver.switchTo().frame(iframe02);