软件测试笔记(Junit,白盒测试,黑盒测试)

目录

Junit简介

一、新建junit测试

二、断言静态类

三、图标

四、注释元素

五、多个测试类同时执行

六、测试方法期望抛出指定的异常

七、测试方法被允许运行的最长时间

八、暂时忽略测试方法、

九、测试的运行器

十、参数化测试方式

十一、Ant

白盒测试:

一、简介

二、方法

1、语句覆盖;

2、判定覆盖;

3、条件覆盖;

4、判定条件覆盖;

5、条件组合测试;

6、路径覆盖;

7、基本路径覆盖

三、方法的优缺点总结

黑盒测试

一、简介

二、方法

1.1等价类划分法

1.2边界值分析方法

2.1判定表方法

2.2因果图

2.3两两组合方法(略)

2.4正交试验法

3.Ad-hoc测试和ALAC测试,错误猜测法

三、选择建议




★★★★★Junit简介

一、‌新建junit测试

构建路径,添加junit库。
测试代码另外放到一个包下,(testsrc文件)。
可以用自带的新建测试用例Junit Test Case。
类名:Test+某某类。
方法 :test+方法名+测试概述。

public class TestWordDealUtil {
        @Test
	public void wordFormat4DBNormal(){
		String target = "employeeInfo";
		String result = WordDealUtil.wordFormat4DB(target);
		assertEquals("employee_info", result);
	}
}


二、断言静态类,直接用方法

assertArrayEquals(expecteds, actuals)

查看两个数组是否相等。

assertEquals(expected, actual)

查看两个对象是否相等。类似于字符串比较使用的equals()方法

assertNotEquals(first, second)

查看两个对象是否不相等。

assertNull(object)

查看对象是否为空。

assertNotNull(object)

查看对象是否不为空。

assertSame(expected, actual)

查看两个对象的引用是否相等。类似于使用“==”比较两个对象

assertNotSame(unexpected, actual)

查看两个对象的引用是否不相等。类似于使用“!=”比较两个对象

assertTrue(condition)

查看运行结果是否为true。

assertFalse(condition)

查看运行结果是否为false。

assertThat(actual, matcher)

查看实际值是否满足指定的条件

fail()

让测试失败


三、图标

红色 严重报错,代码异常

蓝色 输出结果不一致,逻辑不对

‌四、注释元素

@Before

初始化方法 

@After

释放资源 

@Test

测试方法,在这里可以测试期望异常和超时时间

@Ignore

忽略的测试方法;

当测试的方法还没有实现,或者测试的方法已经过时,或者在某种条件下才能测试该方法

(比如需要一个数据库联接,而在本地测试的时候,数据库并没有连接),

那么使用该标签来标示这个方法。

@BeforeClass

针对所有测试,只执行一次,且必须为static void

@AfterClass

针对所有测试,只执行一次,且必须为static void

@RunWith

指定测试类使用某个运行器

@Parameters

指定测试类的测试数据集合

@Rule

允许灵活添加或重新定义测试类中的每个测试方法的行为

@FixMethodOrder

指定测试方法的执行顺序

五、多个测试类同时执行

(1)方法一:

public class TestMain {
	public static void main(String[] args){
		org.junit.runner.JUnitCore.runClasses(Test1.class,Test2.class);
	}
}

(2)方法二:

测试套件:测试套件中不仅可以包含基本的测试类,而且可以包含其它的测试套件

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)  //指定使用Suite运行器来运行测试
@Suite.SuiteClasses({TestWordDealUtil.class, TestWordDealUtilWithParam.class,…}) //指定要测试的类
public class RunAllUtilTestsSuite {
}

六、测试方法期望抛出指定的异常

说明:如果运行测试并没有抛出这个异常,则 JUnit 会认为这个测试没有通过

@Test(expected=IndexOutOfBoundsException.class)
	public void testException(){
		String[] str= {"one","two","three"};
		System.out.println("four:" + str[3]);
	}

七、测试方法被允许运行的最长时间

说明:如果测试方法运行时间超过了指定的毫秒数,则JUnit认为测试失败。

