考试范围
时间: 2021.11.14
题目类型:
- 选择题 15
- 简答题 5-6
- 设计题:充分性、CFG 3-6
- 测试生成题
考试内容:
- 测试基本概念
- 测试生成方法(每个方法都涉及)
- Junit
- 谓词分析
- 边界值
- 充分性和有效性
- 自动机
简介
1. 为什么需要软件测试?
- 软件测试可以避免一些软件的漏洞
- 软件测试可以可以使我们的软件开发更可靠
- 软件测试可以使我们获得更高质量的软件
2. 关于软件测试的一些知识
(1)什么是缺陷(defect)?
- 缺点:运行缓慢。
- 不一致:Ctrl+S 无法保存所有应用程序。
- 用户界面设计缺陷:一个按钮上应该显示5个字,但只能看到3个字
正确的程序:
- 无语法错误
- 运行时无明显错误
- 无不当语句
- 有效输入-正确输出
- 无效输入-正确输出
- 任何可能的输入-正确输出
(2)软件质量(Software Quality)
- 满足用户需求
- 简历合理的进度、成本与功能关系
- 具备拓展性和灵活性
- 能有效处理例外情况
- 保持成本和性能平衡
(3)软件质量保证(Software Quality Assurance)
为了确保软件开发过程和结果符合预期要求,而建立的一些列规程,依照规程和计划采取的一系列活动,以及结果评价。
(4)质量监控(Quality Control)
为达到产品的品质要求所采取的作业技术和活动
3. 软件测试的基本概念
(1)软件测试的定义 (2)验证(Verification) & 确认(Validation) (3)Test & debug (4)软件测试的目的 (5)测试的类型
4. 软件测试在软件发展中扮演的角色
略。
5. 软件测试的基本原则
- 所有测试的标准都是建立在用户需求之上的,测试的目的在于发现系统是否满足规定的需求。
- 尽早的和不断的测试,越早进行测试,缺陷的修复成本就会越低。
- 程序员应避免检查自己的程序,由第三方进行测试更客观有效。
- 穷举测试是不可能的。
- 充分注意测试中的群集现象,一段程序中一发现的错误数越多,其中存在的错误概率越大,因此对发现错误较多的程序段,应进行更深入的测试。
- 设计测试用例时应包括合理输入和不合理输入,以及各种边界条件、特殊情况下要制造极端状态和意外状态。
- 注意回归测试的关联系,往往修改一个错误会引起更多错误。
- 测试应从“小规模”开始,逐步转向“大规模”。
- 测试用例式设计出来,不是写出来的,应根据测试的目的,采用相应的方法设计测试用例,从而提高测试的效率,更多的发现错误,提高程序的可靠性。
- 重视并妥善保存一切测试过程文档(测试计划,测试用例,测试报告等)。
Exercise1
1. What sort of errors are covered by regression testing?
问题:回归测试涵盖了哪些类型的错误?
软件回归测试是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。回归测试主要包括四种类型的错误:
-
数据损坏错误:由于共享数据,这些错误会导致副作用。
-
不适当的控制排序错误:由于执行顺序的变化,这些错误会导致副作用。例如,尝试在将项目放入队列之前将其从队列中删除。
-
资源争用:潜在瓶颈和死锁是此类错误的一些示例。
-
性能缺陷:计时错误和存储利用率错误是此类错误的一些示例。
2. What is an independent test organization? Why is it necessary?
问题:什么是独立测试机构?为什么需要它?
独立测试组织是指测试产品或系统是否符合自愿共识标准的组织。 作为一个独立的测试机构,该机构不应被任何客户、行业组织或任何其他与被测试产品或系统有经济利益的个人或机构所有或控制。 对于按照自愿性共识标准对产品或系统进行认证、列表或标签的组织,它应保持对产品或系统生产的正式定期检查,以确保已列出、已认证或已标记的产品或系统继续满足适当的要求标准。
3. What is interface analysis?
问题:什么是接口分析?
它是对接口要求规范的详细检查。 这里的评估标准是软件与其他硬件、用户和外部软件之间的接口。
继续并更新软件的关键性分析。 关键性被分配给每个软件需求。 当需求组合成功能时,组合成功能,需求的组合关键性形成聚合功能的关键性。
随着需求变化的引入,关键性分析会定期更新,因为这种变化会导致功能关键性增加或降低,具体取决于修订后的需求如何影响系统关键性。
4. Explain all the phases through which we can approach testing using a sample software testing problem. Comment on difficulty of testing.
问题:解释我们可以使用示例软件测试问题进行测试的所有阶段。 评论测试的难度。
测试过程会依次经历单元测试、集成测试、系统测试、验收测试四个主要阶段:
- 单元测试:单元测试是针对软件设计的最小单位––程序模块甚至代码段进行正确性检验的测试工作,通常由开发人员进行。
- 集成测试:集成测试是将模块按照设计要求组装起来进行测试,主要目的是发现与接口有关的问题。由于在产品提交到测试部门前,产品开发小组都要进行联合调试,因此在大部分企业中集成测试是由开发人员来完成的。
- 系统测试:系统测试是在集成测试通过后进行的,目的是充分运行系统,验证各子系统是否都能正常工作并完成设计的要求。它主要由测试部门进行,是测试部门最大最重要的一个测试,对产品的质量有重大的影响。
- 验收测试:验收测试以需求阶段的《需求规格说明书》为验收标准,测试时要求模拟实际用户的运行环境。对于实际项目可以和客户共同进行,对于产品来说就是最后一次的系统测试。测试内容为对功能模块的全面测试,尤其要进行文档测试。
5. What is program slicing?
问题:什么是程序切片?
切片是一种程序分解技术,用于通过代码追溯输出变量,以识别与程序中的计算相关的所有代码语句。
黑盒测试(Black-Box Testing)
概念: 黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能,通过测试来检验每个功能都是否能够正常使用。
黑盒测试用例的设计方法:
- 划分等价类(equivalence class partitioning)
- 边界值分析 BVA(boundary value analysis)
- 划分类别(category partitioning)
- 因果图(cause-effect graph)
- 决策表(decision table)
Exercise2
1. Assume that you have a 10-character-wide ZIP code text box, such as the one shown in Figure 1. What equivalence partitions would you create for this text box?
问题:假设有一个要求输入10个字符的邮政编码,对于该文本框该如何等价分类?
至少含有以下等价区间:
- 特殊字符,如10个*或¥;
- 英文字母,如ABCDefghik;
- 小于十个字符,如123;
- 大于十个字符,如11111111111;
- 数字和其他混合,如123AAAAAAA;
- 空字符;
- 保留字符;
2. What is the difference between weak normal and strong normal equivalence class testing?
问题:弱一般等价类和强一般等价类之间的区别?
弱一般等价类: 遵循单缺陷原则,要求用例覆盖每一个变量的一种取值即可,取值为有效值。
强一般等价类: 遵循多缺陷原则,要求用例覆盖每个变量的每种取值之间的迪卡尔乘积,即所有变量所有取值的所有组合,取值为有效值。
3. Consider a program given below for the selection of the largest of numbers.
main() {
float A, B, C;
printf (“Enter 3 values:”);
scanf (“%d%d%d”, &A, &B, &C);
printf (“Largest value is”);
if (A > B) {
if (A > C)
printf (“%d\n”, A);
else
printf (“%d\n”, C);
} else {
if (C > B)
printf (“%d”, C);
else
printf (“%f”, B);
}
}
a. Design the set of test cases using BVA technique and equivalence class testing technique.
问题:分别使用边界值分析和等价划分类方法设计测试用例。
- A, B, C 中一个或多个为非数字 (无效等价类)
- A>=B and A>=C (有效等价类)
- B>=A and B>=C (有效等价类)
- C>=A and C>=B (有效等价类)
b. Select a set of test cases that will provide 100% statement coverage.
A | B | C |
---|---|---|
10 | 5 | 1 |
5 | 1 | 10 |
1 | 5 | 10 |
1 | 10 | 5 |
c. Develop a decision table for this program.
4. Drive equivalence class for input variables below.
a. int pen_inventory; (表示签字笔的当前库存)
- 有效等价类:非负整数
- 无效等价类:负数、小数或者其他任何形式的非数字的输入
b. string planet_name; (表示行星的名字)
- 有效等价类:已定义过的行星的名字
- 无效等价类:非定义的行星的名字、任何其他形式的特殊输入
c. operating_system={“OS X”, “Windows XP”, “Windows 2000”, “Unix”, “Linux”, “Xinu”, “VxWorks”}; (操作系统的名字)
- 有效等价类:集合中的任何一个操作系统名称
- 无效等价类:除开集合外的任何输入
d. printer_class= set printer_name;(打印机名字的集合) printer_class p;
- 有效等价类:打印机集合中的任何一个名字
- 无效等价类:除了集合中内容外的任何输入
e. int name [1.10]; (一个最多包含10个整数的数组)
- 有效等价类:输入的长度在1到10之间(包括边界)的整数序列
- 无效等价类:空数组、长度超过10的数组、任何形式的包含一位或多位非数字的输入序列
5. Consider an example of grading a student in a university. The grading is done as below:
The marks of any three subjects are considered for the calculation of average marks. Scholarships of $1000
and $500
are given to students securing more than 90% and 85% marks, respectively. Develop a decision table, cause effect graph, and generate test cases for the above scenario.
问题: 计算平均分时,会考虑任何三门科目的分数。 分别为分数超过 90% 和 85% 的学生提供 1000 美元和 500 美元的奖学金。 针对上述场景开发决策表、因果图并生成测试用例。
cause:
- c1 平均分大于90%
- c2 平均分等于90%
- c3 平均大于85%且平均分小于90%
- c4 平均分大于等于75%且小于等于85%
- c5 平均分大于等于60%且小于等于74%
- c6 平均分大于等于50%且小于等于59%
- c7 平均分大于等于0%且小于50%
effect:
- e1 A+
- e2 A
- e3 B
- e4 C
- e5 Fail
- e6 获得1000奖学金
- e7 获得500奖学金
决策表:
因果图:
测试用例:
列举三个成绩的平均值分别对应cause中的几种情况
白盒测试(White-Box Testing)
概念: 把测试对象看做一个透明的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。
白盒测试基本要求:
- 保证一个模块中的所有独立路径至少被执行一次;
- 对所有的逻辑值均需要测试真、假两个分支;
- 在上下边界及可操作范围内运行所有循环;
- 检查内部数据结构以确保其有效性。
测试覆盖标准:
-
语句覆盖:是一个比较弱的测试标准,它的含义是:选择足够的测试用例,使得程序中每个语句至少都能被执行一次。
- 它是最弱的逻辑覆盖,效果有限,必须与其它方法交互使用。
-
判定覆盖(也称为分支覆盖):执行足够的测试用例,使得程序中的每一个分支至少都通过一次。
- 判定覆盖只比语句覆盖稍强一些,但实际效果表明,只是判定覆盖,还不能保证一定能查出在判断的条件中存在的错误。因此,还需要更强的逻辑覆盖准则去检验判断内部条件。
-
条件覆盖:执行足够的测试用例,使程序中每个判断的每个条件的每个可能取值至少执行一次。
- 条件覆盖深入到判定中的每个条件,但可能不能满足判定覆盖的要求。
-
判定/条件覆盖:执行足够的测试用例,使得判定中每个条件取到各种可能的值,并使每个判定取到各种可能的结果。
-
条件组合覆盖:执行足够的例子,使得每个判定中条件的各种可能组合都至少出现一次。
- 这是一种相当强的覆盖准则,可以有效地检查各种可能的条件取值的组合是否正确。
- 它不但可覆盖所有条件的可能取值的组合,还可覆盖所有判断的可取分支,但可能有的路径会遗漏掉。
- 测试还不完全。
白盒测试的主要方法:
-
逻辑驱动测试
- 语句覆盖
- 判定覆盖
- 条件覆盖
- 判定/条件覆盖
- 条件组合覆盖
-
路径测试
- 路径测试就是设计足够多的测试用例,覆盖被测试对象中的所有可能路径。这是最强的覆盖准则。
- 基本路径测试:设计足够多的测试用例,运行所测程序,要覆盖程序中所有可能的路径。但在路径数目很大时,真正做到完全覆盖是很困难的,必须把覆盖路径数目压缩到一定限度。例如程序中的循环体只执行一次。
Exercise3
1. The basis set for a program is constructed using its CFG(Control Flow Graph). Now suppose that the program contains compound predicates. Do you think the basis set for this program will depend on how compound predicates are represented in the flow graph? Explain your answer.
问题:程序的基本组成是使用控制流图构建的。现在假设程序包含复合谓词,你认为复合谓词在流程图中的表示方式会决定这个程序的基本组成吗? 解释你的答案。
不会。当一个普通的流程图中有复合谓词时,这些谓词之间会指示出不止一个基本路径。为了给程序构建一个基集,复合谓词应该被拆分成不能再分解的节点,以暴露更详细的路径,这有利于以后更彻底地创建测试用例。
2. Example 2. 1 Consider the following program that takes two non-negative integers x1 and y1 as inputs and computes their greatest common divisor.
(a) List the different paths in the program in Example2.1 when the loop body is traversed twice.
问题: 列出例 2.1 中程序中循环体被遍历两次时的不同路径。
流程控制图:
路径:
P1 = { Start, 1, 2, 3, 4, 5, 3, 4, 5, 3, 7, End }
P2 = { Start, 1, 2, 3, 4, 5, 3, 4, 6, 3, 7, End }
P3 = { Start, 1, 2, 3, 4, 6, 3, 4, 5, 3, 7, End }
P4 = { Start, 1, 2, 3, 4, 6, 3, 4, 6, 3, 7, End }
(b) For each path list the path conditions and a few sample values in the corresponding input domain.
问题: 对于每个路径,列出相应输入域中的路径条件和一些示例值。
3. struct a program in your favorite language that inputs three integers x, y, and z and computes output O using the specification in Table 1. Assume that f 1 (x, y, z) = x + y + z and f 2 (x, y, z) = x * y * z.
Introduce an error in your program. Now construct a test set Τ that is decision-adequate, but is not multiple condition-adequate, and does not reveal the error you introduced. Enhance Τ so that it is multiple condition-adequate and does reveal the error. Will all tests that are multiple condition-adequate for your program reveal the error?
下面一段代码的边界处处理有问题:
function f1(x, y, z) {
return x + y +z
}
function f2(x, y, z) {
return x*y*z
}
function answer(x, y, z) {
if(x < y) {
return x <= z ? f1(x, y, z) : f2(x, y, z)
}
return x <= z ? f2(x, y, z) : f1(x, y, z)
}
结果符合预期:
T1 = {
t1 = < x = 3, y = 5, z = 7>, // expected: 15
t2 = < x = 5, y = 7, z = 3>, // expected: 105
t3 = < x = 5, y = 3, z = 7>, // expected: 105
t4 = < x = 7, y = 5, z = 3> // expected: 15
}
测试出程序有问题:
T2 = {
t1 = < x = 3, y = 5, z = 7>, // expected: 15
t2 = < x = 5, y = 7, z = 3>, // expected: 105
**t3 = < x = 6, y = 7, z = 6>,** **/** **/ expected: 252**
t4 = < x = 5, y = 3, z = 7>, // expected: 105
**t5 = < x = 4, y = 4, z = 7>, // expected: 112**
t6 = < x = 7, y = 5, z = 3>, // expected: 15
t7 = < x = 3, y = 3, z = 3> // expected: 9
}
Exercise4
BOR
BRO
1. Consider the condition C : (a + 1 > b)∧ (c = d) , where a, b, c, and d are type compatible variables.
(a) Let S1 = {(>, =), (>, >), (>, <), (=, =),(<, =)} be a set of constraints on C. please construct a test set T1 that satisfies S1 and show that T is BRO-adequate.
(b) Now consider the constraint set S2 = {(+ϵ, =), (=, –ϵ), (–ϵ, =), (+ϵ, +ϵ)} on C. Construct a test set T2 that satisfies S2 . Is T BRE adequate ? Assume that ϵ = 1
2. Let A = {(<, =), (>, <)} and Β = {(t, =), (t, >), (f, <)} be two constraint sets. Compute A × B and A ⊗ B.
A × B = {(<, =, t, =), (<, =, t, >), (<, =, f, <), (>, <, t, =), (>, <, t, >), (>, <, f, <)}
A ⊗ B = {(<, =, t, =), (>, <, t, <), (>, <, f, <)}
3. Consider the cause-effect graph shown in Figure 1 that exhibits the relationship between several causes and effect E.
(1) Derive a test set T CEG to test the implementation of Ε using the test generation procedure described in Cause-effect graphing.
(2) Construct a Boolean expression p r from the Figure1 that represents the condition for the effect to occur. Select one of the two procedures BOR-CSET, BRO-CSET and apply it to construct a test set from p r . Assume that there might be errors in the relational expressions that represent various causes effecting E. Construct a test set T B from the constraints you derive.
(1)
E = -( (a<b) ^ (c >d) ) V ( w )
T_CEG = {
t1: <a=1, b=2, c=1, d=0, w=t>,
t2: <a=1, b=2, c=1, d=1, w=t>,
t3: <a=1, b=0, c=1, d=0, w=t>,
t4: <a=1, b=0, c=1, d=1, w=t>,
t5: <a=1, b=1, c=1, d=1, w=f>,
t6: <a=1, b=0, c=1, d=0, w=f>,
t7: <a=1, b=0, c=1, d=1, w=f>,
t8: <a=1, b=1, c=1, d=0, w=f>,
}
(2)
Pr = -( (a<b) ^ (c >d) ) V ( w )
BRO
单元测试(Unit Testing)
集成测试(Integration Testing)
性能测试(Performance Testing)
Exercise5
1. How to conduct performance testing?
问题:如何进行性能分析?
- 性能需求分析
- 测试准备
- 测试执行
- 结果分析和调优
- 报告和总结
2. 案例分析:针对某公司办公自动化(OA)系统的负载压力测试,采用专业的负载压力测试工具来执行测试。系统采用 Browse/Server 架构,服务器是一台 PC Server (4 路 2.7GHz 处理器, 4GB 内存),安装的平台软件包括 Microsoft Internet Information Server 5.0,ASP.NET, SQLServer 2000。使用 2 台笔记本电脑安装测试工具模拟客户端执行“登录”业务操作。
测试需求分别为以下两个:
第一,测试系统分别在 2M、4M 网络带宽下,能够支持用户登录的最大并发用户数;
第二,测试服务器的吞吐量(即:每秒可以处理的交易数),主要包括服务器 CPU 平均使用率达到 85%时系统能够支持的最大吞吐量和服务器 CPU 平均使用率达到 100%时系统能够支持的最大吞吐量。
本次性能测试的测试目标是:
1) 指标“响应时间”合理范围为 0~5 秒,可支持的最大并发用户数;
2) 评测系统的服务器资源是否合理,是否需要进行改进。
3) 网络带宽是否使用合理。
作为一个测试人员,你准备怎么实施本项任务?
结合第一题的几个步骤自己发挥
系统测试(System Testing)
系统测试概念
系统测试方法
系统测试过程
FSM(自动机)