关键词:
20175308 实验二《Java面向对象程序设计》实验报告
一、前期准备:
单元测试和TDD:
(一)单元测试
我们首先要会写三种代码:
- 伪代码
- 产品代码
测试代码
Java编程中,我们首先写伪代码
,它与具体的编程语言无关,从意图层面来解决问题,是产品代码
最自然的、最好的注释。当我们写好产品代码
后,我们还要写测试代码
。Java编程中程序员对类实现的测试即为单元测试
。在多人合作完成软件时,如何能让自己负责的模块功能定义尽量明确,且模块的质量得到稳定的、量化的保证?单元测试
就是一个很有效的解决方案。(二)TDD(Test Driven Devlopment, 测试驱动开发)
编程中,我们往往不会选择先写
产品代码
再写测试代码
,而是应该先写测试代码
,然后再写产品代码
,从而保证写出来的代码就是正确的。这种开发方法就叫做测试驱动开发(TDD)
,TDD的一般步骤如下:- 明确当前要完成的功能,记录成一个测试列表
- 快速完成编写针对此功能的测试用例
- 测试代码编译不通过(没产品代码呢)
- 编写产品代码
- 测试通过
- 对代码进行重构,并保证测试通过(重构下次实验练习)
循环完成所有功能的开发
Junit的安装与使用:
打开idea,Preferences中点击Plugins,在market中搜索junit,如图点选
JUnitGenerator V2.0
进行安装,安装后会显示installed。
- 在安装后,按照老师博客中的操作建立与
src
同等级的test
,用于存放各程序的test文件 新建立的文件可以点击小灯泡,建立test文件,或者选中类名,
Go to
>test
,新建test文件并勾选要测试的方法即可
二、实验步骤:
任务一:在一个MyUtil类中解决一个百分制成绩转成“优、良、中、及格、不及格”五级制成绩的功能。
- 伪代码:
百分制转五分制:
如果成绩小于60,转成“不及格”
如果成绩在60与70之间,转成“及格”
如果成绩在70与80之间,转成“中等”
如果成绩在80与90之间,转成“良好”
如果成绩在90与100之间,转成“优秀”
其他,转成“错误”
- 产品代码:
public class MyUtil
public static String percentage2fivegrade(int grade)
//如果成绩小于60,转成“不及格”
if (grade<60&&grade>=0)
return "不及格";
//如果成绩在60与70之间,转成“及格”
else if (grade < 70&&grade>=60)
return "及格";
//如果成绩在70与80之间,转成“中等”
else if (grade < 80&&grade>=70)
return "中等";
//如果成绩在80与90之间,转成“良好”
else if (grade < 90&&grade>=80)
return "良好";
//如果成绩在90与100之间,转成“优秀”
else if (grade <= 100&&grade>=90)
return "优秀";
//其他,转成“错误”
else
return "错误";
- 测试代码:
import org.junit.Test;
import junit.framework.TestCase;
public class MyUtilTest extends TestCase
@Test
public void testNormal()
assertEquals("不及格", MyUtil.percentage2fivegrade(55));
assertEquals("及格", MyUtil.percentage2fivegrade(65));
assertEquals("中等", MyUtil.percentage2fivegrade(75));
assertEquals("良好", MyUtil.percentage2fivegrade(85));
assertEquals("优秀", MyUtil.percentage2fivegrade(95));
@Test
public void testException()
assertEquals("错误",MyUtil.percentage2fivegrade(-55));
assertEquals("错误",MyUtil.percentage2fivegrade(105));
@Test
public 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));
- 系统反馈结果,如果测试失败,IDEA会指出具体哪个测试用例出现错误,修改代码直至所有测试均通过
测试成功截图
任务二:以TDD的方式研究学习StringBuffer
老师给出的StringBufferDemo
代码如下:
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());
对以上代码进行改写,得到每一步调用方法的返回来进行验证,改写代码如下:
public class StringBufferDemo
StringBuffer buffer = new StringBuffer();
public StringBufferDemo(StringBuffer buffer)
this.buffer = buffer;
public Character charAt(int i)
return buffer.charAt(i);
public int capacity()
return buffer.capacity();
public int length()
return buffer.length();
public int indexOf(String buf)
return buffer.indexOf(buf);
通过查阅相关资料和推测,各方法的作用如下:
charAt(int i)
:得到字符串中第i个位置的字符,考虑到数组下标从0开始,字符串的位置也从0开始记。capacity()
:返回当前容量。容量指可用于最新插入的字符的存储量,超过这一容量就需要再次进行分配。length()
:得到字符串长度indexOf(String buf)
:得到buf字符串第一次出现的位置,该位置为buf中第一个字符的位置
进行测试,测试代码如下:
import junit.framework.TestCase;
import org.junit.Test;
import static org.junit.Assert.*;
// 20175308
public class StringBufferDemoTest extends TestCase
StringBuffer a = new StringBuffer("StringBuffer");
StringBuffer b = new StringBuffer("StringBufferStringBuffer");
StringBuffer c = new StringBuffer("StringBuffer tested by 175308");
@Test
public void testCharAt() throws Exception
assertEquals('S',a.charAt(0));//验证返回是否是整个字符串中的第一个字符
assertEquals('g',b.charAt(5));//验证返回是否是整个字符串的第六个字符
assertEquals('t',c.charAt(16));
@Test
public void testcapacity() throws Exception//
assertEquals(28,a.capacity());
assertEquals(40,b.capacity());
assertEquals(45,c.capacity());
@Test
public void testlength() throws Exception
assertEquals(12,a.length());//验证字符串a的长度
assertEquals(24,b.length());
assertEquals(29,c.length());
@Test
public void testindexOf()
assertEquals(6,a.indexOf("Buff"));
assertEquals(3,b.indexOf("ing"));
assertEquals(23,c.indexOf("1753"));
测试成功截图:
任务三:对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式
我的学号后两位对6取余为2,应该使系统支持boolean类。在实验开始之前,首先要熟悉SOLID
原则:
依据OCP原则和DIP原则,我们在扩充示例使其支持Boolean类时不应该直接添加或修改已有类中的方法(OCP原则要求软件实体对修改封闭),而是采用一种抽象工厂
的方法来进行对于程序的扩充。具体代码如下:
abstract class Data
abstract public void DisplayValue();
class Integer extends Data
int value;
Integer()
value=100;
public void DisplayValue()
System.out.println (value);
class Boolean extends Data
boolean value;
Boolean()
value=true;
public void DisplayValue()
System.out.println(value);
abstract class Factory
abstract public Data CreateDataObject();
class IntFactory extends Factory
public Data CreateDataObject()
return new Integer();
class BooleanFactory extends Factory
public Data CreateDataObject()
return new Boolean();
class Document
Data pd;
Document(Factory pf)
pd = pf.CreateDataObject();
public void DisplayData()
pd.DisplayValue();
//Test class
public class MyDoc
static Document d;
static Document e;
public static void main(String[] args)
d = new Document(new IntFactory());
d.DisplayData();
e=new Document(new BooleanFactory()); //20175308
e.DisplayData();
运行成功截图:
任务四:以TDD的方式开发一个复数类Complex
由于在之前的结对项目中已经有过对定义分数类的经验,对于要求较为简单的复数类的定义也算信手拈来。
- 伪代码:
// 定义属性并生成getter,setter
double RealPart;
double ImagePart;
// 定义构造函数
public Complex()
public Complex(double R,double I)
//Override Object
public boolean equals(Object obj)
public String toString()
// 定义公有方法:加减乘除
Complex ComplexAdd(Complex a)
Complex ComplexSub(Complex a)
Complex ComplexMulti(Complex a)
Complex ComplexDiv(Complex a)
- 测试代码:
import org.junit.Test;
import junit.framework.TestCase;
public class ComplexTest extends TestCase
Complex a =new Complex(3.0,4.0);
Complex b =new Complex( 2.0,-4.0);
Complex c =new Complex(0.0,0.0);
Complex d =new Complex(-3.0,0.0);
Complex e =new Complex(-6.0,-0.8);
@Test
public void testgetRealPart()throws Exception
assertEquals(3.0,a.getRealPart());
assertEquals(2.0,b.getRealPart());
assertEquals(0.0,c.getRealPart());
assertEquals(-3.0,d.getRealPart());
assertEquals(-6.0,e.getRealPart());
@Test
public void testgetImagePart()throws Exception
assertEquals(4.0,a.getImagePart());
assertEquals(-4.0,b.getImagePart());
assertEquals(0.0,c.getImagePart());
assertEquals(0.0,d.getImagePart());
assertEquals(0.8,e.getImagePart());
@Test
public void testtoString()throws Exception
assertEquals("3.0+4.0i",a.toString());
assertEquals("2.0-4.0i",b.toString());
assertEquals("0",c.toString());
assertEquals("-3.0",d.toString());
assertEquals("-6.0-8.0i",e.toString());
@Test
public void testComplexAdd()throws Exception
assertEquals("5.0",a.ComplexAdd(b).toString());
assertEquals("2.0-4.0i",b.ComplexAdd(c).toString());
assertEquals("-1.0-4.0i",b.ComplexAdd(d).toString());
@Test
public void testComplexSub()throws Exception
assertEquals("1.0+8.0i",a.ComplexSub(b).toString());
assertEquals("-2.0+4.0i",c.ComplexSub(b).toString());
assertEquals("3.0",c.ComplexSub(d).toString());
@Test
public void testComplexMulti()throws Exception
assertEquals("22.0-4.0i",a.ComplexMulti(b).toString());
assertEquals("0",b.ComplexMulti(c).toString());
assertEquals("18.0+2.4i",d.ComplexMulti(e).toString());
@Test
public void testComplexDiv()throws Exception
assertEquals("-0.2-1.25i",a.ComplexDiv(b).toString());
assertEquals("0",c.ComplexDiv(b).toString());
@Test
public void testequals()throws Exception
assertEquals(true,a.equals(a));
assertEquals(false,a.equals(b));
- 产品代码:
import com.sun.jdi.DoubleValue;
import java.util.zip.CheckedOutputStream;
import java.text.DecimalFormat;
public class Complex
double RealPart=0;
double ImagePart=0;
public Complex()
public Complex(double RealPart,double ImagePart)
this.RealPart=RealPart;
this.ImagePart=ImagePart;
public double getRealPart()
return RealPart;
public double getImagePart()
return ImagePart;
public String toString()
String s = "";
double r=RealPart;
double i=ImagePart;
if(r==0&&i==0)
s="0";
else if(r==0&&i!=0)
s=i+"i";
else if(r!=0&&i<0)
s=r+""+i+"i";
else if(r!=0&&i==0)
s=r+"";
else
s=r+"+"+i+"i";
return s;
public boolean equals(Object obj)
if(this==obj)
return true;
else return false;
DecimalFormat df = new DecimalFormat( "0.0");
public Complex ComplexAdd(Complex a)
return new Complex(RealPart+a.getRealPart(),ImagePart+a.getImagePart());
public Complex ComplexSub(Complex a)
return new Complex(RealPart-a.getRealPart(),ImagePart-a.getImagePart());
public Complex ComplexMulti(Complex a)
double r=RealPart*a.getRealPart()-ImagePart*a.getImagePart();
double i =ImagePart*a.getRealPart()+RealPart*a.getImagePart();
return new Complex(Double.valueOf(df.format(r)),Double.valueOf(df.format(i)));
public Complex ComplexDiv(Complex a)
double r=(RealPart * a.ImagePart + ImagePart * a.RealPart) / (a.ImagePart * a.ImagePart + a.RealPart * a.RealPart);
double i=(ImagePart * a.ImagePart + RealPart * a.RealPart) / (a.RealPart * a.RealPart + a.RealPart * a.RealPart);
return new Complex(Double.valueOf(df.format(r)),Double.valueOf(df.format(i)));
测试成功截图:
PSP图:
步骤 | 耗时 | 百分比 |
---|---|---|
需求分析 | 2min | 4% |
设计 | 5min | 10% |
代码实现 | 12min | 24% |
测试 | 25min | 50% |
分析总结 | 6min | 12% |
任务五:对实验二中的代码进行建模
对于UML图的使用一直缺少锻炼,直到进行结对项目对项目进行建模才开始学着使用。有关UML图的使用可以在网络上找到很详尽的讲解:参考链接
任务要求类图中至少要有两个类,最为符合要求的便是MyDoc.java的代码了,UML图如下:
实验中遇到的问题及解决:
1.下载Junit后仍然出现标红无法使用。
有关这个问题的解决网络上给出了五花八门许许多多的答案,但我尝试过来一直都没有找到正确的解决方法,直到我又仔细的阅览了一下老师的博客,其实已经给了详尽的操作,里面提醒了一步倒包的操作,由于系统差别一时没有对应上。mac版IDEA解决方法如下:
- 在
File
菜单栏找到Project Structure
- 点击
Dependencies
,直接勾选即可
2.任务一中传入-55系统输出不及格而非错误。
此时是未经修改过的代码,此时代码如下:
public class MyUtil
public static String percentage2fivegrade(int grade)
//如果成绩小于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 "错误";
当传入-55时,虽然-55的分数理论上一定是错误的,但是在代码中只会检测其是否小于60,满足条件后直接得出结果。该问题的解决其实很简单,只需在判断是否小于60之前先加一步判断正负的步骤即可(超出100的数字判断由最后的else负责)。出于C语言学习时的习惯,我用&&
对每一步的判断条件进行连接,形成我最后的代码。
3.复数类中涉及double运算可能会给出一个极长位数的答案
在double类型的运算中,经常由于一些不可描述的原因产生如下的结果:
理论上心里知道咋回事就可以了,但为了看到百分百的Test passed
,还是要含泪修改。
原有的代码为(主要出错在乘除法):
ComplexMulti(Complex a)
return new Complex(RealPart*a.getRealPart()-ImagePart*a.getImagePart(),ImagePart*a.getRealPart()+RealPart*a.getImagePart());
public Complex ComplexDiv(Complex a)
return new Complex((RealPart * a.ImagePart + ImagePart * a.RealPart) / (a.ImagePart * a.ImagePart + a.RealPart * a.RealPart), (ImagePart * a.ImagePart + RealPart * a.RealPart) / (a.RealPart * a.RealPart + a.RealPart * a.RealPart));
经过查阅相关资料,java指定小数点后的位数可以通过导入import java.text.DecimalFormat;
来实现,DecimalFormat df = new DecimalFormat( "0.0");
就将小数点后的位数控制在了一位。
注意??:此时的df.format(r)为string类型,还要再进行一次类型转换
将产品代码修改为任务二中的版本后,再运行一次刚才出错的test,测试通过!
三、参考:
- http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST
- http://www.cnblogs.com/rocedu/p/6736847.html
- https://blog.csdn.net/tastill/article/details/80346443
- https://blog.csdn.net/xinqing5130/article/details/84099628
实验二:java面向对象程序设计
实验二Java面向对象程序设计目录[一、单元测试和TDD](#first)[任务一:实现百分制成绩转成“优、良、中、及格、不及格”五级制成绩的功能](#firstTask)[任务二:以TDD的方式研究学习StringBuffer](#SecondTask)[二、面向对象三要素:封装... 查看详情
20165223实验二面向对象程序设计(代码片段)
目录一、实验报告封面二、具体实验内容(一)初步掌握JUnit的使用(二)IDEA中的JAVA程序开发(三)自主练习三、实验总结四、PSP时间一、实验报告封面北京电子科技学院(BESTI)实验报告◆◇◆◇课程Java程序设计班级1652班姓... 查看详情
20175209实验二《java面向对象程序设计》实验报告
20175209实验二《Java面向对象程序设计》实验报告一、实验前期准备了解三种代码伪代码产品代码测试代码我们先写伪代码,伪代码从意图层面来解决问题;有了伪代码我们用特定编程语言翻译一下,就是可用的产品代码;写完产... 查看详情
20165201实验二面向对象程序设计(代码片段)
##20165201实验二面向对象程序设计Java面向对象程序设计-1实验目的与要求:参考http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST完成单元测试的学习提交最后三个JUnit测试用例(正常情况,错误情况,边界情况)都通过的截图,截图上... 查看详情
20145207实验二《java面向对象程序设计》实验报告
实验内容1.初步掌握单元测试和TDD2.理解并掌握面向对象三要素:封装、继承、多态3.初步掌握UML建模4.熟悉S.O.L.I.D原则5.了解设计模式实验要求1.没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》课程2.完成实... 查看详情
2018-2019-220175105王鑫浩实验二《java面向对象程序设计》实验报告
一、实验步骤1.初步掌握单元测试和TDD2.理解并掌握面向对象三要素:封装,继承,多态3.初步掌握UML建模4.熟悉S.O.L.I.D原则5.了解设计模式二、实验内容(一)、单元测试1.三种代码伪代码百分制转五分制:如果成绩小于60,转成... 查看详情
20175330实验二《java面向对象程序设计》实验报告
一、前期准备:unit的安装与使用:打开idea,Preferences中点击Plugins,在market中搜索junit,如图点选JUnitGeneratorV2.0进行安装,安装后会显示installed。 新建立的文件可以点击小灯泡,建立test文件,或者选中类名,Goto>test,新建t... 查看详情
面向对象分析与设计实验二
Usecase 用况名:buyProducts简述:用户购买商品参与者:customer,business前置条件:用户必须登陆,商品余量不为零细节:用户通过搜索商品,进入到商品详情页面,可以点击购买,通过支付平台支付后,可下订单,系统自动通... 查看详情
2062326齐力锋实验二《java面向对象程序设计》实验报告
北京电子科技学院(BESTI)实 验 报 告课程: 程序设计与数据结构 班级: 1623 查看详情
2018-2019-220175211实验二《java面向对象程序设计》实验报告
目录代码托管一、命令行下Java程序开发二、IDEA下Java程序开发、调试(1)建立与Git的链接(2)开发、调试程序(3)上传代码至码云三、练习四、问题及解决五、学习总结代码托管一、命令行下Java程序开发在码云上建立以学号命名的仓... 查看详情
实验报告二面向对象程序设计(代码片段)
一、面向对象程序设计-11、检查点要求参考http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST参考http://www.cnblogs.com/rocedu/p/6736847.html提交最后三个测试用例都通过的截图,截图上要有画图加水印,输入自己的学号。2、截图3、相关代码的... 查看详情
20175213《java程序设计》实验二java面向对象程序设计实验报告
实验内容1.初步掌握单元测试和TDD2.理解并掌握面向对象三要素:封装,继承,多态3.初步掌握UML建模4.熟悉S.O.L.I.D原则5.了解设计模式知识总结1.伪代码2.产品代码:①Java编程时,程序员对类实现的测试叫单元测试。②测试用例是... 查看详情
面向对象方法及软件工程实验二(代码片段)
一.代码链接:https://gitee.com/GjqDream/css_learning/tree/master二.网页截图:当鼠标移动到电影名字上或旁边时会有简单的动画效果——字体加粗、背景色渐变,当鼠标移动到电影类别上时会改变背景色,点击时会跳转到相应的类... 查看详情
[wut]武理四年课程实验导航
武理四年课程实验导航第一学期暂无收录第二学期面向对象程序设计计算机基础与编程综合实验第三学期数据结构面向对象与多线程综合实验第四学期可视化编程计算机数值分析软件工程基础实验数据结构与算法综合实验第五学... 查看详情
面向对象分析与设计实验七
实验一:http://www.cnblogs.com/scaugsh/p/8983219.html实验二:http://www.cnblogs.com/scaugsh/p/8983253.html实验三:http://www.cnblogs.com/scaugsh/p/9046697.html实验四:http://www.cnblogs.com/scaugsh/p/9056838.html实验七: 查看详情
实验二
201823022019-2020-1《数据结构与面向对象程序设计》实验二报告课程:《程序设计与数据结构》班级:1823姓名:孙嘉伟学号:20182302实验教师:王志强实验日期:2019年9月14日必修/选修:必修1.实验内容(1)编写简单的计算器,完成... 查看详情
2018-2019-220175207实验二《面向对象程序设计》实验报告(代码片段)
...下载并配置单元测试工具JUnit使用Junit学JAVATDDS.O.L.I.D原则实验总结IDEA中下载并配置单元测试工具JUnit(虚拟机中)下载File->Settings或Ctrl+Alt+S进入Settings页面,点击Plugins,在搜索框内输入junit,找到对应的工具并下载。找到IDEA的... 查看详情
20155217实验四《java面向对象程序设计》实验报告
20155217实验四《Java面向对象程序设计》实验报告一、实验内容1.基于AndroidStudio开发简单的Android应用并部署测试;2.了解Android、组件、布局管理器的使用;3.掌握Android中事件处理机制。二、安装软件出现的问题1.安装这个版本的,... 查看详情