软件构造学习笔记第二章——软件测试与测试优先的编程

目录

1.软件测试

1.1什么是软件测试

1.1.1软件测试是提高软件质量的重要手段(并非唯一、决定性手段,软件测试只能提高正确性)

1.1.2软件错误在所难免

1.1.3什么是好的测试

1.1.4测试的种类

1.1.5测试vs调试(Testing vs. Debugging)

1.1.6白盒测试vs黑盒测试(White-box testing vs. Black-box testing)

1.1.7为什么软件测试如此之难

1.1.8应该怎么做

2.测试用例

2.1什么是测试用例

2.2什么是好的测试用例

3.测试优先编程(不推荐)

3.1一些术语

3.2测试优先编程的过程

4.黑盒测试(重点)

4.1黑盒测试发现的错误

4.2测试过程

4.3黑盒测试的测试用例

5.系统性测试

6.等价类划分法选测试用例(用于黑盒测试)

6.1等价类划分思想

 6.2等价类划分标准

6.3边界值分析(等价类划分的补充)

6.4测试用例的覆盖

7.白盒测试

7.1白盒测试主要用途

7.2覆盖度测试工具

8.记录测试策略


1.软件测试

1.1什么是软件测试

1.1.1软件测试是提高软件质量的重要手段(并非唯一、决定性手段,软件测试只能提高正确性)

①软件测试是一个以找bug为目的的过程,并且检验该软件是否达到可用级别(用户需求)。

②软件测试只关注某一侧面的特性,比如该软件主要执行的功能是什么,我们就要集中精力在这个主要功能上,让它尽可能避免出错。

1.1.2软件错误在所难免

①即使是再好的测试,也不能达到百分之一百无错误,也无法证明系统里不存在错误。

②残留缺陷率(defects/kloc):每一千行代码出现的错误个数。评判标准如下:

1.1.3什么是好的测试

①能发现错误

②不冗余(不会重复去测试一些已经测试过的数据或者同类的数据)

③重点关注软件的最佳特性(1.1.1的②部分已经说过)

④别太复杂也别太简单

1.1.4测试的种类

①单元测试(unit testing):对每个类、或者是每个类中的方法进行测试。设想以下场景,如果不进行单元测试,等到整个工程写完再进行整体测试,那么我们就很难找出bug出现在哪里,然后进行修改。如此处只对这个Display这个类进行测试,简单地看运行结果。

使用Junit进行测试:JUnit API

②集成测试(integration testing):对若干个类或若干个包或若干个组件等一起执行。如此处运行了Clock.java,但其实是对整个clock包测试,因为Clock类是我写的主要掌管其它类的类。

③系统测试(system testing):指在不同的系统上测试,具体一点说呢,比如程序员一般是开发端,然后开发好后,能在开发端正常运行,但不一定能在用户端正常运行,此时就要在用户端进行一波测试。

④回归测试:每次改bug时,可能会引起其它错误,因此每次修改完代码,最好是把之前的测试用例全都跑一遍。如果每次修改一次代码跑一次,那工作量挺大的,因此有专门的工具在此方面发挥作用。

⑤动态测试(dynamic testing):所谓动态,指的是用在程序运行时跑测试用例。

⑥静态测试:为什么有了动态测试还要有静态测试呢?因为有些bug存在与运行无关,举一个例子,假设程序中存在一个除数可能为0的bug,但在运行过程中,只要我们输入的数不为0,就不会发生错误,静态测试就是为了寻找这一类隐藏的bug。

1.1.5测试vs调试(Testing vs. Debugging)

①测试:发现是否存在错误

②调试:识别错误根源,消除错误。

可以说,是先有测试,发现存在错误了,然后才能去找错误根源并且消除错误。

1.1.6白盒测试vs黑盒测试(White-box testing vs. Black-box testing)

①白盒测试:关注程序内部的逻辑。白盒测试能发现程序运行路径的错误,比如哪一条语句没有被执行,或者哪一个条件没有被执行等等。

②黑盒测试:关注程序外部功能。能发现接口的错误,功能缺失的错误,数据类型的错误(比如我是要输入一个二元组型的数据,但是却报错了,因此可以推出是数据类型的错误)

1.1.7为什么软件测试如此之难

①不可能暴力穷举完所以可能的测试案例

②单纯靠偶然测试是没有意义的

③基于样本的统计数据对软件测试意义不大。比如工厂里测试一批产品合不合格,那就抽样检测,样品中不合格率小于百分之一则该批产品合格,但这对软件测试是没有意义的。

④对于离散的输入,软件行为差异巨大。

1.1.8应该怎么做

在编写软件时,可以是防御式编程,在测试软件时,要心狠手辣想方设法让它出错。

2.测试用例

2.1什么是测试用例

测试用例 = 输入 + 执行条件 + 期望输出

测试用例可以看做是一个三元组,输入和期望输出好理解,执行条件则说明了测试用例是具备特定性的,即某一种测试用例只是用来测试某一个软件或者类或者包的执行情况的。

