单元测试——(王婧201421123065,陈艺菡201421123068)
(王婧201421123065,陈艺菡201421123068)##
coding.net 地址:https://git.coding.net/xmcyh1996/UnitTest.git
a. 需求分析:测试上有哪些详细的需求?##
1.把计算模块提取出来,单独创建一个类
2.通过单元测试代码,测试加法是否能正确工作;
3.通过单元测试代码,测试加减乘除功能。
4.通过单元测试代码,测试计算类对于各种参数的支持:
a. 输入是有错误的,例如 “1 ++ 2”,
b. 设计测试框架, 模拟测试数据:##
(1) 请给出计算模块的测试用例及运行结果
1.加减乘除
a. 输入是有错误的,例如 “1 ++ 2”
b. 在数值范围是 -1000 .. 1000 的时候,传进去 “10000 + 32768”,
c. 或者是 “ 248 / 0” 怎么办?
e.代码覆盖率
问题及解决
Q:不知道如何使用junit4和生成代码覆盖率
A:通过查阅相关资料学习
Q:对于一些特殊情况(如数组越界、除数不为0)的解决存在困难
A:最后用if/else排除异常
代码展示##
CalcFunction.java部分代码
public class CalcFunction {
public static int GCD(int m, int n) {//递归法求最大公约数
if(m % n == 0){
return n;
}else{
while(m != n){
if(m > n)m = m - n;
else n = n - m;
}
}
return m;
}
public static int LCM(int m, int n){//求最小公倍数
return m * n / GCD(m,n);
}
static String Reduction(int i, int j){ //约分,化为最简。
String k;
int k1 = GCD(i, j);
i = i / k1;
j = j / k1;
if (j == 1) {
k = i + "";
} else {
k = (i) + "" + "/" + (j) + "";
}
return k;
}
private String result;
public void calc(String s){
if(s.indexOf("+")>-1 && s.indexOf("+")< 2){
add(s);
}else if(s.indexOf("-")>-1 && s.indexOf("-")< 1){
substract(s);
}else if(s.indexOf("×")>-1 && s.indexOf("×")< 1){
multiply(s);
}else if(s.indexOf("÷")>-1 && s.indexOf("÷")< 1){
divide(s);
}else System.out.println("error!Not allow like 1++1!");
System.out.println(getResult());
}
public void add(String s)
{
String[] str=s.split("[+]");
if(str[0].indexOf("/")>-1 || str[1].indexOf("/")>-1)
{
String[] str1=str[0].split("[/]");
String[] str2=str[1].split("[/]");
result =Reduction(((Integer.parseInt(str1[0])*Integer.parseInt(str1[1]))+(Integer.parseInt(str2[0])*Integer.parseInt(str1[1]))),(Integer.parseInt(str1[1])*Integer.parseInt(str2[1])));
}
else{
result = Integer.parseInt(str[0])+Integer.parseInt(str[1])+"";
}
}
public void substract(String s)
{
String[] str=s.split("[-]");
if(str[0].indexOf("/")>-1 || str[1].indexOf("/")>-1)
{
String[] str1=str[0].split("[/]");
String[] str2=str[1].split("[/]");
result =Reduction(((Integer.parseInt(str1[0])*Integer.parseInt(str2[1]))-(Integer.parseInt(str2[0])*Integer.parseInt(str1[1]))),(Integer.parseInt(str1[1])*Integer.parseInt(str2[1])));
}
else{
if( Integer.parseInt(str[0])<1000&&Integer.parseInt(str[1])<1000&&Integer.parseInt(str[0])>-1000&&Integer.parseInt(str[1])>-1000)
{result = Integer.parseInt(str[0])+Integer.parseInt(str[1])+"";}
else System.out.println("error!overrun!");}
}
public void multiply(String s)
{
String[] str=s.split("[×]");
if(str[0].indexOf("/")>-1 || str[1].indexOf("/")>-1)
{
String[] str1=str[0].split("[/]");
String[] str2=str[1].split("[/]");
result =Reduction(Integer.parseInt(str1[0])*Integer.parseInt(str2[0]),Integer.parseInt(str1[1])*Integer.parseInt(str2[1]));
}
else{result = Integer.parseInt(str[0])*Integer.parseInt(str[1])+"";}
}
public void divide(String s)
{
String[] str=s.split("[÷]");
if(str[0].indexOf("/")>-1 || str[1].indexOf("/")>-1)
{
String[] str1=str[0].split("[/]");
String[] str2=str[1].split("[/]");
if(Integer.parseInt(str1[1]) != 0 && Integer.parseInt(str2[1]) != 0)
{
result =Reduction(Integer.parseInt(str1[0])*Integer.parseInt(str2[1]),Integer.parseInt(str1[1])*Integer.parseInt(str2[0]));
}else System.out.println("error!Divisor cannot be zero!");
}else{
if(Integer.parseInt(str[1]) != 0)
{
result = Integer.parseInt(str[0])/Integer.parseInt(str[1])+"";
}else System.out.println("error!Divisor cannot be zero!");
}
}
public String getResult()
{
return result;
}
}
c. 小结与感受:通过测试,是否有效发现了程序计算模块的问题,并给予改进?##
1.因为之前写的代码没有模块化,而且有些计算是在主函数内进行的所以我们在进行计算模块的提取有一些难度,加之是两个星期前的代码有些忘记自己写了什么,还好有之前有注释,我们从netbeans中将代码提取到eclipse中。
2.之前代码的功能只是考虑到最基本功能的实现和极少部分的异常捕获,对于输入异常考虑的还不是很全面。
3.没有考虑到用户可以对我们应用进行一个错误的反馈的功能。
4.之前的数组等的范围都定的比较小,还没有考虑到数组溢出的问题。
d. 在隔了一周之后再看之前的代码,是否更能体会到下面这些东西##
(1) 良好的设计
对与代码的功能的模块化没有分的很明确清晰,这也是写一部分改一部分,没有事先规划好模块的弊端所在。
(2) 编码规范
之前的代码格式是没有什么问题,因为有代码格式一键复原。但对于代码模块化做的不是很好,搀杂在主函数里,不易于提取与修改。
(3) 必要的注释
时隔两周对我们自己写的代码有些小陌生了,还好之前有注释,以及队友的相互指导,能加快对之前代码的理解
描述结对的过程,结对照片。
一加一大于二,两个人能相互监督不拉进度,相互提出问题,相互解决问题,加快进度与效率,结对编程是很好的合作方式。
提供此次结对作业的PSP。