@Test(timeout=1000)
public void selfXMLReader(){
……
}

八、暂时忽略测试方法

例如:要测试是否成功链接数据库,但是还没写链接代码。

@Ignore("db is down")
@Test(expected=UnsupportedDBVersionException.class)
public void unsupportedDBCheck(){
	……
}

九、测试的运行器

(1)所有的运行器都继承自 org.junit.runner.Runner

(2)默认的运行器:BlockJunit4ClassRunner

(3)更换运行器代码:

@RunWith(CustomTestRunner.class)
public class TestWordDealUtil {
……
}

十、参数化测试方式

import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class) //1.更改默认的测试运行器为RunWith(Parameterized.class)
public class TestWordDealUtilWithParam {

                //2.声明变量存放预期值和测试数据
		private String expected;
		private String target;

                //3.声明一个返回值 为Collection的公共静态方法,并使用@Parameters进行修饰
		@Parameters
		public static Collection words(){
	    		return Arrays.asList(new Object[][]{
	          	{"employee_info", "employeeInfo"},		//测试一般的处理情况
	          	{null, null},							//测试 null 时的处理情况
	          	{"", ""},								//测试空字符串时的处理情况
	          	{"employee_info", "EmployeeInfo"},		//测试当首字母大写时的情况
	          	{"employee_info_a", "employeeInfoA"},	//测试当尾字母为大写时的情况
	          	{"employee_a_info", "employeeAInfo"}	//测试多个相连字母大写时的情况
	    		});
		}

                //4.为测试类声明一个带有参数的公共构造函数,并在其中为之声明变量赋值
	 	/**
	 	* 参数化测试必须的构造函数
	 	* @param expected	期望的测试结果,对应参数集中的第一个参数
	 	* @param target	测试数据,对应参数集中的第二个参数
	 	*/
		public TestWordDealUtilWithParam(String expected , String target){
			this.expected = expected;
			this.target = target;
		}

                //5.运行测试方法,即可完成对多组数据的测试
		@Test 
			public void wordFormat4DB(){
			assertEquals(expected, WordDealUtil.wordFormat4DB(target));
		}
}

十一、Ant

(1)说明:
<1>项目中单元测试类的个数在不停的增加,批量测试的时候容易忘了加入新增加的测试。
<2>Ant 内置了对 JUnit 的支持,它提供了两个 Task:junit 和 junitreport,分别用于执行 JUnit 单元测试和生成测试结果报告。使用这两个 Task 编写构建脚本,可以很简单的完成每次全面单元测试的任务。

<3>Target junit report 是 Ant 构建脚本中的核心内容,其它 target 都是为它的执行提供前期服务。Task junit 会寻找输出目录下所有命名以“Test”开头的 class 文件,并执行它们。紧接着 Task junitreport 会将执行结果生成 HTML 格式的测试报告。

(2)使用Ant:

<1>打开 Eclipse 首选项界面,选择 Ant -> Runtime 首选项(见下图),将 JUnit 4.1 的 JAR 文件添加到 Classpath Tab 页中的 Global Entries 设置项里。记得检查一下 Ant Home Entries 设置项中的 Ant 版本是否在 1.7.0 之上,如果不是请替换为最新版本的 Ant JAR 文件。


<2>编写 Ant 构建脚本 build.xml

<?xml version="1.0"?>
<project name="auto unittest task" default="junit and report" basedir=".">
	<property name="output folder" value="bin"/>
	<property name="src folder" value="src"/>
	<property name="test folder" value="testsrc"/>
	<property name="report folder" value="report" />
	<!-- target: test report folder init -->
	<target name="test init">
		<mkdir dir="${report folder}"/>
	</target>
	<!-- target: compile -->
	<target name="compile">
		<javac srcdir="${src folder}" destdir="${output folder}" />
		<echo>compilation complete!</echo>
	</target>
	<!-- target: compile test cases -->
	<target name="test compile" depends="test init">
		<javac srcdir="${test folder}" destdir="${output folder}" />
		<echo>test compilation complete!</echo>
	</target>
	<target name="all compile" depends="compile, test compile">
	</target>
	<!-- target: auto test all test case and output report file -->
	<target name="junit and report" depends="all compile">
		<junit printsummary="on" fork="true" showoutput="true">
			<classpath>
				<fileset dir="lib" includes="**/*.jar"/>
				<pathelement path="${output folder}"/>
			</classpath>
			<formatter type="xml" />
			<batchtest todir="${report folder}">
				<fileset dir="${output folder}">
					<include name="**/Test*.*" />
				</fileset>
			</batchtest>
		</junit>
		<junitreport todir="${report folder}">
			<fileset dir="${report folder}">
				<include name="TEST-*.xml" />
			</fileset>
			<report format="frames" todir="${report folder}" />
		</junitreport>
	</target>
