(201421123002 翁珊;201421123006 黄月梅;201421123007 徐晓珊)
题目要求:
- 结对编程实现上述功能,同样的,在程序正式开发之前,请先预估下PSP每个环节的消耗时间(分钟),并在过程中统计实际耗时(分钟),最后提交PSP表格。依然注意,这个主要是给你们自己看的,不必造假数据。
- 继续两人结对协作,把编码规范、领航员和驾驶员角色互换做到位。
- 单元测试: 有单元测试保证,有代码覆盖率。
需求分析:
1.把计算模块提取出来,单独创建一个类。
计算模块单独成类(CalcFunction)
1 public class CalcFunction { 2 static int count=0,count1=0; 3 public static String add(Fraction a, Fraction b) //加法 参考分数间加减乘除 用四个变量表示两个分数的分子分母 4 { 5 int i, j, k, s, m, n, p; 6 i = a.getNumerator();// 分子 7 j = a.getDenominator();// 分母 8 k = b.getNumerator(); 9 s = b.getDenominator(); 10 m = i * s + j * k; 11 n = s * j; 12 p = Calc.getGCD(m, n); 13 return Calc.Reduction(m / p, n / p); 14 15 } 16 17 public static String div(Fraction a, Fraction b)//除法 设置生成的随机数不为0,则不存在除数为0的情况 18 19 { 20 int i, j, k, s, m, n, p; 21 i = a.getNumerator();// 分子 22 j = a.getDenominator();// 分母 23 k = b.getNumerator(); 24 s = b.getDenominator(); 25 m = s * i; 26 n = j * k; 27 p = Calc.getGCD(m, n); 28 return Calc.Reduction(m / p, n / p); 29 } 30 31 public static String sub(Fraction a, Fraction b)//减法 32 33 { 34 int i, j, k, s, m, n, p; 35 i = a.getNumerator();// 分子 36 j = a.getDenominator();// 分母 37 k = b.getNumerator(); 38 s = b.getDenominator(); 39 m = i * s - j * k; 40 n = j * s; 41 p = Calc.getGCD(m, n); 42 return Calc.Reduction(m / p, n / p); 43 } 44 45 public static String mul(Fraction a, Fraction b)//乘法 46 47 { 48 int i, j, k, s, m, n, p; 49 i = a.getNumerator();// 分子 50 j = a.getDenominator();// 分母 51 k = b.getNumerator(); 52 s = b.getDenominator(); 53 m = i * k; 54 n = j * s; 55 p = Calc.getGCD(m, n); 56 return Calc.Reduction(m / p, n / p); 57 } 58 59 }
2.针对提取出来的计算类的接口函数做单元测试。
单元测试代码如下:
1 @Test 2 public void testAdd() { 3 Fraction a = new Fraction(2,3,"2/3"); 4 Fraction b = new Fraction(1,3,"1/3"); 5 6 assertEquals(CalcFunction.add(a,b), "1"); 7 } 8 9 @Test 10 public void testDiv() { 11 Fraction a = new Fraction(2,3,"2/3"); 12 Fraction b = new Fraction(1,3,"1/3"); 13 14 assertEquals(CalcFunction.div(a,b), "2"); 15 } 16 17 @Test 18 public void testSub() { 19 Fraction a = new Fraction(2,3,"2/3"); 20 Fraction b = new Fraction(1,3,"1/3"); 21 22 assertEquals(CalcFunction.sub(a,b), "1/3"); 23 } 24 25 @Test 26 public void testMul() { 27 Fraction a = new Fraction(2,3,"2/3"); 28 Fraction b = new Fraction(1,3,"1/3"); 29 30 assertEquals(CalcFunction.mul(a,b), "2/9"); 31 }
计算模块测试结果如下:
其他测试(CalcTest):
1 @Before 2 public void setUp() throws Exception { 3 } 4 5 @After 6 public void tearDown() throws Exception { 7 } 8 9 @Test 10 public void testGetGCD() { 11 assertEquals(Calc.getGCD(10, 5), 5); 12 } 13 14 @Test 15 public void testReduction() { 16 assertEquals(Calc.Reduction(9, 5), "9/5"); 17 }
测试结果如下:
代码覆盖率:
测试中遇到的问题及解决:
因为要求利用助教提供的空壳进行代码填充,所以对于代码模块的分割做的不是很好。后来将一些像gui模块编写这样在这次作业中没有用到的模块删除。对于除零错误,由于刚开始我们就设置了被除数不能出现=0的情况,就没有考虑。运算符也是刚开始就设置了只有单个字符生成。
小结与感受:通过测试,是否有效发现了程序计算模块的问题,并给予改进?
通过单元测试可以知道方法的某些地方出错了,需要在方法定义的地方进行相应的修改。就像刚开始进行四则运算的测试时一开始测试失败了,随后找到原因在相应方法的源代码上进行处理和修改,就可以测试成功了。再加上分了模块后,发现代码错误的时候找错更容易,可以更好的进行修改。
隔周看之前的代码:
(1)良好的设计
如果刚开始就能有良好的设计思想,做好模块划分和有单元测试的想法,现在的代码就不会那么乱,不能很好的进行模块划分和测试。
(2)编码规范
代码规范的重要性不言而喻,能让大家看到类名函数名就能知道函数的用途是什么,这也是很重要的。这样不仅自己,包括别的用户也可以进行较为轻松的阅读。
(3)必要的注释
因为刚开始的代码编写比较简单,所以忽略了注释,导致现在再看之前的代码较为吃力,但是因为方法的命名是根据其代表的意义的,所以还是能够大致理解,但是警示了我们今后写代码要有一些基本的注释。
git克隆助教的框架:
git上交截图:
☞☞☞ 撮coding链接(所有代码在src里)
https://coding.net/u/xxs24/p/pairwork2/git
结对照片:
PSP表格:
PSP2.1 | Personal Software Process Stages | Estimated Time(hour) | Actual Time (hour) |
Planning | 计划 | 0.5 | 0.5 |
· Estimate | 估计这个任务需要多少时间 | 10 | 12 |
Development | 开发 | 5 | 6 |
· Analysis | 需求分析 (包括学习新技术) | 1 | 1.5 |
· Design Spec | 生成设计文档 | 1 | 1 |
· Design Review | 设计复审 | 1.5 | 2 |
· Coding Standard | 代码规范 | 0.5 | 0.5 |
· Design | 具体设计 | 2 | 2 |
· Coding | 具体编码 | 4 | 4.5 |
· Code Review | 代码复审 | 0.5 | 0.5 |
· Test | 测试(自我测试,修改代码,提交修改) | 0.5 | 1 |
Reporting | 报告 | 0.5 | 0.5 |
· | 测试报告 | 1/6 | 1/6 |
· | 计算工作量 | 1/6 | 0.5 |
· | 并提出过程改进计划 | 0.25 | 0.25 |