基于junit4的关于个人所得税计算的等价类与边界值_【新书连载02】软件测试流程设计—边界值分析法...

60c5f47d1d6ca6ba25fb5fba9a70e1ed.gif

0334bac93afc0570836162fe33d0d45e.png 1.1.2 边界值分析法 54a3d111ed57c0e1787727ea51c2e430.png

1.什么是边界值分析法

边界值分析法也是一种黑盒测试方法,是对等价类划分法的一种补充,由测试工作经验得知,大量的错误发生在输入或输出的边界上。因此,针对各种边界情况设计测试用例,可以更快地发现缺陷。

边界值分析法的理论基础是假定大多数的缺陷发生在各种输入条件的边界上,如果在边界附近的取值不会导致程序出错,那么其他取值导致程序出错的可能性也很小。

边界值分析法的使用条件如下。

(1)输入条件明确了一个值的取值范围,或者规定了值的个数。

例子:输入条件为整数,取值范围为[1,100]。

(2)输入条件明确了一个有序集合。

例子:输入条件为月份,取值范围是月份的集合(1月到12月)。

边界值点定义如下。

上点:边界上的点,如果域的边界是封闭的(例如,闭区间[1, 5]),上点就在域范围内;如果域的边界是开放的(例如,开区间(1, 5)),上点就在域范围外。

离点:离上点最近的一个点,如果域的边界是封闭的,离点就在域范围外;如果域的边界是开放的,离点就在域范围内。

内点:顾名思义,就是在域范围内的任意一个点。

边界值点的示例参见图1-3。

1bb6de6babe3b983d6c3a5eaf9fedbd1.png ▲图1-3 边界值点的示例

上点、离点的确定和这个域的边界是开放的还是封闭的有关。不论边界是开放的还是封闭的,上点和离点中总有一个在域内,另外一个在域外。例如,对于封闭边界,上点在域内,离点在域外;对于开放边界,上点在域外,离点在域内。

上点、离点的选择还与区间的数据类型有关,如果数据类型是整数,则可通过在上点的基础上加1或减1来确定最靠近的点,即离点。如果数据类型是实数,则可人为选择一个精度,并在这个精度下寻找最靠近的点。

假设a是整数,a的一个边界描述是a>0,这个域是开放的,那么上点是0,离点是1。如果边界描述是a≥0,这个域是封闭的,那么上点仍然是0,离点是?1。

假设a是实数,首先确定一个精度,比如精确到0.001,那么当a的边界描述为a>0时,这个域是开放的,上点是0.000,离点是0.001;当边界描述为a≥0时,这个域是封闭的,上点仍然是0.000,离点是—0.001。

2.如何使用边界值分析法

边界值分析法具体的实施步骤如下。

(1)划分等价类(可选)。

这里对等价类的划分是基于特性测试子项所对应的SRS片段的,可以参考1.1.1节。

在划分过程中,划分结果可以填写到表1-1中。

(2)分析样点。

针对每个等价类区域分析其上点、离点和内点,并将分析的上点、离点和内点填写到表1-8中。

(3)确定测试用例。

从划分出的等价类中按以下3个原则设计测试用例。

‍表1-8 边界值点的选取 ef5953aa89162acd56349b115a6778c1.png

(1)为每一个等价类的上点、离点和内点确定唯一的编号。

(2)设计新的测试用例,使它尽可能多地覆盖尚未被覆盖的有效等价类中的上点、离点和内点,重复这一步,直到所有的有效等价类点都被覆盖为止。

说明:当等价类划分法和边界值分析法结合使用时,边界值分析法的内点如果已经在等价类中被测试用例覆盖,则不用重复设计用例。

(3)设计新的测试用例,使它仅覆盖一个尚未被覆盖的无效等价类的上点、离点和内点,重复这一步,直到所有的无效等价类中的上点、离点和内点都被覆盖为止。

把边界值测试用例的数据填写到表1-9中。

表1-9 边界值测试用例的数据 7b7f4fa0ce56be0a46d737bb2077faf1.png

3.案例1-3

在案例1-3中,从边界值的角度考虑对测试用例进行补充。

(1)根据日期的长度进行边界值的用例设计,可以考虑输入5位的数字字符和7位的数字字符。