</project>

<3>运行结果,生成html报告



------------------------------------------

------------------------------------------

★★★★★白盒测试简介

一、简介:着眼程序的内部逻辑结果,必须知道软件内部工作过程,按照程序内部的结构测试程序内部的变量状态、逻辑结构、运行路径等。

二、白盒测试的(基于逻辑覆盖的)方法:语句覆盖,判定覆盖,条件覆盖,判定条件覆盖,条件组合覆盖,路径覆盖,基本路径覆盖。

eg:以下方代码为例子,写出每一种白盒测试方法的测试用例。

1         int a,b;
2         double c;

3.1,3.2   if (a >0 && b > 0)
4             c = c / a;

5.1,5.2   if (a > 1 || c > 1)
6              c = c + 1;
        
7         c = b + c;

该程序的程序流程图(图一)和程序图(图二)如下:


1、语句覆盖

定义:使程序中每个可执行语句至少执行一次。

上方例子答案:(看图一)为使得1-7都执行一次,测试例子可以为a=2,b=1,c=0(1-2-3-4-5-6-7)

2、判定覆盖

定义:每个判断的取真分支和取假分支至少经历一次。

上方例子答案:(看图一)为使得例子至少经历一次T3,F3,T5,F5

则测试例子可以为:

a=1,b=1,c =2 (经历了T3和T5)

a=-1,b=1,c=1(经历了F3和F5)

3、条件覆盖

定义:每个判断中每个条件的可能取值至少满足一次。

上方例子答案:(看图二)为使得例子至少经历一次T3.1,F3.1,T3.2,F3.2,T5.1,F5.1,T5.2,F5.2

则测试例子可以为:

a=2,b=-1,c=-2(经历了T3.1,F3.2,T5.1,F5.2)

