HIT软件构造:软件测试与测试优先编程

目录

1.软件测试

1.1测试的种类

1.2静态测试 vs 动态测试试静态测试 vs 动态测试

1.3测试 vs 调试 

1.4白盒测试 vs 黑盒测试

1.5为何软件测试较为困难?

2.测试用例

3.测试优先编程

4.黑盒测试(重点)

4.1 通过等价类划分选择测试用例

4.2在分区中包含边界

5.白盒测试

6.代码覆盖度

7.记录测试用例策略

1.软件测试

软件测试是提高软件质量的重要手段,它是执行一个程序或应用程序的过程,目的是发现bug(错误或其他缺陷),并验证该软件产品是否适合使用。

即使是最好的测试,也无法达到100%的无错误,用残留缺陷率(软件发布后遗留下来的错误)每kloc(1000行代码)来衡量软件的质量:

测试的特征
1.测试跟其他活动的目标相反:破坏、证错、“负能量”。
2.再好的测试也无法证明系统里不存在错误。

好的测试标准:1.能发现错误;2.不冗余;3.特性最佳;4.既不复杂也不简单。

1.1测试的种类

Unit testing (单元测试):指验证特定代码部分功能的测试,通常在功能级别。 
Integration testing (集成测试):由多个程序员或编程团队创建的两个或多个类、包、组件、子系统的组合执行。 
System testing (系统测试):测试一个完全集成的系统,以验证该系统满足其要求,并在其最终配置中执行该软件。

1.2静态测试 vs 动态测试试静态测试 vs 动态测试

静态测试:进行静态测试时,并没有实际执行程序。所以,静态测试通常是隐式的,如校对,当编程工具/文本编辑器检查源代码结构或编译器(预编译器)时,检查语法和数据流作为静态程序分析。

动态测试:描述了代码动态行为的测试,它实际上使用给定的测试用例执行编程代码。动态测试可以在程序100%完成之前就开始了,以测试代码的特定部分,并应用于离散的函数或模块。

1.3测试 vs 调试 

测试:发现是否存在错误
调试:识别错误根源,消除错误

1.4白盒测试 vs 黑盒测试

白盒测试:对程序内部代码结构的测试,是通过查看源代码来测试程序的内部结构或工作方式。 

黑盒测试:对程序外部表现出来的行为的测试,将该软件视为一个“黑盒”,在不了解内部实现的情况下检查功能,而不看到源代码。

1.5为何软件测试较为困难?

1.不可能暴力穷举完所以可能的测试案例
2.单纯靠偶然测试是没有意义的
3.基于样本的统计数据对软件测试意义不大。比如工厂里测试一批产品合不合格,那就抽样检测,样品中不合格率小于百分之一则该批产品合格,但这对软件测试是没有意义的
4.对于离散的输入,软件行为差异巨大。 大多数正确,少数点出错
5.无统计分布规律可循

2.测试用例

什么是测试用例?
测试用例是一组测试输入、执行条件和预期结果。即,测试用例={测试输入+执行条件+预期结果}

好的测试用例的特征
1.最可能发现错误;2.不重复、不冗余;3.最有效;4. 既不简单也不复杂

3.测试优先编程

测试优先编程:在编写代码之前先编写测试。

测试优先编程的特点:
1.尽早地、尽可能多地进行测试
2.不要让测试直到最后,因为最后有一大堆未经验证的代码。将测试留到结束只会使调试更长、更痛苦,因为bug可能出现在代码中的任何地方。

测试优先编程一般过程:
先写spec -->  再写符合spec的测试用例 --> 写代码、执行测试、有问题再改、再执行测试用例,直到通过它

4.黑盒测试(重点)

       正如上所说,黑盒测试是一种软件测试的方法,它可以检查应用程序的功能,而不需要窥视其内部结构或工作原理。
       它可以发现以下类型的错误:1.软件功能缺失或者错误;2.接口错误;3.数据结构或外部数据库访问中的错误;4.行为或者性能错误;5.初始化和终止错误。
       黑盒测试的测试用例是围绕规范和要求构建的,即应用程序应该做什么。
       测试用例通常来自于软件的外部描述,包括规范、要求和设计参数。此外,选择一组足够小、可以快速运行,但又足够大、可以验证程序的测试用例。

4.1 通过等价类划分选择测试用例

       等价划分是一种测试方法,它将将被测函数的输入域划分为等价类, 从等价类中导出测试用例。针对每个输 入数据需要满足的约束条件,划分等价类。每个等价类代表着对输入约束加以满足/违反的有效 /无效数据的集合。
        等价类背后的思想是将输入空间划分为相似的输入集合,在这些输入集上程序具有相似的行为,然后使用每个集合的一个代表。

通常等价类划分可以基于以下指导进行:
1.如果输入条件指定了一个范围,则定义一个有效的和两个无效的等价类。
2.如果输入条件需要特定的值,则定义一个有效和一个无效的等价类。
3.如果输入条件指定了集合的成员,则定义一个有效和一个无效的等价类。
4.如果输入条件为布尔值,则分别定义一个有效类和一个无效类。

例如,对于BigInteger中的multiply方法:
我们应该把乘法看作是一个接受两个输入的函数:
所以我们有一个二维的输入空间,由所有的整数对(a,b)组成。 然后从正负的角度对二维空间进行等价类划分。
但是,我们需要考虑一些特殊情况:
1.a or b is 0, 1, or -1?
2.
考虑输入的上限:很大的数是否仍正确?

所以,我们把上述考虑结合在一起,独立地从如下方面选择a和b:
---0
---正1
---负1
---小正整数
---小负整数
---大正整数
---大负整数
这将产生7*7=49分区,完全覆盖整数对的空间。

