20165202 实验二 Java面向对象程序设计

实验二 Java面向对象程序设计

一、实验报告封面

  • 课程:Java程序设计 班级:1652班 姓名:贾海粟 学号:20165202

  • 指导教师:娄嘉鹏 实验日期:2018年4月16日 实验时间:15:35 - 17:15

  • 实验序号:实验二 实验名称:Java面向对象程序设计

实验内容:

1初步掌握单元测试和TDD

2 理解并掌握面向对象三要素:封装、继承、多态

3 初步掌握UML建模

4 熟悉S.O.L.I.D原则

5 了解设计模式

实验要求:

1 没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程;

2 完成实验、撰写实验报告,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等);

3 实验报告中统计自己的PSP(Personal Software Process)时间;

4 严禁抄袭。

二、实验内容及步骤

(一)使用JUnit 单元测试

参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST 完成单元测试的学习
提交最后三个JUnit测试用例(正常情况,错误情况,边界情况)都通过的截图,截图上要有画图加水印,输入自己的学号
本提交点考查JUnit会不会使用,测试用例至少要包含正常情况,错误情况,边界情况的测试。

产品代码

public class MyUtil{
    public static String percentage2fivegrade(int grade){
        //如果成绩小于0,转成“错误”
        if ((grade < 0))
            return "错误";
            //如果成绩小于60,转成“不及格”
        else 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 "优秀";
            //如果成绩大于100,转成“错误”
        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 testExceptions () {
        assertEquals("错误",MyUtil.percentage2fivegrade(105));
        assertEquals("错误",MyUtil.percentage2fivegrade(-55));
    }

    @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));
    }
}

码云链接

测试截图

(二)以TDD的方式研究学习StringBuffer

TDD的一般步骤如下:

  • 明确当前要完成的功能,记录成一个测试列表
  • 快速完成编写针对此功能的测试用例
  • 测试代码编译不通过(没产品代码呢)
  • 编写产品代码
  • 测试通过
  • 对代码进行重构,并保证测试通过(重构下次实验练习)
  • 循环完成所有功能的开发

产品代码

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);
    }
}

码云链接

测试代码

import junit.framework.TestCase;
import org.junit.Test;

public class StringBufferDemoTest extends TestCase {
    StringBuffer a = new StringBuffer("StringBuffer");
    //测试12个字符
    StringBuffer b = new StringBuffer("StringBufferStringBuffer");
    //测试24个字符
    StringBuffer c = new StringBuffer("StringBufferStringBufferStringBuffer");
    //测试36个字符
    StringBuffer d = new StringBuffer("StringBufferStringBufferStringBufferStr");
    //测试39个字符
    @Test
    public void testcharAt() {
        assertEquals('S',a.charAt(0));
        assertEquals('e',b.charAt(10));
        assertEquals('f',c.charAt(20));
        assertEquals('B',d.charAt(30));
    }
    @Test
    public void testcapacity() {
        assertEquals(28,a.capacity());
        assertEquals(40,b.capacity());
        assertEquals(52,c.capacity());
        assertEquals(55,d.capacity());
    }
    @Test
    public void testindexOf() {
        assertEquals(0,a.indexOf("Str"));
        assertEquals(3,b.indexOf("ing"));
        assertEquals(6,c.indexOf("Buffer"));
        assertEquals(8,d.indexOf("ff"));
    }
    @Test
    public void testlength() {
        assertEquals(12,a.length());
        assertEquals(24,b.length());
        assertEquals(36,c.length());
        assertEquals(39,d.length());
    }
}

码云链接

测试截图

(三)设计模式示例进行扩充,让系统支持Boolean类

参考实验二 Java面向对象程序设计
对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式

用自己的学号%6进行取余运算,根据结果进行代码扩充:
0:让系统支持Byte类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
1:让系统支持Short类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
2:让系统支持Boolean类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
3:让系统支持Long类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
4:让系统支持Float类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
5:让系统支持Double类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印

产品代码

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;
    Document() {
        pd=new Boolean();
    }
    public void DisplayData(){
        pd.DisplayValue();
    }
}
public class MyDoc {
    static Document d;
    public static void main(String[] args) {
        d = new Document();
        d.DisplayData();
    }
}

