复利4.0代码黑白盒测试
实验目的:
软件的测试设计与软件产品的设计一样,是一项需要
花费许多人力和时间的工作,我们希望以最少量的时间和
人力,最大可能地发现最多的错误。
白盒测试
也叫玻璃盒测试(Glass Box Testing)。对软件的过程性细节做细致的检查。这一方法是把测试对象看作一个打开的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,来设计或选择测试用例,对程序所有逻辑路径进行测试。
内容:1、对程序模块的所有独立执行路径至少测试一次
2、对所有的逻辑判定,取“真”与取“假”的两种情况都能至少测试一次。
3、在循环的边界和运行边界限内执行循环体
4、测试内部数据结构的有效性。
白盒测试方法:
1、逻辑覆盖测试方法通常采用流程图来设计测试用例,它考察的重点是图中的判定框,因为这些判定通常是与选择结构有关或是与循环结构有关,是决定程序结构的关键成分。
2、判定覆盖/ 分支覆盖设计若干个测试用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次。
3、条件覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的每个条件的可能取值至少执行一次。
黑盒测试
已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。
内容:1、Alpha/Beta Testing
2、菜单/帮助测试
3、发行测试
4、回归测试
黑盒测试法四种常用技术:有效等价类、边界值分析法、错误猜测法、因果图法
有效等价类是指对于程序的规格说明来说,是合理的有意义的输入数据构成的集合。利用它可以检验程序是否实现预先规定的功能和性能
边界值分析法是采用边界值分析法来选择测试用例,可使得被测程序能在边界值及其附近运行,从而更有效地暴露程序中潜藏的错误。
错误猜测法是指所谓猜测,就是猜测被测程序在哪些地方容易出错,然后针对可能的薄弱环节来设计测试用例。显然它比前两种方法更多地依靠测试人员的直觉与经验。所以一般都先用前两方法设计测试用例然后再用猜测法去补充一些例子作为辅助的手段。
因果图法是借助图形来设计测试用例的一种系统方法。它适用于被测程序具有多种输入条件,程序的输出又依赖于输入条件的各种组合的情况因果图是一种简化了的逻辑图,它能直观地表明程序输入条件(原因)和输出动作(结果)之间的相互关系。
测试步骤
1、把方法从类里面提取出来另写一个public static方法
2、将方法里面的数据定义一些参数,方便不同类型的数据测试
3、在另外新建的包里面创建测试类进行测试
测试设计
1.测试计算公式是否正确
2.测试用户输入非法字符
3.测试输入为空
4.测试输入为负数
5、每个条件每个循环的路线都走一次
测试代码:将单利计算的类拿出来测试,以下是源代码
public void Scalculate() { double principal = 0; double amount = 0; double rate = 0; int n = 0; NumberFormat currencyformatter = NumberFormat.getCurrencyInstance(); String output = "年" + "/" + "单利存款"; int year = 1; int result; if (b4.getText().equals("") && b1.getText() != null && b3.getText() != null && b2.getText() != null) // 求期望值 { try { rate = Double.parseDouble(b2.getText()); if (rate < 0) { JOptionPane.showMessageDialog(null, "利率输入有误,请重新输入数字"); rate = 0; } n = Integer.parseInt(b3.getText()); if (n < 0) { JOptionPane.showMessageDialog(null, "年份输入有误,请重新输入数字"); n = 0; } principal = Double.parseDouble(b1.getText()); // b1本金 if (principal < 0) { JOptionPane.showMessageDialog(null, "本金输入有误,请重新输入数字"); principal = 0; } } catch (Exception e2) { // TODO: handle exception JOptionPane.showMessageDialog(null, "数据输入有误,请重新输入数字"); } double tempprincipal = principal; result = JOptionPane.showConfirmDialog(null, "是否每年添加本金"); if (result == JOptionPane.YES_OPTION) { while (year <= n) { amount = principal * (1 + rate * year) + tempprincipal; output += String.valueOf(year) + "\t\t\t" + currencyformatter.format(amount) + "\n"; year = year + 1; } } else { while (year <= n) { amount = principal * (1 + rate * year); output += String.valueOf(year) + "\t\t\t" + currencyformatter.format(amount) + "\n"; year = year + 1; } } text.setText(output); } else if (b1.getText().equals("") && b2.getText() != null && b3.getText() != null && b4.getText() != null) { // 求本金 try { rate = Double.parseDouble(b2.getText()); if (rate < 0) { JOptionPane.showMessageDialog(null, "利率输入有误,请重新输入数字"); rate = 0; } n = Integer.parseInt(b3.getText()); if (n < 0) { JOptionPane.showMessageDialog(null, "年份输入有误,请重新输入数字"); n = 0; } amount = Double.parseDouble(b4.getText()); if (amount < 0) { JOptionPane.showMessageDialog(null, "期待值输入有误,请重新输入数字"); amount = 0; } } catch (Exception e2) { // TODO: handle exception JOptionPane.showMessageDialog(null, "数据输入有误,请重新输入数字"); } principal = 0; while (year <= n) { principal = amount / (1 + rate * year); year = year + 1; } output = "本金" + currencyformatter.format(principal) + "\n"; text.setText(output); } else if (b2.getText().equals("") && b1.getText() != null && b3.getText() != null && b4.getText() != null) // 求利率 { try { principal = Double.parseDouble(b1.getText()); // b1本金 if (principal < 0) { JOptionPane.showMessageDialog(null, "本金输入有误,请重新输入数字"); principal = 0; } n = Integer.parseInt(b3.getText()); // b3年份 if (n < 0) { JOptionPane.showMessageDialog(null, "年份输入有误,请重新输入数字"); n = 0; } amount = Double.parseDouble(b4.getText()); // b4期望值 if (amount < 0) { JOptionPane.showMessageDialog(null, "期待值输入有误,请重新输入数字"); amount = 0; } } catch (Exception e2) { // TODO: handle exception JOptionPane.showMessageDialog(null, "数据输入有误,请重新输入数字"); } rate = (amount / principal - 1) / n; output = "利率" + rate + "\n"; text.setText(output); } else if (b3.getText().equals("") && b1.getText() != null && b2.getText() != null && b4.getText() != null) // 求年份 { try { principal = Double.parseDouble(b1.getText()); // b1本金 if (principal < 0) { JOptionPane.showMessageDialog(null, "本金输入有误,请重新输入数字"); principal = 0; } amount = Double.parseDouble(b4.getText()); // b4期望值 if (amount < 0) { JOptionPane.showMessageDialog(null, "期待值输入有误,请重新输入数字"); amount = 0; } rate = Double.parseDouble(b2.getText()); if (rate < 0) { JOptionPane.showMessageDialog(null, "利率输入有误,请重新输入数字"); rate = 0; } } catch (Exception e2) { // TODO: handle exception JOptionPane.showMessageDialog(null, "数据输入有误,请重新输入数字"); } double n2 = (amount / principal - 1) / rate; double n3 = n2; n = (int) n2; if (n3 - n > 0) { n += 1; output = "至少年数" + n + "\n"; text.setText(output); } else { output = "刚好" + n + "年\n"; text.setText(output); } } else if (b1.getText() != null && b4.getText() != null && b3.getText() != null && b2.getText() != null) { JOptionPane.showMessageDialog(null, "请删除一个数据"); } else { JOptionPane.showMessageDialog(null, "请增加数据"); } }
测试数据及结果:
测试模块 |
测试输入 (本金,利率,年限,期望值) |
测目的 |
预期结果 |
运行结果 |
Bug跟踪 |
测试公式是否正确 |
(100000,0.03,3,0, ) |
期望值 |
10900 |
10900 |
无bug |
|
(100000,0.03,0,10900) |
年限 |
3 |
3 |
无bug |
|
(0,0.03,3,10900) |
本金 |
100000 |
100000 |
无bug |
|
(100000,0,3,0,10900 ) |
利率 |
0.03 |
0.03 |
无bug |
测试用户输入非法字符 |
(g,0,3,0,0) |
期望值 |
false |
false |
无bug |
|
(100000,p,0,10900 ) |
年限 |
false |
false |
无bug |
|
(0,f,3,10900 ) |
本金 |
false |
false |
无bug |
|
(l,0,3,10900) |
利率 |
false |
false |
无bug |
测试输入为空 |
(100000,0.03,0,0) |
无 |
false |
false |
无bug |
测试输入为负数 |
(-100000,0.03,3,0) |
期望值 |
false |
false |
无bug |
|
(-100000,0.03,0,10900) |
年限 |
false |
false |
无bug |
|
(-100000,0,3,10900) |
利率 |
false |
false |
无bug |
|
(0,0.03,3,-10900) |
本金 |
false |
false |
无bug |
测试的代码:
@Test public void testScalculate() { boolean isT=Scalculate(); assertEquals(true, isT); }
@Test public void testCalculateA() { double z=new Fuli().CalculateA(1, 3, 100, 0.03, 100); boolean flag=0.0==z-209.2727; assertEquals(true, flag); }