4.2在分区中包含边界

由于大量的错误发生在输入域的“边界 ”而非中央,如下列各种边界情况(特殊情况):
---0是正数和负数之间的边界
---数值类型的最大值和最小值,如int和double
---集合类型的空性(空字符串、空列表、空数组)
---一个集合的第一个元素和最后一个元素
因此,便应该对于输入数据进行边界值分析,Boundary Value Analysis(BVA)已经发展成为一种测试技术,领导了对边界值的测试用例的选择。它是对等价类划分方法的补充。
例如,对于Math类中的整数max()方法:

– max : int × int → int 
所以,从规范来看,将此函数划分为如下是有意义的:
---a<b
---a=b
---a>b

但是,这划分是基于a与b之间的关系的,a和b自身的输入域,输入边界没有考虑,因此,在如上基础上加入边界值分析,便可得到如下划分:
因此,选择测试用例时应该覆盖以上不同方面,如:
(1, 2) covers a < b, a > 0, b > 0
(-1, -3) covers a > b, a < 0, b < 0
(0, 0) covers a = b, a = 0, b = 0
(Integer.MIN_VALUE, Integer.MAX_VALUE) covers a < b, a = minint, b = maxint
(Integer.MAX_VALUE, Integer.MIN_VALUE) covers a > b, a = maxint, b = minint

有两个极端的覆盖方法对于划分出的等价类:
1.​​​​​​Full Cartesian product 笛卡尔积:全覆盖
---多个划分维度上的多个取值,要组合起来,每个组合都要有一个用例(并非所有组合都是可能的);

2.Cover each part 覆盖每个取值:最少1次即可
---每个维度的每个取值至少被1个测试用例覆盖一 次即可。
前者:测试完备,但用例数量多,测试代价高;后者:测试用例少,代价低,但测试覆盖度未必高。所以,基于谨慎与可行性,可以在这两个极端之间达成一些妥协。

5.白盒测试

黑箱测试意味着只从规约中选择测试用例,而不是从函数的实现中选择。正如上述所说的,我们以multiplymax的规约进行了分区和寻找边界,而没有查看这些函数的实际代码。
白盒测试(也称为玻璃盒测试)意味着选择了解函数如何实际实现的测试用例。
例如,如果实现根据输入选择了不同的算法,那么我们应该根据这些域进行分区。
如果实现保持一个内部缓存,记住对以前的输入的答案,那么我们应该测试重复的输入。
白盒测试一般较早执行,根据程序执行路径设计测试用例,基于系统的内部视角和我们的编程能力设计测试用例。


例如,对于整数列表元素的非递减排序 ,应根据不同的列表大小选择不同的排序方法:

使用白盒测试方法,我们可以从下面准则推导出一些测试用例:
保证一个模块内的所有独立路径都至少执行过一次
从真假的两面做出所有合乎逻辑的决定
在其边界和操作范围内执行所有循环
练习内部数据结构,以确保其有效性

有一种典型的白盒测试方法被称为“独立/基路径测试”对程序所有执行路径进行等价类划 分,找出有代表性的最简单的路径(例如循环只需执行1次),设计测试 用例使每一条基本路径被至少覆盖1次。

6.代码覆盖度

测试应考虑到程序内部逻辑的测试用例的代码覆盖范围。

代码覆盖是一种用于描述特定测试套件运行时程序源代码执行程度的度量。简单地说就是已有的测试用例有多大程度覆盖了被测程序。

一个具有高代码覆盖率的程序, (通常用百 分比衡量覆盖度),在测试过程中执行了更多的源代码,这表明与一个代码覆盖率较低的程序相比,它包含未检测到的软件错误的可能性更低。

 这里有五种常见的覆盖:
–函数覆盖:程序中的每个功能是否都被调用了?
–语句覆盖:每个语句是否都由某个测试用例运行?
–分支覆盖:对于程序中的每一个if or while or switch-case or for它们的正确的和错误的方向是    否都被某个测试用例采取?
–条件覆盖:对于if/while/for/switch-case每个条件,它们的正确的和错误的方向是    否都被    某    个测试用例采取?
–路径覆盖:是否有每个可能的分支组合——通过程序的每一个路径?

测试效果:路径覆盖>分支覆盖>语句覆盖

在工业中,100%的语句覆盖率是一个共同的目标,但即使是这样,也很少由于无法到达的防御代码(比如“永远不应该到达这里”的断言)而实现。

100%的分支覆盖是非常可取的,但是,不幸的是,100%的路径覆盖是不可行的,需要指数大小的测试套件来实现。

为什么路径覆盖需要指数级测试套件呢?
这是由于程序往往包含循环,几乎不可能执行每一条路径,所有我们只能尽量确保覆盖率尽可能高。

例如:

7.记录测试用例策略

测试策略(根据什么来选择测试用例)非常重要,需要在程序中显式记录下来。
目的 在代码评审过程中,其他人可以理解你的测试,并评判你的测 试是否足够充分,并且也方便之后的代码检测

如下,这样能使代码逻辑清晰,便于阅读理解和发现一些缺陷。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我无法回答你的问题,因为提供的引用内容中没有涉及关于软件测试工具调用csf接口的信息。请提供更多相关信息或引用内容,我将尽力为你提供准确的答案。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [快速了解自动化测试工具Parasoft vs Fortify功能对比](https://blog.csdn.net/mnrssj/article/details/117777583)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [HIT-CSF2019 大作业](https://blog.csdn.net/YuanZihan704/article/details/90142332)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [基于AT89S52 单片的频率计](https://download.csdn.net/download/raindream1129/1960215)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值