a=-1,b=2,c=3(经历了F3.1,T3.2,F5.1,T5.2

4、判定条件覆盖

定义:所有判断的取真分支和取假分支至少经历一次,同时每个判断中每个条件的可能取值至少满足一次。反正就是 判定覆盖∪条件覆盖。

上方例子答案:(同时看图一图二)为使得例子至少经历一次T3,F3,T5,F5且同时经历T3.1,F3.1,T3.2,F3.2,T5.1,F5.1,T5.2,F5.2,

则测试例子可以为:

a=2,b=1,c=6(经历了T3,T5同时经历了T3.1,T3.2,T5.1,T5.2)

a=-1,b=-2,c=-3(经历了F3,F5,同时经历了F3.1,F3.2,F5.1,F5.2

5、条件组合测试

定义:条件取值组合至少执行一次。

上方例子答案:(看图二)为使得T3.1,F3.1,T3.2,F3.2组成的组合(T3.1,T3.2),(F3.1,F3.2),(T3.1,F3.2),(F3.1,T3.2)每一个至少经历一次,同时也要使T5.1,F5.1,T5.2,F5.2组成的组合(T5.1,T5.2),(F5.1,F5.2),(T5.1,F5.2),(F5.1,T5.2)每一个至少经历一次,

则测试例子可以为:

a=2,b=1,c=6(经历了组合(T3.1,T3.2)、(T5.1,T5.2))
a=2,b=-1,c=-2(经历了组合(T3.1,F3.2)、(T5.1,F5.2))
a=-1,b=2,c=3(经历了组合(F3.1,T3.2)、(F5.1,T5.2))
a=-1,b=-2,c=-3(经历了组合(F3.1,F3.2)、(F5.1、F5.2))


6、路径覆盖

定义:覆盖程序中的所有可能的执行路径

上方例子答案:(看图一)为使得所有可能的执行路径,换个思维,也就是要满足组合(T3,T5)、(F3、F5)、(T3、F5)、(F3、T5)每一个都只经历一次

则测试例子可以为:

a=2,b=1,c=6(路线1-2-3-4-5-6-7,满足组合(T3,T5))
a=1,b=1,c=-3(路线1-2-3-4-5-7,满足组合(T3,F5))
a=-1,b=2,c=3(路线1-2-3-5-6-7,满足组合(F3,T5))

a=-1,b=-2,c=-3(路线1-2-3-5-7,满足组合(F3,F5))

7、基本路径覆盖

定义:任何贯穿程序的、至少引入一组新的处理语句或一个新的条件的路径。

当按照程序图进行描述时,独立路径必须沿着至少一条边移动。这条边在定义该路径之前未被遍历。

上方例子答案:(我有空再写)

步骤一:画出程序图,也就是图二,并计算圈复杂度,为5,则得出测试用例最少个数为5

步骤二:确定独立路径的基本集合

步骤三:根据独立路径的基本集合确定测试例子


三、白盒测试方法总结(优缺点)

1、语句覆盖:

优点:直观地从源代码得到测试用例,无须细分每条判定表达式。

缺点:仅仅针对程序逻辑中显式存在的语句,但对于隐藏的条件是无法测试的。如在多分支的逻辑运算中无法全面的考虑。语句覆盖是最弱的逻辑覆盖。

2、判定覆盖:

优点:判定覆盖具有比语句覆盖更强的测试能力。同样判定覆盖也具有和语句覆盖一样的简单性,无须细分每个判定就可以得到测试用例。比语句覆盖强。

缺点:往往大部分的判定语句是由多个逻辑条件组合而成,若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径;判定覆盖仍是弱的逻辑覆盖。

3、条件覆盖:

优点:增加了对条件判定情况的测试,增加了测试路径。比语句覆盖强。

缺点:条件覆盖不一定包含判定覆盖;条件覆盖只能保证每个条件至少有一次为真,而不考虑所有的判定结果。

4、判定条件覆盖:

优点:能同时满足判定、条件两种覆盖标准。比语句覆盖强

缺点:未考虑条件的组合情况。

5、条件组合覆盖

优点:满足判定覆盖、条件覆盖和判定/条件覆盖准则;条件组合覆盖是除路径覆盖外最强的;

缺点:线性地增加了测试用例的数量;条件组合效率不高,有些测试是不必要的;判定/条件 还不够强;

6、路径覆盖:

优点:这种测试方法可以对程序进行彻底的测试,一般比前面五种的覆盖面都广。比较强的覆盖。

缺点:需要设计大量、复杂的测试用例,使得工作量呈指数级增长,不见得把所有的条件组合都覆盖,未必考虑判定条件结果的组合

----------------------------------------------

----------------------------------------------

★★★★★黑盒测试简介

一、简介:是针对软件的功能需求/实现进行测试; 它是在已知产品所应具有的功能,通过测试来检测每个功能是否都能正常使用。着眼于程序外部结构,不考虑内部逻辑结构,针对软件界面和软件功能进行测试。

二、黑盒测试的方法:


1、基于输入域的测试方法

1.1、等价类划分法

<1>定义:是把所有可能的输入数据,即程序的输入域划分成若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。

着重考虑输入条件,但未考虑输入条件之间的联系, 相互组合等。

<2>分类:有效等价类、无效等价类

<3>例子:

设某公司要打印2001~2005年的报表,其中报表日期为6位数字组成,其中,前4位为年份,后两位为月份。

步骤一:建立等价类表,列出所有划分出的等价类,并编号:

输入及外部条件 有效等价类 无效等价类
报表日期的类型及长度 6位数字字符① 有非数字字符    ④
少于6个数字字符 ⑤
多于6个数字字符 ⑥
年份范围 在2001~2005之间② 小于2001 ⑦
大于2005 ⑧
月份范围 在1~12之间③ 小于1 ⑨
大于12 ⑩

步骤二:为有效等价类设计测试用例:

测试数据     期望结果     覆盖范围
200105 输入有效 等价类①②③

步骤三:为每一个无效等价类至少设计一个测试用例:

测试数据
期望结果
覆盖范围
001MAY
输入无效
等价类④
20015
输入无效
等价类⑤
2001001
输入无效
等价类⑥
20000
输入无效
等价类⑦
20080
输入无效
等价类⑧
200100
输入无效
等价类⑨
200113
输入无效
等价类⑩

1.2、边界值分析方法

<1>定义:是对输入或输出的边界值进行测试的一种黑盒测试方法。选取正好等于、刚刚大于或小于边界值作为测试数据。
也是着重考虑输入条件,但未考虑输入条件之间的联系, 相互组合等。

<2>确定边界值方法:

eg:数据范围是1<=x<=50;则取边界值为:1、50、0、51

eg:如果程序的输入或输出是一个有序的集合 (例如顺序文件、线性列表、表格等),那么需要关注集合的第一个和最后一个元素。

<2>例子:测试 限制性用户输入:必须为6位的正整数

正常值(有效位数、有效大小)  X1 = 123123  
边界值:(无效位数)  X2 = 12345  
边界值(无效位数)  X3 = 1234567  
边界值(有效大小)  X4 = 100000 X11 = 999999 
边界值(无效大小)  X5 = 99999 X12 = 1000000
无效类的值

x6= -123123

X7 = asdasd

X8 =  000123

X9 = asd123

X10 = Empty

 

<3>分类:单变量的边界值分析 和 多变量的边界值分析

a)单变量的边界值分析:

分析内容:最小值(min)、略高于最小值(min+)、正常值(nom)、略低于最大值(max-)、最大值(max) 

b)健壮性边界值分析测试:

分析内容:除了变量的五个边界值测试外,还要测试略超过最大值、略小于最小值的取值。

eg:N个变量的函数,使某个变量取最小值、略高最小值、正常值、略低最大值、最大值,(总共M项,M=5)除外的所有变量取正常值。

则n个变量的函数 ,产生(M-1)n+1个测试用例 

2、基于组合技术和组合优化的方法

2.1判定表方法

1、对于多因素,有时可以直接对输入条件进行组合设计,不需要进行因果分析,即直接采用判定表方法

2、组成:判定表通常由以下5部分组成:

条件桩———列出问题的所有条件;
条件项———针对条件桩给出的条件列出所有可能的取值;
动作桩———列出问题规定的可能采取的操作;
动作项———指出在条件项的各组取值情况下应采取的动作;

规则———将任何一个条件组合的特定取值及相应要执行的动作称为一条规则。在判定表中贯穿条件项和动作项的一列就是一条规则。


3、构造判定表的5个步骤:
a)确定规则的个数。
有n个条件的判定表有2n个规则(每个条件取真、假值)
b)列出所有的条件桩和动作桩。
c)填入条件项。
d)填入动作项,得到初始判定表。
e)简化判定表,合并相似规则。
若表中有两条以上规则具有相同的动作,并且在条件项之间存在极为相似的关系,便可以合并。
合并后的条件项用符号“-”表示,说明执行的动作与该条件的取值无关,称为无关条件。

f)根据生成判定表,设计测试用例,判定表每一列代表一条测试用例!



2.2因果图法

1、借助图形,着重分析和检查程序输入条件的各种组合。每种组合条件是“因”,它必然有一个输出的结果,就是“果”。

2、逻辑符号:左节点:表示输入状态(原因);右节点:表示输出状态(结果);

3、因果关系:恒等,非,或,与


4、约束:输入状态相互之间还可能存在某些依赖关系,称为约束。

输入条件的约束有以下4类:
① E约束(异):a和b中至多有一个可能为1,即a和b不能同时为1。
② I约束(或):a、b和c中至少有一个必须是1,即 a、b 和c不能同时为0。
③ O约束(唯一);a和b必须有一个,且仅有1个为1。

④ R约束(要求):a是1时,b必须是1,即不可能a是1时b是0。

