一、等价类
1.1 定义
-
等价类划分是一种重要的、常用的黑盒测试方法;
-
不需要考虑程序的内部结构,只需要考虑程序的输入规格即可;
-
它将不能穷举的测试过程进行合理分类,从而保证设计出来的测试用例具有完整性和代表性;
-
用户所有可能输入的数据,划分成了若干个子集,然后从没一个子集当中选取少数具有代表性的数据作为测试用例;
-
在测试资源有限的情况下,用少量有代表性的数据得到比较好的测试效果。
1.2 划分
有效等价类:指符合《需求文档》,输入合理的数据集合;
无效等价类:指不符合《需求文档》,输入不合理的数据集合。
1.3 划分原则
-
规定输入的取值范围或个数时,则划分一个有效和两个无效;
-
规定输入的集合或规则必需要遵循的条件,则划分一个有效和一个无效;
-
输入条件是一个布尔值,则划分一个有效和一个无效;
-
输入条件是一组数据,且每个输入的值做不同的处理,则划分若干个有效和一个无效;
-
输入条件规定了必须要遵循的某些规则下,则划分一个有效和若干个无效;
-
不是所有的等价类都有无效等价类。
1.4 设计步骤
-
先划分等价类:找出所有可能的分类;
-
确定有效等价类:需求中的条件;
-
确定无效等价类:与条件相反的情况,再找到特殊情况;
-
从各个分类中挑选测试用例数据。
二、边界值
2.1 定义
-
大量的软件测试实践表明,故障往往出现在定义域或值域的边界上,而不是在其内部;
-
为检测边界附近的处理,专门设计测试用例,通常都会取得很好的测试效果;
-
边界值分析法是一种很实用的黑盒测试用例方法,它具有很强的发现故障的能力;
-
边界值分析法是作为对等价类划分法的补充,测试用例来自等价类的边界。
2.2 确定方法
-
上点:边界上的点;
-
离点:离上点最近的点;
-
内点:在输入域内任意一个点;
-
选取正好等于、刚好大于或刚好小于边界值作为测试数据。
2.3 划分规则
场景 | 取值 |
---|---|
如果规定了输入域的取值范围 | 选取刚好在范围边界的点、刚好超过边界的点 |
如果规定了输入值的个数 | 选取最大个数、最小个数、比最小个数少1、比最大个数多1 |
如果规定了输入是一个有序的集合 | 选取集合的第一个元素、最后一个元素 |
三、因果图
3.1 定义
-
因果图法是一种利用图解法分析输入的各种组合情况,从而设计测试用例的方法;
-
它适合于检查程序输入条件的各种组合情况:
-
“因”——输入条件
-
“果”——输出结果
-
3.2 使用场景
-
描述多种条件的组合;
-
产生多个动作。
3.3 基本符号
符号 | 描述 |
---|---|
恒等 | 若原因出现,则结果出现;若原因不出现,则结果也不出现 |
非 | 若原因出现,则结果不出现;若原因不出现,则结果出现 |
或 | 有多个原因。若几个原因中有一个出现,则结果出现;若几个原因都不出现,则结果不出现 |
与 | 有多个原因。若几个原因都出现,则结果才出现;若其中一个原因不出现,则结果不出现 |
3.4 互斥条件
条件 | 描述 |
---|---|
互斥(E) | a、b、c只能有一个成立,但是可以都不成立 |
包含(I) | a、b、c中至少有一个成立 |
唯一(O) | a、b、c有且仅有一个成立 |
要求(R) | 如果a成立,则要求b必须也成立,其他的不约束 |
屏蔽(M) | 如果a成立的时候,强制b不成立,其他的不约束 |
3.5 基本步骤
-
找出所有的输入条件(因);
-
找出所有的输出条件(果);
-
明确所有输入条件之间的制约关系以及组合关系;
-
明确所有输出条件之间的制约关系已经组合关系;
-
找出什么样的输入条件组合会产生哪种输出结果;
-
把因果图转换成判定表;
-
为判定表中的每一列表示的情况设计测试用例。
四、判定表
4.1 定义
-
因果图只是一种辅助工具,通过分析最终得到判定表,再通过判定表编写测试用例。
-
画因果图非常麻烦,影响测试效率,可以直接写判定表,进而编写测试用例。
4.2 组成部分
-
条件桩:问题的所有条件
-
动作桩:问题的所有输出
-
条件项:针对条件桩的取值
-
动作项:条件项的各种取值情况下的输出结果
4.3 设计步骤
-
列出所有的条件桩和动作桩
-
确定规则数:条件取值个数^条件数
-
填入条件项
-
填入动作项,得到初始判定表
-
简化判定表
4.4 举例说明
- 判断三角形
-
输入三个正整数 * a、b、c,分别作为三角形的三条边
-
判断三条边是否能构成三角形
-
如果能构成三角形,判断三角形的类型(等边三角形、等腰三角形、一般三角形)
-
- 确定条件桩
- C1:a,b,c 构成三角形?a<b+c、b<a+c、 c<a+b
- C2:a = b?
- C3:a = c?
- C4:b = c?
- 确定动作桩
- A1:非三角形;
- A2:不等边三角形;
- A3:等腰三角形;
- A4:等边三角形;
- A5:不可能
-
确定条件项和动作项
-
设计判定表
-
简化判定表
-
设计测试用例
五、场景法
5.1 定义
- 场景法就是模拟用户操作软件时的场景,主要用于测试系统的业务流程。
- 基本流:按照正确的业务流程来实现的一条操作路径;
- 备选流:导致程序出现错误的操作流程。
5.2 用例设计步骤
- 根据需求规格说明书,画出功能模块流程图;
- 根据流程图,描述出程序的基本流及备选流;
- 根据基本流和备选流生成不同的场景,构造场景列表;
- 对每一个场景生成相应的测试用例;
- 对生成的所有测试用例重新复审,去掉多余的测试用例;
- 测试用例确定后,为每一个测试用例确定测试数据值。
5.3 举例说明
- 对淘宝网购物流程设计测试用例:
-
画流程图
-
确定基本流
(1)进入淘宝首页
(2)浏览商品
(3)进入单品页
(4)选择商品规格和数量
(5)加入购物车
(6)前往购物车
(7)选择商品
(8)结算,进入确认订单页
(9)提交订单
(10)付款成功
(11)等待收货
(12)确认收货 -
确定备选流
-
备选流 1:加入购物车时,不选择商品规格和型号,返回基本流第 4 步
-
备选流 2:加入购物车时,商品库存不足,返回基本流第 4 步
-
备选流 3:加入购物车时,未登录,登录后返回基本流第 3 步
-
备选流 4:加入购物车后,继续选购,返回基本流第 4 步
-
备选流 5:加入购物车,未选择商品,结算,返回基本流第 7 步
-
备选流 6:支付失败,返回基本流第 8 步
-
备选流 7:未选择商品加入购物车,退出购物,结束
- 构造场景
-
场景 1: 登录后成功购物(基本流)
-
场景 2: 未选择商品规格和型号就添加购物车(基本流 + 备选流 1)
-
场景 3: 选择的商品库存不足(基本流 + 备选流 2)
-
场景 4: 未登录添加购物车(基本流 + 备选流 3)
-
场景 5: 商品添加购物车后继续购物(基本流 + 备选流 4)
-
场景 6: 进入购物车,未选择商品直接结算(基本流 + 备选流 5)
-
场景 7: 支付过程出错(基本流 + 备选流 6)
-
场景 8: 没有添加商品到购物车(基本流 + 备选流 7)
- 生成测试用例
六、正交法
6.1 定义
-
正交法(Orthogonal Array)是一种设计实验方案和测试用例的统计方法,旨在通过有限次试验来研究多个因素对结果的影响,同时尽可能减少试验次数。
-
正交法的主要特点是,通过一种合理的方法选择一组试验参数的组合,以实现对所有可能的参数组合进行有效的覆盖,从而节省试验资源和成本。
-
正交法的核心思想是,在所有可能得因素组合中,选择一组互相正交的因子水平组合,以尽可能少的试验次数来观察所有因素得影响。
6.2 使用场景
-
多参数系统:当系统具有多个输入参数,而且这些参数之间存在相互影响时,正交法特别有用。
-
多条件覆盖:当需要覆盖不同的条件组合,以测试系统在不同情况下的行为。
-
资源有限:当测试资源有限,需要在较小的测试用例集中获得尽可能广泛的覆盖。
6.3 操作步骤
-
确定测试参数和取值范围:识别系统的输入参数和条件。这可能包括各种参数、设置、状态等。
-
确定正交表和参数等级:根据参数数量和取值范围,选择合适的正交表。
-
设计正交表:使用正交表,根据系统的输入参数和条件构建正交表。
-
生成测试用例:从正交表中选择测试用例,以覆盖尽可能多的参数组合。确保所选用例能够测试系统的各个方面。
七、基于模型的测试
7.1 简介
-
基于模型的测试是基于模型的设计的应用,用于设计和可选地执行工件以执行软件测试或系统测试。
-
模型可用于表示被测系统 (SUT) 的期望行为,或表示测试策略和测试环境。
7.2 Model-based Testing 中的 model
-
描述 SUT 的模型通常是对 SUT 所需行为的抽象、部分表示。
-
从这种模型派生的测试用例是与模型在同一抽象级别上的功能测试。
-
这些测试用例统称为抽象测试套件。抽象测试套件不能直接针对 SUT 执行,因为该套件处于错误的抽象级别。
-
可执行的测试套件需要从相应的抽象测试套件派生而来。可执行测试套件可以直接与被测系统通信。
-
这是通过将抽象测试用例映射到适合执行的具体测试用例来实现的。
-
在一些基于模型的测试环境中,模型包含足够的信息来直接生成可执行的测试套件。
-
在其他情况下,抽象测试套件中的元素必须映射到软件中的特定语句或方法调用,以创建具体的测试套件。这被称为解决“映射问题”。
7.3 模型构建方法
- 有限状态机
- UML
- 编程语言
- 数学方法
7.4 Model-based Testing 中的 testing
-
测试可以通过不同的方式从模型中导出。因为测试通常是实验性的并且基于启发式,所以没有已知的单一测试推导的最佳方法。
-
通常将所有与测试派生相关的参数合并到一个包中,该包通常被称为“测试需求”、“测试目的”甚至“用例”。
-
这个包可以包含关于模型中应该关注的那些部分的信息,或者完成测试的条件(测试停止标准)。
Because test suites are derived from models and not from source code, model-based testing is usually seen as one form of black-box testing.
Model-based Testing for complex software systems is still an evolving field.
因为测试套件源自模型而不是源代码,基于模型的测试通常被视为一种形式的黑盒测试。 复杂软件系统的基于模型的测试仍然是一个不断发展的领域。
7.5 基于模型的测试方法(维基百科与百度百科)
-
基于模型的测试(英语:Model-based Testing)属于软件测试领域的一种测试方法。
- 按照此方法,测试用例可以完全或部分的利用模型自动产生。
- 以上所说的模型通常是指对被测系统(SUT,system under test)某些(通常是功能性的)方面的描述。
-
模型一般都是对被测系统预期行为动作的抽象描述。
-
这些测试用例的集合就是抽象测试套件(abstract test suite)。
-
抽象测试套件不可以直接执行于需测试的系统,因为,他们不在同一抽象级别。
-
-
测试套件(test suites)是由模型生成,而不是由源代码生成。因此,基于模型的测试又常常被当作黑盒测试的一种形式。但从某种层面来说,这并不十分准确。毕竟,基于模型的测试是与源代码级的测试覆盖率,以及对代码的功能测试都有着很大的关系。
7.6 行业案例
7.6.1 MBT 在微软的实践案例
-
十多年来,Microsoft 已成功地将基于模型的测试 (MBT) 应用到其内部开发过程中。
-
MBT 已被证明是一种成功的技术,适用于各种内部和外部软件产品。多年来,它的采用率稳步上升。
-
相对而言,它在测试界很受欢迎,尤其是与其他在测试范围内“正式”方面的方法相比。
7.6.2 Spec Explorer
- Spec Explorer 是一个 Microsoft MBT 工具,它扩展了 Visual Studio,为创建行为模型提供了一个高度集成的开发环境,以及一个用于检查这些模型的有效性并从中生成测试用例的图形分析工具。
- 我们相信这个工具是促进 MBT 作为一种有效技术在 IT 行业中的应用、缓解自然学习曲线并提供最先进的创作环境的转折点。
7.6.3 GraphWalker an open-source model-based testing tool
- Editor
- Command line tools
- Integrate GraphWalker in your java project
实战
- 核心概念
- An edge represents an action, a transition.
- A vertex represents verification, an assertion.
- A model is a graph, which is a set of vertices and edges
- GraphWalker 开源项目地址
- graphwalker-cli-4.3.1.jar
- graphwalker-studio-4.3.1.jar
- graphwalker player
- GraphWalker 流程
- 创建模型
- 生成抽象测试套件
- 映射可执行测试套件
- 执行测试
- 启动 Studio 设计模型
java -jar graphwalker-studio-4.3.1.jar
- 测试套件生成器算法
- 路径覆盖
- random(edge_coverage(100))
- random(edge_coverage(50))
- 状态覆盖
- random(vertex_coverage(100))
- random(vertex_coverage(50))
- 达到特定状态
- a_star(reached_vertex(v_VerifyFirstAction))
- a_star(reached_edge(e_SomeAction))
- 保存模型
{
"models": [
{
"name": "SmallTest",
"id": "cbca8c67-6d0c-40b4-8afb-032b069a4bc1",
"generator": "random(edge_coverage(100))",
"actions": [],
"vertices": [
{
"id": "d9c15804-24de-47ca-9430-9cb93202d9ff",
"name": "v_VerifyInitialState",
"actions": [],
"requirements": [],
"properties": {
"x": 206.9166717529297,
"y": 54.41667175292969
}
},
{
"id": "fd4435f7-6a42-4a8b-a522-49c6b91a85e1",
"name": "v_VerifyFirstAction",
"actions": [],
"requirements": [],
"properties": {
"x": 348.9166717529297,
"y": 368.4166717529297
}
},
{
"id": "3dbb2cf6-1ac9-4858-9fd8-bc6b874c1daf",
"name": "v_NewVertex",
"actions": [],
"requirements": [],
"properties": {
"x": 98.91667175292969,
"y": 228.4166717529297
}
}
],
"edges": [
{
"id": "9a6b8be2-3e0c-4e8d-bb38-21107b66a4d3",
"name": "e_FirstAction",
"actions": [],
"requirements": [],
"properties": [],
"sourceVertexId": "d9c15804-24de-47ca-9430-9cb93202d9ff",
"targetVertexId": "fd4435f7-6a42-4a8b-a522-49c6b91a85e1"
},
{
"id": "6034d0f8-9850-4d67-9ddf-02a24c35890e",
"name": "e_AnotherAction",
"actions": [],
"requirements": [],
"properties": [],
"sourceVertexId": "fd4435f7-6a42-4a8b-a522-49c6b91a85e1",
"targetVertexId": "3dbb2cf6-1ac9-4858-9fd8-bc6b874c1daf"
},
{
"id": "71d24b33-fe8e-49ab-9fcc-10cc985dcdeb",
"name": "e_SomeAction",
"actions": [],
"requirements": [],
"properties": [],
"sourceVertexId": "3dbb2cf6-1ac9-4858-9fd8-bc6b874c1daf",
"targetVertexId": "fd4435f7-6a42-4a8b-a522-49c6b91a85e1"
},
{
"id": "2d241ce5-ac46-4f23-85b8-2253c4ce8bed",
"name": "e_SomeOtherAction",
"actions": [],
"requirements": [],
"properties": [],
"sourceVertexId": "3dbb2cf6-1ac9-4858-9fd8-bc6b874c1daf",
"targetVertexId": "3dbb2cf6-1ac9-4858-9fd8-bc6b874c1daf"
}
],
"startElementId": "d9c15804-24de-47ca-9430-9cb93202d9ff"
}
]
}
- 生成可执行测试
#生成样本项目
mvn archetype:generate -B \
-DarchetypeGroupId=org.graphwalker \
-DarchetypeArtifactId=graphwalker-maven-archetype \
-DgroupId=com.ceshiren.hogwarts \
-DartifactId=HogwartsMBT \
-DarchetypeVersion=LATEST
#保存设计好的模型文件到 src/main/resources/com/ceshiren/hogwarts/PetClinic.json
mvn graphwalker:generate-sources
- 运行测试
mvn graphwalker:test
- GraphWalker Player 可视化运行测试用例
curl https://raw.githubusercontent.com/GraphWalker\
/graphwalker-player/master/index.html -O
#使用浏览器打开如下地址
file:///Users/seveniruby/ke/mbt/index.html?wsURI=127.0.0.1:8887
#在代码中开启 websocket server
#执行测试
mvn clean \
graphwalker:generate-sources \
compile \
exec:java -Dexec.mainClass=com.company.runners.WebSocketApplication
//在代码中开启 websocket server
WebSocketServer server = new WebSocketServer(8887, executor.getMachine());
server.start();