一、实验报告封面
-
- 课程:Java程序设计 班级:1751 班 姓名:谢文航 学号:20175126
- 指导教师:娄嘉鹏 实验日期:2019年4月17日
- 实验时间:--- 实验序号:实验二
- 实验名称:Java开发环境的熟悉
- 实验题目:
- 实验要求:
- 完成实验二《Java面向对象程序设计》中的内容
- 其中Eclipse相关的内容参考Intellj IDEA 简易教程换成IDEA实现
- 参考实验二《Java面向对象程序设计》的一点说明,完成云班课中的检查点,也可以先完成实验报告,直接提交。注意不能只有截图,要有知识点,原理,遇到的问题和解决过程等说明。实验报告中一个检查点要有多张截图。
- 发表实验报告博客,标题“学期(如2018-2019-2) 学号(如20175300)实验二《Java面向对象程序设计》实验报告”
二、实验内容
(一)单元测试
(1) 三种代码: 伪代码、产品代码、测试代码。
伪代码与具体编程语言无关,伪代码从意图层面来解决问题,最终,伪代码是产品代码最自然的、最好的注释。
-
伪代码:
百分制转五分制: 如果成绩小于60,转成“不及格” 如果成绩在60与70之间,转成“及格” 如果成绩在70与80之间,转成“中等” 如果成绩在80与90之间,转成“良好” 如果成绩在90与100之间,转成“优秀” 其他,转成“错误”
-
产品代码:
-
public class MyUtil { public static String percentage2fivegrade(int grade) { if (grade < 0) return "错误"; else if(grade<60){ return "不及格"; } else if(grade<70){ return "及格"; } else if(grade<80){ return "中等"; } else if (grade<90){ return "良好"; } else if (grade<=100){ return "优秀"; } else return "错误"; } }
-
测试代码:
-
测试代码: import junit.framework.TestCase; import org.junit.Test; 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(115)); } @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中打开一个项目,并打开其测试项,插入代码
-
但是一般刚插进去的时候,test部分会是红色的,这需要我们先插入Junit包:
-
首先用everthing找到junit.jar的位置:
-
然后插入junit.jar:
-
接下来根据要求补充完整后,运行,看是否结果符合预期。
-
最终运行测试图:
(二)TDD(Test Driven Devlopment, 测试驱动开发)
- 一般步骤
- 明确当前要完成的功能,记录成一个测试列表
- 快速完成编写针对此功能的测试用例
- 测试代码编译不通过(没产品代码呢)
- 编写产品代码
- 测试通过
- 对代码进行重构,并保证测试通过(重构下次实验练习)
- 循环完成所有功能的开发
-
产品代码
public class StringBufferDemo { public static void main(String [] args){ StringBuffer buffer = new StringBuffer(); buffer.append('S'); buffer.append("tringBuffler"); System.out.println(buffer.charAt(1)); System.out.println(buffer.indexOf("tring")); System.out.println("buffer = "+buffer.toString()); } }
-
测试代码
import junit.framework.TestCase; import org.junit.Test; public class StringBufferDemoTest extends TestCase { StringBuffer a = new StringBuffer("StringBuffer"); StringBuffer b = new StringBuffer("StringBufferStringBuffer"); StringBuffer c = new StringBuffer("StringBufferStringBufferStringBuffer"); @Test public void testcapacity() throws Exception{ assertEquals(28,a.capacity()); assertEquals(40,b.capacity()); assertEquals(52,c.capacity()); } @Test public void testcharAt() throws Exception{ assertEquals('S',a.charAt(0)); assertEquals('g',a.charAt(5)); assertEquals('r',a.charAt(11)); } @Test public void testlength() throws Exception{ assertEquals(12,a.length()); assertEquals(24,b.length()); assertEquals(36,c.length()); } @Test public void testindexOf() throws Exception{ assertEquals(0,a.indexOf("Str")); assertEquals(5,a.indexOf("gBu")); assertEquals(7,a.indexOf("uff")); } }
-
照例,创建好StringBufferDemo.java后,创建一个test:
-
测试结果运行图:
(三)任务三:对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式
-
产品代码
abstract class Data{ public abstract 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); } } class Document { Data pd,qw; Document() { pd=new Integer(); qw=new Boolean(); } public void DisplayData(){ pd.DisplayValue(); qw.DisplayValue(); } } public class MyDoc { static Document d; public static void main(String[] args) { d = new Document(); d.DisplayData(); } }
-
首先我们根据要求算一下自己应该做第几题:26%2=2,所以做第二题:
- 2:让系统支持Boolean类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
-
要想输出Boolean,就必须要先添加一个Boolean的小类,可以依葫芦画瓢,根据上面Integer的内容写出Boolean的代码:
-
最后再在输出的Document类上加上刚才增加的内容:
-
class Document { Data pd,qw; Document() { pd=new Integer(); qw=new Boolean(); } public void DisplayData(){ pd.DisplayValue(); qw.DisplayValue(); } }
-
最终运行结果图,符合预期:
(四)任务四:以TDD的方式开发一个复数类Complex
-
产品代码
import static java.lang.Math.sqrt; public class MyComplex { double realpart,imagepart; public MyComplex(double R,double I){ realpart=R; imagepart=I; } public double getRealPart(){ return realpart; } public double getImagePart(){ return imagepart; } public MyComplex Complexjiafa(MyComplex a){ return new MyComplex((realpart+a.realpart),imagepart+a.imagepart); } public MyComplex Complexjianfa(MyComplex a){ return new MyComplex((realpart-a.realpart),imagepart-a.imagepart); } public MyComplex Complexchengfa(MyComplex a){ return new MyComplex((realpart*a.realpart-imagepart*a.imagepart),realpart*a.imagepart+imagepart*a.realpart); } public MyComplex Complexchufa(MyComplex a){ double d = sqrt(a.realpart*a.realpart)+sqrt(a.imagepart*a.imagepart); double e = (realpart*a.imagepart-imagepart*a.realpart); return new MyComplex((realpart*a.realpart+imagepart*a.imagepart)/d,imagepart/a.imagepart); } public static void main(String args[]){ MyComplex w = new MyComplex(2,10); MyComplex e = new MyComplex(1,3); MyComplex a = new MyComplex(4,5); MyComplex b = new MyComplex(3,7); a.Complexjiafa(b); System.out.println("("+a.realpart+"+"+a.imagepart+"i)+("+b.realpart+"+"+b.imagepart+"i)="+a.Complexjiafa(b).realpart+"+"+a.Complexjiafa(b).imagepart+"i"); System.out.println("("+a.realpart+"+"+a.imagepart+"i)-("+e.realpart+"+"+e.imagepart+"i)="+a.Complexjianfa(e).realpart+"+"+a.Complexjianfa(e).imagepart+"i"); System.out.println("("+a.realpart+"+"+a.imagepart+"i)*("+b.realpart+"+"+b.imagepart+"i)="+a.Complexchengfa(b).realpart+"+"+a.Complexchengfa(b).imagepart+"i"); System.out.println("("+a.realpart+"+"+a.imagepart+"i)/("+w.realpart+"+"+w.imagepart+"i)="+a.Complexchufa(w).realpart+"+"+a.Complexchufa(w).imagepart+"i"); } }
-
测试代码
-
import junit.framework.TestCase; import org.junit.Test; public class MyComplexTest extends TestCase { MyComplex a = new MyComplex(4,5); MyComplex b = new MyComplex(3,7); MyComplex c = new MyComplex(2.7,9.5); MyComplex d = new MyComplex(8,2.1); MyComplex e = new MyComplex(8,15); @Test public void testgetRealPart() throws Exception { assertEquals(4.0,a.getRealPart()); assertEquals(2.7,c.getRealPart()); } @Test public void testgetImagePart()throws Exception{ assertEquals(7.0,b.getImagePart()); assertEquals(2.1,d.getImagePart()); } @Test public void testComplexjiafa()throws Exception{ assertEquals(7.0,a.Complexjiafa(b).realpart); assertEquals(11.6,c.Complexjiafa(d).imagepart); } @Test public void testComplexjianfa()throws Exception{ assertEquals(1.0,a.Complexjianfa(b).realpart); assertEquals(7.4,c.Complexjianfa(d).imagepart); } @Test public void testComplexchengfa()throws Exception{ assertEquals(-23.0,a.Complexchengfa(b).realpart); assertEquals(81.67,c.Complexchengfa(d).imagepart); } @Test public void testComplexchufa()throws Exception{ assertEquals(2.0,e.Complexchufa(a).realpart); assertEquals(3.0,e.Complexchufa(a).imagepart); } }
-
首先思路是,要有一个定义复数的函数,即有实数部,和虚数部:
-
再设计一个,返回实数部和返回虚数部的函数:
-
最后再依次设计加减乘除的算法:
-
最后再增加一个test对其进行测试,看是否符合预期:
-
测试图:
(五)任务五:使用StarUML对实验二中的代码进行建模
-
UML图:
三、实验中遇到的问题及解决过程
问题1:添加junit.jar包后还是找不到文件test
问题1解决办法:
上网百度了一下,只要再将Junit-4.12.jar添加进去即可
问题2:在test的时候出现看不懂的英文错误
问题2解决办法:
百度了一下,test部分的名称必须为主程序里有的类,且首字母必须为小写。
问题3:出现错误:无法从静态上下文中引用上文方法
问题3解决办法:
使用getRealPart()函数的方法错误,应改为所定义的函数方式。
四、实验体会
本次实验我感觉难度很大,在做实验的时候,也在不停的百度,看能否解决自己的问题,虽然很累但收获也很多,并且也学会了UNL图的制作办法。