单元测试
211606369 蔺皓雯 211606349 蔡晨旸
预估与实际
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 500 | 600 |
• Estimate | • 估计这个任务需要多少时间 | 600 | 760 |
Development | 开发 | ||
• Analysis | • 需求分析 (包括学习新技术) | 60 | 50 |
• Design Spec | • 生成设计文档 | 30 | 30 |
• Design Review | • 设计复审 | 20 | 10 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 30 | 20 |
• Design | • 具体设计 | 20 | 20 |
• Coding | • 具体编码 | 200 | 100 |
• Code Review | • 代码复审 | 60 | 60 |
• Test | • 测试(自我测试,修改代码,提交修改) | 100 | |
Reporting | 报告 | 20 | 30 |
• Test Repor | • 测试报告 | 20 | 30 |
• Size Measurement | • 计算工作量 | 10 | 10 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 20 | |
合计 | 600 |
一.单元测试
需求分析
要求熟悉对插件Junit,eclemma,以及PMD的使用
测试要求
Junit测试代码编写命名规范
Junit自动生成测试类的命名如下:被测试的业务+Test、被测试的接口+Test、被测试的类+Test
类的名字必须由大写字母开头而单词中的其他字母均为小写;
如果类名称由多个单词组成,则每个单词的首字母均应为大写,如TestMobileBind。
如果类名称中包含单词缩写,则这个所写词的每个字母均应大写,如:XMLExample。
如需要测试业务MobileBind ,那么命名就是TestMobileBind
如需要测试接口GetMobileBind ,那么命名就是TestGetMobileBind
如需要测试类SetMobileBind.class,那么命名就是TestSetMobileBind
关键代码
private static void Exam2(int range,int grade) {
//一二年级的题目
for (int i = 0; i < range; i++) {
int n1=(int) (Math.random() * 101);
int n2=(int) (Math.random() * 101);
// 获取两个随机数num1,num2
int index=(grade==1)?((int) (Math.random()*10))%2:((int) (Math.random()*10)) %4;
char fuhao=Operator[index];
while(index==0 && n1+n2 >= 101) {
n1 = (int) (Math.random()*101);
n2 = (int) (Math.random()*101);
}
int result = 0;
int yushu = 0;
switch (fuhao) {
case '+':
if(grade == 1 && n1<10 && n2<10 && n1%10 != 0 && n2%10 !=0) {
//小学一年级两数相加时,都小于10且为整数
n2 = n2/10*10;
}
result = n1 + n2;
//两数相加
break;
case '-':
if (n1 < n2) {
int temp = n1;
n1 = n2;
n2 = temp;
//一定是大的数-小的数,不能出现负数
}
case '×':
n1=n1%10;
n2=n2%10;
//两数都为整数
result=n1*n2;
break;
case '÷':
while(n2==0) {
n2=(int)(Math.random() * 101);
}
//除数不能为0,若为0,重新选择一个随机数
if(n2>10) {
n2 /=10 ;
}
result= n1/n2;
yushu = n1%n2;
//求出余数和运算结果
break;
}
Topic[i].append("(" + (i+1) + ") " + n1 + " " + fuhao + " " + n2 + System.lineSeparator());
if (fuhao == '/') {
Answer[i].append("(" + (i+1) + ") " + n1 + " " + fuhao + " " + n2 + " = " + result
+ (yushu != 0 ? ("..." + yushu) : ""));
} else
{
Answer[i].append("(" + (i+1) + ") " + n1 + " " + fuhao + " " + n2 + " = " + result);
}
}
}
private static void Exam(int range,int grade) throws Exception {
int i,n;
for( i = 0;i < range;i++) {
n=5+(int)(Math.random()*3);
if(n%2 == 0)
n++;
Character[] infixExpression = new Character[n];
char[] str = new char[(n-1)/2];
//操作符数
char c ;
infixExpression[n-1] = c = Operator[(int)(Math.random()*4)];
for(int j = 1,k = n-2;j<(n-1)/2;j++,k--) {
infixExpression[k] = Operator[(int)(Math.random()*4)];
c ^= infixExpression[k].charValue();
}
if(c == 0) {
int q = (int)(Math.random()*4);
infixExpression[n-1] = Operator[q] != infixExpression[n-1].charValue() ? Operator[q] : Operator[(q+1)%4];
}
try {
Topic[i].append("(" + (i+1) + ")");
Answer[i].append("(" + (i+1) + ")");
int result= CalPoland(infixExpression,i,str);
Topic[i].append(System.lineSeparator());
Answer[i].append(" = " + result);
if(i != range - 1){
Answer[i].append(System.lineSeparator());
}
}
catch (Exception e) {
// 抛出异常
Topic[i].setLength(0);
Answer[i].setLength(0);
i--;
}
}
}
首先之前代码的很多问题没有得到解决,关于加括号的问题一直没想明白,而这次的测试代码也总是报错。
二、结构优化(重构)
- 常遇到的几种问题:大量的传参: 一些方法跟另一些方法进行交互,或者调用另一些方法的时候传入大量的参数。
- 经常会使用一些具有明确含义的常量值,但没有给它们赋予合适的常量变量。
- 模糊的方法名: 许多时候,以下取的方法名会影响代码的可读性和可理解性;
UML类图
流程图
三、性能调优
看完了视频还是不懂测试代码要怎么写,之前的代码改完之后bug更多了,之后会继续改正代码
总结
感觉现在的状态就是之前的问题解决不了,新的问题又接踵而来,PMD插件一直都没有安好,总是在这种事情上耗费时间
代码找不出bug,基本上总是编译没错但是覆盖率太低,有很多代码没有用到。作业要求完成的内容都没有全部做到,解决一个问题花费好几天也没有进展,看视频打代码感觉没什么帮助,只能继续改自己的代码了
和作业里的还是差蛮多的,自己无法举一反三,只能慢慢加强自己的编程能力了,感觉自己的知识犹如枯井,每次做作业都好绝望。