(2)从年份的取值范围考虑边界情况,如起始年份1990、1991,终止年份2049、2050。

(3)从月份的取值范围考虑边界情况,如起始月份00、01,终止月份12、13。

4.案例1-4

在案例1-4中,从边界值的角度考虑对测试用例进行补充,参见表1-4。

从年龄的角度考虑测试?1、0、19、20、39、40、59、60、99、100的情况。

5.实际应用

基于边界值分析法选择测试用例的原则如下。

(1)如果输入条件规定了值的范围,则应以刚达到这个范围的边界和边界附近的值作为测试输入数据(上点和离点)。例如,如果某软件程序的规格说明中规定“重量在10 kg至50 kg范围(包含10 kg和50 kg)内的邮件邮费计算公式(精度为0.01)”,则测试用例输入数据应选取10.00及50.00,还应选取9.99及50.01。

(2)如果输入条件规定了值的个数,则以最大个数、最小个数、比最小个数少1、比最大个数多1的数作为测试用例数据。例如,某软件程序要求通过账号注册,密码限制为10~18位,测试用例的输入数据不仅应选取18位及10位,还应选取9位及19位。

(3)如果程序的规格说明给出的输入域或输出域是一个有序的集合,则应选取集合的第一个元素和最后一个元素作为测试用例的输入数据。例如,输入条件为周几,如果规定周日为一周的第一天,则以测试用例的输入数据集合中的第一个元素为周日,以集合的最后一个元素为周六。

(4)如果程序中使用了一个内部数据结构,则应当选择这个内部数据结构边界上的值作为测试用例输入数据。例如,如果程序采用循环结构,则可以考虑选取循环第0次、第1次、倒数第2次、最后1次等;如果程序采用数组,则可以考虑选取数组的第一个元素和最后一个元素。

(5)分析规格说明,找出其他可能的边界条件。

6.总结

边界值分析法实际上通过优先选择不同等价类间的边界值覆盖有效等价类和无效等价类来更有效地进行测试,因此该方法需要和等价类划分法结合使用。

7.练习

练习1-3 根据图1-2所示和下面的具体输入条件规则,利用边界值分析法编写测试用例。

关于用户名和密码的规则如下。

长度为6~10位(含6位和10位)。

由字符(a~z、A~Z)和数字(0~9)组成。

不能为空、空格和特殊字符。

针对用户名和密码写出所有边界值。

0334bac93afc0570836162fe33d0d45e.png 1.1.3 判定表法 54a3d111ed57c0e1787727ea51c2e430.png

1.什么是判定表法

等价类划分法、边界值分析法主要针对单个输入条件进行测试用例设计。测试中往往需要考虑多个输入条件组合的情况,因此需要采用更合适的方法。我们可以采用判定表法、因果图法、正交试验法等方法。

判定表是指在分析和表达多种输入的条件下系统执行不同动作的工具。在程序设计发展的初期,判定表就已被当作编写程序的辅助工具,它可以把复杂的逻辑关系和多种条件组合的情况表达得既具体又明确。

判定表通常由4个部分组成,如图1-4所示。

0a513aca3479717ef6e06acafcdade1c.png ▲图1-4 判定表的组成

例如,手机在未欠费、有信号、开机的情况下,可以正常通话。根据分析得出条件桩、条件项、动作桩、动作项,如表1-10所示。在判定表中,根据各种输入条件真或假的组合,得出相应的输出动作。

表1-10 手机通话中的条件桩、条件项、动作桩、动作项

06f2f5598a3d00c4cba64ab46c6e0eb4.png

判定表的每一列对应一条业务规则,该规则定义了各种条件的一个特定组合,以及与这个规则相关联的执行动作。判定表测试的常见覆盖标准是,每列至少对应一个测试。判定表的规则数等于条件桩的条件项个数相乘。

判定表法的优点是可以生成测试条件的各种组合,而这些组合利用其他方法可能无法被测试到。对于判定表可以进行化简工作,化简工作以合并相似规则为目标。如果表中有两条或多条规则有相同的动作,并且其条件项之间存在相似的关系,则可以将其合并,如图1-5所示。

2.如何使用判定表法

判定表法具体的实施步骤如下。

(1)标识输入和输出。

f32a25084ad22132ae5f017f2b242c97.png ▲图1-5 合并判定表中的规则