2.2什么是好的测试用例

①能发现错误

②不冗余(不会重复去测试一些已经测试过的数据或者同类的数据)

③重点关注软件的最佳特性(1.1.1的②部分已经说过)

④别太复杂也别太简单

3.测试优先编程(不推荐)

3.1一些术语

(图片源于网络)

①module:模块是软件的一部分,它可以独立于其它模块地被设计、执行、测试 。通常指的可以是函数、类、包等。

②specification:这玩意百度翻译成规格,让人难以理解。其实它描述了一个模块的行为,即这个模块所要做的事情,它还规定了模块接口的参数类型以及返回值类型。

③implementation:模块的内容,即要编程的内容。

④test case:一个测试用例。

⑤test suite:一个模块的测试用例集合。

⑥client:意译为用户输入的信息。

3.2测试优先编程的过程

(图片源于网络)

①写出模块所要求的行为、接口类型以及返回值类型。

②编写测试用例。

③编程。

4.黑盒测试(重点)

4.1黑盒测试发现的错误

①不正确或者缺失的功能

②接口错误

③数据类型的错误或者外部数据库中访问的错误

④初始化和终止时的错误(?)

4.2测试过程

4.3黑盒测试的测试用例

黑盒测试的用例就是根据我期望这个程序要实现什么功能去设计用例来检验这些功能是否正确,它只能检测一部分代码(实现功能那一部分)是否正确,而且测试用例无法覆盖所有的功能要求,因此需要多设置几个测试用例尽可能覆盖更多的功能要求。

5.系统性测试

相比于之前暴力穷举测试、偶然性测试、基于概率的测试,这里提出了一个系统性测试,即我们选择测试用例时可以分别或者同时遵循以下原则:正确性,彻底性,尺寸小。

①正确性:根据spec给定一组测试用例,即只要所写的函数模块功能没问题,这些测试用例都是可以通过的。这样的好处是,我们可以任意改变模块内的代码而不用去修改测试用例。②彻底性:一组测试用例尽可能多检测出程序的bug。

 ③尺寸小:测试用例不必太多,这样的话当函数功能需求改变时,这些测试用例也可以不必做很大的调整,而且能够进行很快测试。

 (以上图片均源于网络)

6.等价类划分法选测试用例(用于黑盒测试)

6.1等价类划分思想

根据被测函数的输入域(输入域包含有效域和无效域)来划分等价类,并从等价类中导出若干测试用例。比如说,函数要求(条件)输入的是大于0的奇数(有效域),那么输入域则可以是任意,可以划分的等价类有负数、零、大于零的偶数、大于零的奇数、字符、小数。

 6.2等价类划分标准

可以根据函数的有效域得出划分标准。

①有效域是数值范围:比如有效域是0~10,则可以划分为<0,=0,=10,>10。

②有效域是特定的值:比如有效域是{0,1,2},则可以划分为0,1,2,以及其余剩下的数。

③有效域是Y/N:简单。

可以根据函数输出的情况得出划分。

①例如当输入a>b时输出1,a=b时输出0,a<b时输出2,因此就可以划分为a<b、a=b、a>b的情况。

注:还可以考虑,输入的数据超出上限怎么办,要求输入的是数字而我输入字符怎么办。

 (多维划分等价类例子) 

6.3边界值分析(等价类划分的补充)

即在等价类划分的边界处取值作为测试用例。例如:

①0是正数和负数的边界

②数字类型(比如int型)的最大值和最小值

③集合的空,比如空串、空数组。

④数组或字符串的第一个和最后一个元素。

6.4测试用例的覆盖

由于输入有时候是多维的,每一个维度都具有等价类划分,由此引出两种关于测试用例的选取。两种方法各有优劣。

①笛卡尔乘积法(全覆盖)

举个例子,假如有两个输入,第一个输入对应的等价类划分为{1,2,其它值},第二个输入对应的等价类划分为{5,6,其它值},则测试用例至少选3*3种,有(1,5),(1,6),(1,其它值),(2,5),(2,6),...,(其它值,其它值)。

这种方法的优点是覆盖完备,缺点是测试用例多,代价大。

②部分覆盖

再以上例为例,只要我们选了(1,任意值)的测试用例,则第一个输入的第一个维度就考虑结束了,不必还要继续选(1,5)或(1,6)等等。

这种方法优点测试用例少,代价小,缺点是覆盖度未必高。

7.白盒测试

7.1白盒测试主要用途

用于测试程序内部代码执行的情况如何,哪些代码被执行了,我们定义判断一组测试用例是否能够很好地反映代码的执行情况为覆盖度,具体覆盖度分为以下几类:

白盒测试---六种覆盖率_huangli414的博客-CSDN博客_条件覆盖率

此博客写得较为详细。

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

测试难度:路径覆盖>分支覆盖>语句覆盖

注:条件覆盖和分支覆盖不可比较。

7.2覆盖度测试工具

8.记录测试策略

测试策略:记录是根据什么来写出该测试用例的。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值