码云链接

测试截图

(四)以TDD的方式开发一个复数类Complex

参考http://www.cnblogs.com/rocedu/p/6736847.html

任务:以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 java.lang.*;
public class Complex {
    // 定义属性并生成getter,setter
    public void setRealpart(double R){
        RealPart=R;
    }
    public double getRealpart(){
        return RealPart;
    }
    public void setImagePart(double I){
        ImagePart=I;
    }
    public double getImagePart(){
        return ImagePart;
    }

    double RealPart;
    double ImagePart;
    // 定义构造函数
    public Complex(double R,double I){
        RealPart=R;
        ImagePart=I;
    }

    //Override Object
    public boolean equals(Complex obj){
        if(this.getRealpart()==obj.getRealpart() && this.getImagePart()==obj.getImagePart())
            return true;
        else
            return false;
    }
    public String toString(){
        return RealPart+"+"+ImagePart+"i";
    }

    // 定义公有方法:加减乘除
    public Complex ComplexAdd(Complex a){
        return new Complex(this.RealPart+a.RealPart,this.ImagePart+a.ImagePart);
    }
    public Complex ComplexSub(Complex a){
        return new Complex(this.RealPart-a.RealPart,this.ImagePart-a.ImagePart);
    }
    public Complex ComplexMulti(Complex a){
        return new Complex(this.RealPart*a.RealPart-this.ImagePart*a.ImagePart,
                this.RealPart*a.ImagePart+this.ImagePart*a.RealPart);
    }
    public Complex ComplexDiv(Complex a){
        double x=this.RealPart;
        double y=this.ImagePart;
        double m=a.RealPart;
        double n=a.ImagePart;
        return new Complex((x*m+y*n)/(m*m+n*n),(y*m-x*n)/(m*m+n*n));
    }
}

码云链接

测试代码

import junit.framework.TestCase;
import org.junit.Test;
public class ComplexTest extends TestCase {
    Complex p1=new Complex(1,1);
    Complex p2=new Complex(1,-1);
    @Test
    public void testAdd(){
        assertEquals("2.0+0.0i",p1.ComplexAdd(p2).toString());
        System.out.println(p1.ComplexAdd(p2));
    }
    @Test
    public void testSub(){
        assertEquals("0.0+2.0i",p1.ComplexSub(p2).toString());
        System.out.println(p1.ComplexSub(p2));
    }
     @Test
    public void testMulti(){
        assertEquals("2.0+0.0i",p1.ComplexMulti(p2).toString());
        System.out.println(p1.ComplexSub(p2));
    }
      @Test
    public void testDiv(){
        assertEquals("0.0+1.0i",p1.ComplexDiv(p2).toString());
        System.out.println(p1.ComplexDiv(p2));
    }
}

码云链接

测试截图

(五)UML截图

使用[WhiteStarUML](http://whitestaruml.sourceforge.net/)对实验二中的代码进行建模,发类图的截图,加上学号水印。
参考http://www.cnblogs.com/rocedu/p/6736847.html

类图中只少两个类。

三、实验过程中遇到的问题

(一):按教程介绍无法下载JUnitGenerator V2.0

解决方案:参考《idea 无法下载JUnitGenerator V2.0插件解决办法》,我在连接提供的网址下载了jar文件。使用file->settting->plugins->install plugin from disk操作后成功安装

(二)step1中junittest显示红色,和教程中提到的testcase为红色不太一致

解决方案:按照查找方式选取的两个jar均不可用,我在网络上下载了一个进行安装,问题得到解决。

四、实验体会与总结

本次实验主要包括junit的使用,通过实际练习我发现junit测试的可以很大提高效率,迅速找到问题所在。本实验中一些题目略难,好在老师提供了一些模板供参考,在日常学习还是要加强巩固基础。

步骤 耗时 百分比
需求分析 20min 7%
设计 60min 21%
代码实现 120min 42%
测试 40min 15%
分析总结 30min 11%
posted @ 2018-04-16 01:37  Haimi98  阅读(248)  评论(1编辑  收藏  举报