分析需求规格说明书的子项,找出其中的条件桩、对应的条件项和动作桩、对应的动作项,并标识出来,其中要注意以下几点。

① 输入需要包括外部消息输入、内部预置的用户状态、数据配置等所有对系统输出有影响的因素。

② 如果输入项和输出项只涉及两种取值,在两种取值中可以只把一个标识出来。如果输入项涉及多种取值,每个取值都需要作为一个输入标识出来。

③ 标识符可以自己确定,但输入与输出需要独立标识。

(2)构造判定表。

将标识的输入填入条件桩部分,将标识的输出填入动作桩部分。条件项部分的列数为2的n次方列,n为输入数。从最右列到最左列逐列从“N N … N”到“Y Y … Y”填入条件项的所有组合。

(3)逐列分析条件项组合,并填入其动作项。

分析每列的条件项取值情况,根据输入和输出逻辑关系,得到该列的输出值—“Y”或“N”,填入该列动作项,得到一条规则。如果该列条件项的取值组合不合法,则在动作项中填入“X”。

……

扫码/点击阅读原文立即查看本章完整内容

599c0f45941d97eec9e06d073efb6711.png

a39bb07c93d5983a670faf698aa08c64.png 3f9f122e15bf4e4b630b398bb694eb8e.gif

0272c9ba90aa5d0f0daee8db208a112f.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设个人所得税计算公式如下: 1. 对于月薪不超过5000元的人员,个人所得税为月薪的5%; 2. 对于月薪在5000元到10000元之间的人员,个人所得税为月薪的10%; 3. 对于月薪在10000元到20000元之间的人员,个人所得税为月薪的15%; 4. 对于月薪在20000元到40000元之间的人员,个人所得税为月薪的20%; 5. 对于月薪超过40000元的人员,个人所得税为月薪的25%。 根据边界分析等价类划分方,我们可以得到以下测试用例: |月薪|期望个人所得税| |---|---| |-1|无效输入| |0|0| |1|0.05| |4999|249.95| |5000|500| |5001|500.1| |9999|999.9| |10000|1000| |10001|1500.15| |19999|2999.85| |20000|4000| |20001|4400.2| |39999|7999.8| |40000|8000| |40001|10000.25| |50000|12500| 根据上述测试用例,我们可以编写如下的测试代码: ```java import static org.junit.Assert.*; import java.util.Arrays; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; @RunWith(Parameterized.class) public class TestTax { private int salary; private double expectedTax; public TestTax(int salary, double expectedTax) { this.salary = salary; this.expectedTax = expectedTax; } @Parameters public static Iterable<Object[]> data() { return Arrays.asList(new Object[][] { { -1, -1 }, { 0, 0 }, { 1, 0.05 }, { 4999, 249.95 }, { 5000, 500 }, { 5001, 500.1 }, { 9999, 999.9 }, { 10000, 1000 }, { 10001, 1500.15 }, { 19999, 2999.85 }, { 20000, 4000 }, { 20001, 4400.2 }, { 39999, 7999.8 }, { 40000, 8000 }, { 40001, 10000.25 }, { 50000, 12500 } }); } @Test public void testTax() { if (salary < 0) { assertEquals(-1, expectedTax, 0.001); } else { double actualTax = calculateTax(salary); assertEquals(expectedTax, actualTax, 0.001); } } private double calculateTax(int salary) { double tax = 0; if (salary > 0 && salary <= 5000) { tax = salary * 0.05; } else if (salary > 5000 && salary <= 10000) { tax = salary * 0.1; } else if (salary > 10000 && salary <= 20000) { tax = salary * 0.15; } else if (salary > 20000 && salary <= 40000) { tax = salary * 0.2; } else if (salary > 40000) { tax = salary * 0.25; } else { // salary <= 0 return -1; } return tax; } } ``` 以上代码中,我们使用了JUnit的Parametrized运行器来运行多组测试数据。通过`@Parameters`注解,我们可以指定测试数据集合,它是一个二维数组,每一行表示一组测试数据。在测试中,我们首先判断月薪是否小于0,如果是则期望返回-1,表示无效输入;否则计算个人所得税,然后使用`assertEquals()`方来断言计算得到的税额与期望是否相等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值