1.测试帖链接:http://www.cnblogs.com/tangyangbin/p/6605368.html
2.提出的问题、发现的缺陷
- 代码输入3个数,且需要以一个空格分开,若3个数之间加了两个空格或者输入第一个数前加了空格则会导致显示输入数量不满足要求,建议对字符串间的空格进行处理。
- 对用户的循环输入采用while(true)死循环,循环无出口,即使用户使用结束程序依然在跑,建议使用一个布尔型变量进行控制,当用户使用结束后退出循环。
- 输入流没有进行关闭,建议进行关闭,防止出现不可预知的错误。
3.修正后的代码清单
缺陷一:代码输入3个数,且需要以一个空格分开,若3个数之间加了两个空格或者输入第一个数前加了空格则会导致显示输入数量不满足要求,建议对字符串间的空格进行处理。
// 【去掉字符串前后的空格】 line = line.trim(); // 【去掉字符串中多余的空格】 line = line.replaceAll("\\s{1,}", " ");
缺陷二:对用户的循环输入采用while(true)死循环,循环无出口,即使用户使用结束程序依然在跑,建议使用一个布尔型变量进行控制,当用户使用结束后退出循环。
需求中的第二点和第三点决定了这个程序没有出口。
程序要求:
1)先显示“请分别输入三种手机配件的销售情况:”
2)不满足条件,返回:“输入数量不满足要求”,返回重新输入;
3)条件均满足, 则返回佣金额。返回等待输入。
缺陷三:输入流没有进行关闭,建议进行关闭,防止出现不可预知的错误。
程序要求可以一直输入,所以输入流可以不关闭。
4.修正后心得体会:
- 代码的变更
对输入的字符串进行了去掉多余空格的处理。
加了判断输入的数字是否大于整型的最大数值:
// 【判断输入的字符串是否大于整型的最大数值】 if (Long.parseLong(input[i]) > Integer.MAX_VALUE || input[i].length() > 10) { return false; }
- 出现缺陷的原因
没有考虑到分隔符的边界条件,默认了三个数字之间只有一个空格分隔,最大值的限定没有考虑到。
- 对这部分教材内容的学习心得
设计测试用例的时候不能脱离需求,同时要考虑一些隐藏条件(分隔符)对程序的影响。测试用例的设计要尽量满足一个测试用例覆盖多个程序分支,这样可以减少测试用例的数目,提高测试用例的效率,与此同时可以先画出程序的流程图并标注判断点的判定条件数目,有助于提高测试用例对程序分支的覆盖率。
源代码链接:http://www.cnblogs.com/mtLin/p/6531231.html#3644121
附修改后的代码(注释中【】为修改的代码):
//ETestOne by:mtLin 2017.3.24 import java.util.Scanner; public class Commission { /* * hp:耳机 80元 mpc:手机壳 10元 cpsp:手机贴膜 8元 */ public static void main(String[] args) { String line; int hp = 0, mpc = 0, cpsp = 0; String[] input = null; float money = 0; @SuppressWarnings("resource") Scanner scanner = new Scanner(System.in); while (true) { System.out.println("请分别输入三种手机配件的销售情况:"); line = scanner.nextLine(); // 【去掉字符串前后的空格】 line = line.trim(); // 【去掉字符串中多余的空格】 line = line.replaceAll("\\s{1,}", " "); input = line.split(" "); if (Judge(input)) { // 判断是否不小于0 if ((hp = Integer.parseInt(input[0])) < 0) { System.out.println("输入数量不满足要求"); continue; } if ((mpc = Integer.parseInt(input[1])) < 0) { System.out.println("输入数量不满足要求"); continue; } if ((cpsp = Integer.parseInt(input[2])) < 0) { System.out.println("输入数量不满足要求"); continue; } } else { System.out.println("输入数量不满足要求"); continue; } money = commission(hp, mpc, cpsp); System.out.println("佣金金额:" + money); } } // 计算佣金 private static float commission(int hp, int mpc, int cpsp) { float commission = 0; int total = hp * 80 + mpc * 10 + cpsp * 8; if (total < 1000) { commission = (float) (total * 0.1); } else if (total <= 1800) { commission = (float) (1000 * 0.1 + (total - 1000) * 0.15); } else { commission = (float) (1000 * 0.1 + 800 * 0.15 + (total - 1800) * 0.2); } return commission; } // 判断用户输入的是不是三个整数 private static boolean Judge(String[] input) { String number = "0123456789"; // 判断输入的是不是三个字符串 if (input.length != 3) { return false; } // 判断三个字符串是不是纯数字且不含小数点 for (int i = 0; i < 3; i++) { for (int j = 0; j < input[i].length(); j++) { if ("+-".indexOf(input[i].charAt(0)) == 1) { continue; } if (number.indexOf(input[i].charAt(j)) == -1) { return false; } // 【判断输入的字符串是否大于整型的最大数值】 if (Long.parseLong(input[i]) > Integer.MAX_VALUE || input[i].length() > 10) { return false; } } } return true; } }