20155328 《Java程序设计》 实验二(Java面向对象程序设计) 实验报告
20155328 《Java程序设计》 实验二(Java面向对象程序设计) 实验报告
单元测试
一、单元测试和TDD
编程时需理清思路,将编程需求等想好,再开始编。此部分可用伪代码实现。
用编程语言将伪代码翻译一下,就是产品代码了。伪代码是产品代码最好的注释。
写了产品代码,还要写测试代码来证明自己的代码没有问题。Java编程时对类实现的测试叫单元测试。
关于单元测试的练习
需求:在一个MyUtil类中解决一个百分制成绩转成“优、良、中、及格、不及格”五级制成绩的功能。
根据需求撰写伪代码:
百分制转五分制:如果成绩小于60,转成“不及格”如果成绩在60与70之间,转成“及格”如果成绩在70与80之间,转成“中等”如果成绩在80与90之间,转成“良好”如果成绩在90与100之间,转成“优秀”其他,转成“错误”
用Java程序语言翻译伪代码为产品代码:
package experiment2;
public class MyUtil {public static String percentage2fivegrade(int grade){//如果成绩小于0,转成“错误”if (grade<0) return "错误";//如果成绩小于60,转成“不及格”if (grade<60) return "不及格";//如果成绩在60到70之间,转成“及格”else if (grade<70) return "及格";//如果成绩在70到80之间,转成“中等”else if (grade<80) return "中等";//如果成绩在80到90之间,转成“良好”else if (grade<90) return "良好";//如果成绩在90到100之间,转成“优秀”else if (grade<=100) return "优秀";//其他,转成“错误”else return "错误";}
}
接下来就是撰写测试代码,判断自己的产品代码有没有出错了: 选中MyUtil,在左边出现的小灯泡下拉菜单中选择Create Test
:
接着在创建出的MyUtilTest撰写测试代码:
import junit.framework.TestCase;
import org.junit.Test;
public class MyUtilTest extends TestCase {@Testpublic void testNormal() {assertEquals("不及格", MyUtil.percentage2fivegrade(55));assertEquals("及格", MyUtil.percentage2fivegrade(65));assertEquals("中等", MyUtil.percentage2fivegrade(75));assertEquals("良好", MyUtil.percentage2fivegrade(85));assertEquals("优秀", MyUtil.percentage2fivegrade(95));}@Testpublic void testException(){assertEquals("错误",MyUtil.percentage2fivegrade(105));assertEquals("错误",MyUtil.percentage2fivegrade(-55));}@Testpublic void testBoundary(){assertEquals("不及格",MyUtil.percentage2fivegrade(0));assertEquals("及格",MyUtil.percentage2fivegrade(60));assertEquals("中等",MyUtil.percentage2fivegrade(70));assertEquals("良好",MyUtil.percentage2fivegrade(80));assertEquals("优秀",MyUtil.percentage2fivegrade(90));assertEquals("优秀",MyUtil.percentage2fivegrade(100));}
}
以上测试代码中的testNormal()方法用于测试一般情况,而testException()和testBoundary()则是对意外情况和边界进行测试。如果三种测试中的一种没有通过,IDEA会提示是哪一块出错,以及出了什么错误:
我们可以从图中看出是边缘测试没有通过,原本应该显示“优秀”的显示了“错误”。于是回去看MyUtil类:
发现是设置“优秀”的范围时没有包含100分(我刚刚改的),所以100分便被归到了“错误”中。修改以后再次运行MyUtilTest,可看到三个测试都通过:
由此可看出,除了对普通数据的测试之外,边界情况和非法情况的测试也十分重要。
以TDD的方式研究学习StringBuffer
在老师的博客《积极主动敲代码,使用JUnit学习Java》中,给出了一个用于学习StringBuffer几个方法的程序:
public class StringBufferDemo{ public static void main(String [] args){ StringBuffer buffer = new StringBuffer(); buffer.append('S'); buffer.append("tringBuffer"); System.out.println(buffer.charAt(1)); System.out.println(buffer.capacity(); System.out.println(buffer.indexOf("tring")); System.out.println("buffer = " + buffer.toString()); }
}
了解这几个方法以后,选择了charAt(),length(),capacity()这三个方法,开始撰写产品代码:
public class StringBufferDemo {StringBuffer buffer=new StringBuffer();public Character charAt(int i){return buffer.charAt(i);}public int length(){return buffer.length();}public int capacity(){return buffer.capacity();}
}
接着是撰写测试代码,来测试这三个方法是否正确:
import junit.framework.TestCase;
import org.junit.Test;public class StringBufferDemoTest extends TestCase {StringBuffer a=new StringBuffer("yesterday");StringBuffer b=new StringBuffer("tomorrowisnotnow");StringBuffer c=new StringBuffer("liveherenowtodayisneccessary");@Testpublic void testcharAt(){assertEquals('y',a.charAt(0));assertEquals('r',b.charAt(5));assertEquals('n',c.charAt(8));}@Testpublic void testlength(){assertEquals(9,a.length());assertEquals(16,b.length());assertEquals(28,c.length());}@Testpublic void testcapacity(){assertEquals(25,a.capacity());assertEquals(32,b.capacity());assertEquals(44,c.capacity());}
}
在测试代码中,我设定了三个长度逐渐增加的字符串。运行后,显示测试成功。
以TDD的方式开发一个复数类Complex
要求:定义属性并生成getter,setter;定义构造函数;定义公有方法(加减乘除)。
测试代码:
import junit.framework.TestCase;
import org.junit.Test;public class ComplexTest extends TestCase {Complex a=new Complex(1,2);Complex b=new Complex(-2,-1);Complex c=new Complex(4,-2);Complex d=new Complex(4,-2);@Testpublic void testequals(){assertEquals(false,a.equals(b));assertEquals(false,b.equals(c));assertEquals(true,c.equals(d));}@Testpublic void testAdd(){assertEquals(new Complex(-1,1),a.ComplexAdd(b));assertEquals(new Complex(5,0),a.ComplexAdd(c));}@Testpublic void testSub(){assertEquals(new Complex(3,3),a.ComplexSub(b));assertEquals(new Complex(-3,4),a.ComplexSub(c));}@Testpublic void testMulti(){assertEquals(new Complex(0,-5),a.ComplexMulti(b));assertEquals(new Complex(8,6),a.ComplexMulti(c));}@Testpublic void testDiv(){assertEquals(new Complex(0,0.5),a.ComplexDiv(c));assertEquals(new Complex(-0.3,-0.4),b.ComplexDiv(c));}
}
产品代码:
public class Complex {// 定义属性并生成getter,setterprivate double r;private double i;// 定义构造函数public Complex(double r,double i){this.r=r;this.i=i;}public static double getRealPart(double r){return r;}public static double getImagePart(double i){return i;}//Override Objectpublic boolean equals(Object obj){Complex complex=(Complex) obj;if (complex.r!=r) {return false;}if(complex.i!=i){return false;}return true;}public String toString(){String str=new String();if (i==0) str=r+"";else if(i<0) str=r + ""+i+"i";else str=r+""+"+"+i+"i";return str;}// 定义公有方法:加减乘除Complex ComplexAdd(Complex a){return new Complex(r+a.r,i+a.i);}Complex ComplexSub(Complex a){return new Complex(r-a.r,i-a.i);}Complex ComplexMulti(Complex a){return new Complex(r*a.r-i*a.i,r*a.i+i*a.r);}Complex ComplexDiv(Complex a){return new Complex((r*a.r+i*a.i)/(a.r*a.r+a.i*a.i),(i*a.r-r*a.i)/(a.r*a.r+a.i*a.i));}
}
测试成功截图:
二、面向对象三要素
面向对象的三要素是封装、继承与多态。为借助抽象思维用好三要素:SOLID原则给出了指导。
SRP,单一职责原则;
OCP,开放-封闭原则;
LSP,替换原则;
ISP,接口分离原则;
DIP,依赖倒置原则。
练习,体会OCP原则和DIP原则的应用
老师给出的设计模式示例代码如下:
// Server Classes
abstract class Data { abstract public void DisplayValue();
}
class Integer extends Data { int value; Integer() {value=100; } public void DisplayValue(){System.out.println (value);} }
// Pattern Classes
abstract class Factory { abstract public Data CreateDataObject();
}
class IntFactory extends Factory { public Data CreateDataObject(){return new Integer(); }
}
//Client classes
class Document { Data pd; Document(Factory pf){ pd = pf.CreateDataObject(); } public void DisplayData(){pd.DisplayValue(); } } //Test classpublic class MyDoc {static Document d;public static void main(String[] args) {d = new Document(new IntFactory()); d.DisplayData(); }
}
用我的学号(28)模6取余,得到4,须根据以下结果进行代码扩充:让系统支持Float类,并在MyDoc类中添加测试代码表明添加正确。
abstract class Data {abstract public void DisplayValue();}class Integer extends Data {int value;Integer() {value=100;}public void DisplayValue(){System.out.println (value);}}class Float extends Data{float value;Float(){value=20155328;}public void DisplayValue(){System.out.println(value);}}// Pattern Classesabstract class Factory {abstract public Data CreateDataObject();}class IntFactory extends Factory {public Data CreateDataObject(){return new Integer();}}class FloatFactory extends Factory{public Data CreateDataObject(){return new Float();}}
测试代码如下:
//Test classpublic class MyDoc {static Document d;public static void main(String[] args) {d = new Document(new FloatFactory());d.DisplayData();}}
使用StarUML进行建模,画类图
三、实验中遇到的问题及解决方式
问题1:对StringBuffer的capacity()方法理解不太清晰。
解决方法:参考StringBuffer的Capacity详解及实践,知StringBuffer的默认大小是16,即如果长度小于16则默认容量为16,当StringBuffer达到最大容量时,会将最大容量增加到原来容量的两倍再加2.
问题2:在测试Complex类时,出现了这样的red bar:
- 解决方法:由图可知是equals()方法的撰写出现了问题,于是回到Complex中重新撰写如下:
public boolean equals(Object obj){Complex complex=(Complex) obj;if (complex.r!=r) {return false;}if(complex.i!=i){return false;}return true;}
然后再次测试,显示测试成功。
四、实验体会
相比起第一次实验,觉得这次实验让自己受益匪浅。在实验课前花了不少的时间跟着老师的step by step教程慢慢学习,体会到了单元测试的实用性。以前写代码就算会自己带一些测试之类的东西来看看是否正确,但一旦结果出错也需要耗费较长的时间去找出错误,而单元测试就可以通过red bar和错误提示很快找到错误源头,然后解决。希望自己以后可以更好更熟练的掌握TDD编程方法吧。
转载于:https://www.cnblogs.com/zyqzyq/p/6747415.html
20155328 《Java程序设计》 实验二(Java面向对象程序设计) 实验报告相关推荐
- 实验二《面向对象程序设计》_实验报告
实验二<面向对象程序设计>_实验报告 一.实验前期预习准备 Junit的安装和配置 选择File->Setting打开设置对话框,在设置对话框中选择Plugins, 单击Instal ...
- 20175333曹雅坤 实验二 Java面向对象程序设计
实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...
- java面向对象实验结论及心得_20162305 实验二 Java面向对象程序设计 实验报告
20162305 实验二 Java面向对象程序设计 实验报告 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D ...
- 20145206《Java程序设计》实验二Java面向对象程序设计实验报告
20145206<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...
- 20135234mqy 实验二 Java面向对象程序设计
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1352 姓名:mqy 学号:20135234 成绩: 指导教师:娄嘉 ...
- java面对对象教学_Java面向对象程序设计教与学
原标题:Java面向对象程序设计教与学 面向对象程序设计(Object Oriented Programming,OOP)主要研究如何从对象的角度出发构建程序单元以及程序开发机制,主要内容包括抽象的技 ...
- java面向对象程序设计题库_java面向对象程序设计习题集.doc
java面向对象程序设计习题集.doc 1JAVA 面向对象程序设计习题集 23目 录引 言 .6第一章 JAVA 基础 7一.填空题 7二.判断题 9三.选择题 9四.程序阅读题 26第二章 控制结 ...
- java基本语句回文数实验_实验二 java基本数据类型与把持语句.doc
实验二 java基本数据类型与把持语句.doc 还剩 4页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: 5System.out.println(num ...
- python顺序结构实验设计_实验二 顺序结构程序设计(验证性实验)
安徽工程大学 Python程序设计实验报告 班级物流192 姓名 徐敏 学号 3190505232 成绩 _____ 日期 2020.3.22 指导老师 修宇 [实验名称] 实验二 顺序结构程序设计( ...
- Java图形编程实验总结_实验二java图形界面编程2015级.doc
实验二java图形界面编程2015级.doc 实验二JAVA图形界面编程一.实验目的熟悉JAVA运行环境,编程掌握JAVASWING组件的图形界面编程.二.实验环境微机,软件MYECLIPSE,JDK ...
最新文章
- Smooks转换设计
- Vue 组件间通信六种方式
- Screen Saver(屏幕保护设置) in Cocoa
- 3_Long Short Term Memory (LSTM)
- 这家中国企业和星巴克对着干 年亏16亿却成为全球最快上市公司
- python 学习过程总结
- 【报告分享】2021年中国五大主流电商平台关于用户数据的最新规则汇总.pdf(附下载链接)...
- 分布式定时任务——elastic-job
- 【转自CSDN论坛】行业软件的利润从哪里来?
- 铁通玩跑跑卡丁车经常出现服务器无响应之解决办法
- Sklearn中的二分类模型可以进行多分类的原理
- Java实现可换行文字转图片
- 铝电解电容器在电路设计时的使用注意事项
- 服务端Skynet(五)——如何搭建一个实例
- 星辰变服务器响应超时,星辰变中最让秦羽痛心的是这四件事,最后一件无力挽回!...
- 初探国产蓝牙软件SDK
- python3.6打包成exe文件_详解如何将python3.6软件的py文件打包成exe程序
- 湖南省居民生活阶梯电价政策问答
- Map小结(java)
- 先用knn对数据集进行预处理再利用神经网络对数据集进行分类_监测大型民用结构的无线传感系统(二)——数据处理...
热门文章
- 5G最完整的PPT教材
- 这12大管理原则,经营者必知
- SAP WM LQ02 事务代码界面里不能为指定仓库号选择移动类型的问题对策
- Android Studio安卓开发中使用json来作为网络数据传输格式
- 从“元宇宙”热炒中理性看待我国虚拟现实产业发展
- Hinton一作新论文:如何在神经网络中表示“部分-整体层次结构”?
- 北斗定位2.0版来了!普通人手机可用,全免费!
- 有关博弈人机混合智能的再思考
- AI 如果 “智力爆炸” ,只有普通智力的人类是蝼蚁还是宠物?
- 浙大绘制首个地球微生物“社会关系”网络