要求:
对我们和复利计算程序,写单元测试。
有哪些场景?
期待的返回值
写测试程序。
运行测试。
测试内容:1、对复利计算4.0的数据输入进行简单测试(测试公式是否正确)
2、对空输入进行测试
3、对除数为0的情况进行测试
配置Junint:我对于这个不是很熟悉,在网上搜了搜,找到的一个不错的教程,在这里推荐一下
http://jingyan.baidu.com/album/380abd0a4d021a1d91192c40.html?picindex=1
测试:
1、针对以下代码进行测试,测试计算结果和预测结果之间的偏差是否不超过3,以测试公式是否正确
(1)源代码:
//计算终值 public double init(float p,float n,double r){ double f = p * Math.pow((1 + 0.01*r),n); return f; }
(2)测试类代码:
package fuli_4; import static org.junit.Assert.*; import org.junit.Assert; import org.junit.Before; public class Test { @Before public void setUp() throws Exception { } @org.junit.Test public void testinit() { fuli_4 fuli = new fuli_4(); double f = fuli.init(100000,10,3); Assert.assertEquals(f, 134390, 3.0); } }
(3)测试结果:预期结果为134390,但实际为134391.64,而这个偏差小于3,所以测试正确,即所测试的代码运算公式是正确的
其它公式测试类同,在这里就不一一发了,经过测试,结果都是正确的
2、对空输入进行测试:当没有输入任何数据时,我希望不执行运算,并提示“请正确输入数据再执行运算”;
(1)源代码:
//计算 public void run(){ try { double f = 0; NumberFormat currencyformatter = NumberFormat.getCurrencyInstance(); // 字符串转化为数字 float p = Float.parseFloat(jTextField0.getText()); float r = Float.parseFloat(jTextField2.getText()); float n = Float.parseFloat(jTextField1.getText()); if (jComboBox1.getSelectedItem() == "复利计算") { if (jComboBox0.getSelectedItem() == "终值计算") { f = p * Math.pow((1 + 0.01*r),n); } if (jComboBox0.getSelectedItem() == "本金计算") { f = p/Math.pow((1+0.01*r), n); } else if (jComboBox0.getSelectedItem() == "年限计算") { f = (Math.log(n/p))/(Math.log(1+0.01*r)); } else if (jComboBox0.getSelectedItem() == "利率计算") { f = 100*( Math.pow(r/p,1d/n)-1); } else if (jComboBox0.getSelectedItem() == "基金定投") { f = p*(1+0.01*r)*(-1+Math.pow(1+0.01*r,n))/(0.01*r); } else if (jComboBox0.getSelectedItem() == "等额本息还款") { f=p*((0.01*r/12)*Math.pow((1+0.01*r/12),n))/(Math.pow((1+0.01*r/12),n)-1); } } else { if (jComboBox0.getSelectedItem() == "终值计算") { f = p*(1+0.01*r*n); } else if (jComboBox0.getSelectedItem() == "本金计算") { f = p/(1+0.01*r*n); } else if (jComboBox0.getSelectedItem() == "年限计算") { f = ((n/p)-1)/(0.01*r); } else if (jComboBox0.getSelectedItem() == "利率计算") { f = 100*(((r/p)-1)/n); } } DecimalFormat df = new DecimalFormat("0.00"); String db = df.format(f); jTextField3.setText(String.valueOf(db)); } catch(Exception e){ System.out.println(e.getMessage()); } }
(2)测试代码:
//测试当输入值为空时,计算结果提示请正确输入 @org.junit.Test public void testReturn() { fuli_4 fuli = new fuli_4(); boolean se = false; fuli.run(); if(fuli.jLabel9.getText()=="请正确输入数据在执行运算"){ se = true; } assertEquals(true,se); }
(3)测试结果
可以看出测试出错了,因为没有输入,文本框内string值转化为数据时出错,这时为源代码添加一个判断的条件即可,添加代码如下,如果存在空输入,提示输入>0的数字,并且输出的结果为0.00
// 当输入值为空时,计算结果返回0 if (jTextField0.getText().equals("") || jTextField1.getText().equals("")|| jTextField2.getText().equals("")) { jLabel5.setText("请输入>0的数字"); jLabel7.setText("请输入>0的数字"); jLabel8.setText("请输入>0的数字");
jLabel9.setText("请正确输入数据在执行运算"); f = 0.0; }
这时的测试结果为:
如上图所示,这时的测试通过了。
而且运行结果也不再报错
3、一般情况下,在数学公式中,除数是不能为0的,所以对输入的数据进行检测,如果输入为0或小于0的数,则提示”输入大于0的数“,并且不执行运算,在结果文本框显示“请正确输入数据”
(1)如下图,就算出现除数为0,也会执行运算,所以针对这个一目了然的错误,在检测前就可以对代码进行一定的更改
(2)在检测2的源代码的基础上添加条件,更改后的源代码如下:
else { NumberFormat currencyformatter = NumberFormat.getCurrencyInstance(); // 字符串转化为数字 float p = Float.parseFloat(jTextField0.getText()); float r = Float.parseFloat(jTextField2.getText()); float n = Float.parseFloat(jTextField1.getText()); if (p <= 0) { jLabel5.setText("请输入>0的数字"); jLabel9.setText("请正确输入数据在执行运算"); } if (n <= 0) { jLabel8.setText("请输入>0的数字"); jLabel9.setText("请正确输入数据在执行运算"); } if (r <= 0) { jLabel7.setText("请输入>0的数字"); jLabel9.setText("请正确输入数据在执行运算"); } if(p>0&&n>0&&r>0){ if (jComboBox1.getSelectedItem() == "复利计算") { if (jComboBox0.getSelectedItem() == "终值计算") { f = p * Math.pow((1 + 0.01 * r), n); } if (jComboBox0.getSelectedItem() == "本金计算") { f = p / Math.pow((1 + 0.01 * r), n); } else if (jComboBox0.getSelectedItem() == "年限计算") { f = (Math.log(n / p)) / (Math.log(1 + 0.01 * r)); } else if (jComboBox0.getSelectedItem() == "利率计算") { f = 100 * (Math.pow(r / p, 1d / n) - 1); } else if (jComboBox0.getSelectedItem() == "基金定投") { f = p * (1 + 0.01 * r) * (-1 + Math.pow(1 + 0.01 * r, n)) / (0.01 * r); } else if (jComboBox0.getSelectedItem() == "等额本息还款") { f = p * ((0.01 * r / 12) * Math.pow((1 + 0.01 * r / 12), n)) / (Math.pow((1 + 0.01 * r / 12), n) - 1); } } else { if (jComboBox0.getSelectedItem() == "终值计算") { f = p * (1 + 0.01 * r * n); } else if (jComboBox0.getSelectedItem() == "本金计算") { f = p / (1 + 0.01 * r * n); } else if (jComboBox0.getSelectedItem() == "年限计算") { f = ((n / p) - 1) / (0.01 * r); } else if (jComboBox0.getSelectedItem() == "利率计算") { f = 100 * (((r / p) - 1) / n); } } DecimalFormat df = new DecimalFormat("0.00"); String db = df.format(f); jTextField3.setText(String.valueOf(db)); } }
(3)测试代码如下:
//测试当输入值为0时,计算结果提示请正确输入 @org.junit.Test public void testRun() { fuli_4 fuli = new fuli_4(); boolean se = false; fuli.jTextField0.setText("0"); fuli.jTextField1.setText("0"); fuli.jTextField2.setText("0"); fuli.run(); if(fuli.jLabel9.getText()=="请正确输入数据在执行运算"){ se = true; } assertEquals(true,se); }
(4)测试结果如下:
如上图所示,测试结果通过
而这时的运算结果为
这时就可以解决除数为0的情况了
全部代码已上传github,详情请点击:https://github.com/LanLeaf/Lan-work/tree/master/compounding_4.0-s-Test