输出条件约束类型有以下1类:

输出条件的约束只有M约束(强制):若结果a是1,则结果b强制为0。



5、举例:

某软件规格说明书包含这样的要求:
第一列字符必须是A或B,第二列字符必须是一个数字;
在此情况下进行文件的修改,但如果第一列字符不正确,则给出信息L;

如果第二列字符不是数字,则给出信息M。

(1)步骤一:根据软件规格说明书,找出原因(即输入条件或输入条件的等价类)和结果(即输出条件), 并给每个原因和结果赋予一个标识符。

根据题意,原因和结果如下:
原因:1)第一列字符是A;2)第一列字符是B;3)第二列字符是一数字。

结果:21)修改文件;22)给出信息L;23)给出信息M。

(2)步骤二:找出原因与结果之间,原因与原因之间对应的关系。根据这些关系,画出因果图。


(3)步骤三:在因果图上用一些记号表明约束。



(4)步骤四:把因果图转换为判定表。


(5)步骤五:根据判定表的每一行设计测试用例。


2.3两两组合方法:略

2.4正交试验法

1、定义:从大量的测试用例中挑选适量的、有代表的测试用例。

2、正交试验法的适用范围:
(1)适用于输入条件相互独立,并且需要对输入条件的各种组合进行测试的场合。
(2)可以应用于输入域相对较少但对穷举测试而言又过大的问题。

3、正交表L一般表示为:

测试用例的个数n:正交表的行数
因素K:正交表的列数。因素就是测试变量的个数

水平数m:每个因素的 水平数 中的最大值

4、确定了K和m之后,通过正交表查找对应的n。

(1)正交表:

http://support.sas.com/techsup/technote/ts723_Designs.txt(不完整

https://wenku.baidu.com/view/282982fe941ea76e58fa04d3.html?from=search(常用正交表,也不完整)

(2)确定n的方法:

①表中因素(变量)的个数 >=自己要测试的变量数
②表中水平数 >=自己的水平数

③考虑正交表的行数,取行数最少的一个 
④在查找的时候,先确定水平数m,再确定变量数K

5、例子:

(1)有五个因素(变量):
音形码、拼音码、路名码、行业类别和特征码
(2)每个因素有两个水平(变量值):
音形码:填、不填
拼音码:填、不填
路名码:填、不填
行业类别:填、不填

特征码:填、不填

(3)则K=5,m=2;查正交表L8(2^7),所以得到n=8

(4)然后 变量映射,多出来的列数不管,多少个变量数就写多少列。


因此得出8个测试用例。

(5)正常情况下,还得再增加几个测试用例:

只填写一个的测试用例(共5个)

都不填写的测试用例(共1个)

所以得出所有测试用例个数为8+5+1=14,这个数远远小于2^5

3、基于直觉和经验的方法

1、Ad-hoc测试:

定义:自由测试。强调测试人员根据自己的经验,不受测试用例的束缚,放开思路、灵活地进行各种测试。

2、ALAC测试:
定义:想客户那样做。基于客户使用产品的知识开发出来的测试方法。它的出发点是著名的Pareto 80/20规律。

3、错误猜测法:
定义:测试者根据经验、知识和直觉来发现软件错误,来推测程序中可能存在的各种错误,从而有针对性的进行测试
基于思想:某次发现了缺陷,则可能隐藏更多的缺陷。

4、黑盒测试方法选择建议:

通常在确定测试策略时,有以下5条参考建议

(1)在任何情况下都必须采用边界值分析法。这种方法设计出的测试用例发现程序错误的能力最强。
(2)必要时采用等价类划分法补充测试用例。
(3)采用错误猜测法再追加测试用例。
(4)对照程序逻辑,检查已设计出的测试用例的逻辑覆盖程度。如果没有达到要求的覆盖标准,则应当再补充更多的测试用例。
(5)如果程序的功能说明中含有输入条件的组合情况,则应一开始就选用因果图法和判定表法。
(6)对于参数配置类软件,用正交试验法选择较少组合到达最佳效果。

猜你喜欢

转载自blog.csdn.net/ranandrun/article/details/79781450