zoukankan      html  css  js  c++  java
  • 2016-2017-2 20155312 实验二《Java面向对象程序设计》实验报告

    知识总结

    • 伪代码
    • 产品代码
      • Java编程时,程序员对类实现的测试叫单元测试
      • 测试用例是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求。
    • 先写测试代码,然后再写产品代码的开发方法叫“测试驱动开发”(TDD)

    出现的问题及解决过程

    • 问题1:导入Junit包时找不到idea的lib文件夹

    • 解决过程:平时编写代码时,我都用虚拟机里的vim,只有在调试代码时,会使用安装在windows里的IDEA。我一般的打开方式是:先点开jetbrains-toolbox,再选择其中的IDEA Ultimate,所以当需要打开IDEA Ultimate安装包中的lib文件时,我发现自己对其安装路径并不熟悉。

      • 第一步:搜索IDEA Ultimate,找到其快捷方式的位置,然后发送到桌面

      • 第二步:右击桌面的图标,查看其属性

      • 第三步:复制上方的安装路径(截图如下)

      • 第四步:在IDEA中导入junit包

        • 1:打开File中的Project Structure

        • 2:点击Dependencies,单击右上角的+,然后选择第一个JARs....

        • 3:粘贴刚才复制的路径,分别选择lib文件夹中的junit-4.12.jar和junit,jar,点击OK

        • 4:选中这两个包然后点击OK

      • 第五步:新建测试类时,把鼠标移动到对应的MyUnil类上,点击左侧出现的黄色小灯泡

      • 第六步:点击Creat Test,然后出现的对话框如下:

      • 第七步:把Testing library选为JUnit3,点击OK完成

    • 问题2:怎么在IDEA中新建一个SourceFolder文件夹?

    • 解决过程:参考教程

      • 第一步:新建一个普通的文件夹:New->directory

      • 第二步:点击File中的Project Structure

      • 第三步:选择左侧Project Setting 中的Modules

      • 第四步:点击右侧的Sources,然后鼠标移到想要转换的普通文件上点右键,选择resource,按照下图标黄处进行:

      • 成功后文件图标变化,截图如下:

    • 问题4:根据实验二中Eclipse的教程,不知道怎么在Idea环境中直接创建测试代码,对应Eclipse的在SourceFolder文件夹中直接建一个Junit Test Case这一步。

    • 解决:TDD的设计理念是先创建测试类,再创建产品代码。在IDEA中,可以先创建一个空类,就是其中只有类名和方法名的框架,但是没有具体方法,然后参考在IDEA中使用JUnit进行方法测试,鼠标移到类名上,按快捷键Ctrl+Shift+t,或右键选择Go To->Test,或者点击左侧出现的黄色小灯泡->Creat Test,这些方法都可以用来生成一个Test。

    • 问题4:刚开始做实验二的第一个任务时,虽然导入了junit包,但实际上没有使用JUnit,测试类代码编译成功并没有出现“绿条”

    • 解决:原因在于要先创建一个test文件夹,并按右键Mark Directory as->Test Sources Root,这样创建的Test文件会自动生成到这个文件夹中,测试通过后才会出现绿条。

    • 问题5:因为给虚拟机分配的内存不多,所以虚拟机中的IDEA运行不起来,速度很慢,就只能在Windows里用IDEA测试代码。本次实验在往码云上git push代码时,是我在虚拟机中又创建了同样的文件,然后复制粘贴代码上去,再利用虚拟机的命令行推上去的,就很麻烦。

    • 解决:重新尝试在虚拟机中配置IDEA、克隆自己码云上的项目,但是运行速度实在是太慢,所以最终决定,以后在Windows里面编写代码,然后直接用IDEA的Git推送代码到码云。参考老师给出的IDEA教程

    五项实验任务

    一、学生成绩代码MyUtil

    产品代码如下:

    /**
     * Created by dell1 on 2017/4/20.
     */
    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 junit.framework.TestCase;
    import org.junit.Test;
    
    import static org.junit.Assert.*;
    
    /**
     * Created by dell1 on 2017/4/20.
     */
    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(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

    产品代码如下:

    /**
     * Created by dell1 on 2017/4/20.
     */
    
    
    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;
    
    import static org.junit.Assert.*;
    
    /**
     * Created by dell1 on 2017/4/20.
     */
    public class StringBufferDemoTest extends TestCase {
    
        StringBuffer string1 = new StringBuffer("Beautiful");
        StringBuffer string2 = new StringBuffer("Beautiful Girls");
        StringBuffer string3 = new StringBuffer("Beautiful Girls and Boys");
        @Test
        public void testCharAt(){
            assertEquals('a',string1.charAt(2));
            assertEquals(' ',string2.charAt(9));
            assertEquals('a',string3.charAt(16));
        }
        @Test
        public void testCapacity(){
            assertEquals(25,string1.capacity());
            assertEquals(31,string2.capacity());
            assertEquals(40,string3.capacity());
        }
        @Test
        public void testindexOf() {
            assertEquals(1, string3.indexOf("ea"));
        }
        @Test
        public void testlength() {
            assertEquals(9, string1.length());
        }
    }
    

    测试成功截图如下:

    三、体会OCP原则和DIP原则的应用

    20155312%6==4:让系统支持Float类
    代码:

    import java.util.Objects;
    
    /**
     * Created by dell1 on 2017/4/20.
     */
    abstract class Data {
        abstract public void DisplayValue();
    }
    class Integer extends Data {
        int value;
        Integer() {
            value=100;
        }
        public void DisplayValue(){
            System.out.println (value);
        }
    }
    class Long extends Data {
        long value;
        Long() {
            value=2147483647;
        }
        public void DisplayValue(){
            System.out.println (value);
        }
    }
    class Float extends Data {
        float value;
        Float() {
            value=(float)20155312.0;
        }
        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();
        }
    }
    class LongFactory extends Factory {
        public Data CreateDataObject(){
            return new Long();
        }
    }
    class FloatFactory extends Factory {
        public Data CreateDataObject(){
            return new Float();
        }
    }
    //Client classes
    class Document {
        Data data;
        Document(Factory factory){
            data = factory.CreateDataObject();
        }
        public void DisplayData(){
            data.DisplayValue();
    
        }
    }
    
    public class MyDoc {
        static Document d;
        MyDoc(Document d) {
            this.d = d;
        }
        public static void main(String[] args) {
            d = new Document(new FloatFactory());
            d.DisplayData();
        }
    }
    
    

    测试截图如下:

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

    产品代码如下:

    /**
     * Created by dell1 on 2017/4/21.
     */
    public class Complex {
        // 定义属性并生成getter,setter
        double RealPart;
        double ImagePart;
        // 定义构造函数
        public Complex(){
            RealPart = 0;
            ImagePart = 1;
        }
        public Complex(double R,double I){
            ImagePart = I;
            RealPart = R;
        }
    
        //Override Object
        public boolean equals(Object obj){
            if(this == obj) {
                return true;
            }
            if(!(obj instanceof Complex)) {
               return false;
            }
            Complex complex = (Complex) obj;
            if(complex.RealPart != ((Complex) obj).RealPart) {
                 return false;
             }
            if(complex.ImagePart != ((Complex) obj).ImagePart) {
                 return false;
             }
    
             return true;
        }
        public String toString()   {
            String string = "";
            if (ImagePart > 0)
                string =  RealPart + "+" + ImagePart + "i";
            if (ImagePart == 0)
                string =  RealPart + "";
            if (ImagePart < 0)
                string = RealPart + " " + ImagePart + "i";
            return string;
        }
        // 定义公有方法:加减乘除
        Complex ComplexAdd(Complex a) {
            return  new Complex(RealPart+a.RealPart,ImagePart+a.ImagePart);
        }
        Complex ComplexSub(Complex a) {
            return new Complex(RealPart-a.RealPart,ImagePart-a.ImagePart);
        }
        Complex ComplexMulti(Complex a) {
            return new Complex(RealPart*a.RealPart,ImagePart*a.ImagePart);
        }
        Complex ComplexDiv(Complex a) {
            if(a.RealPart==0||a.ImagePart==0) {
                System.out.println("被减数不能为0");
                return new Complex();
            }
    
            double d = Math.sqrt(a.RealPart*a.RealPart)+Math.sqrt(a.ImagePart*a.ImagePart);
            return new Complex((RealPart*a.RealPart+ImagePart*a.ImagePart)/d,Math.round((RealPart*a.ImagePart-ImagePart*a.RealPart)/d));
        }
    }
    
    

    测试代码如下:

    import static org.junit.Assert.*;
    import org.junit.Test;
    import junit.framework.TestCase;
    /**
     * Created by DELL on 2017/4/21.
     */
    public class ComplexTest extends TestCase {
        Complex complex = new Complex(1,1);
        @Test
        public void testAdd(){
            assertEquals(new Complex(3.3,3.4), complex.ComplexAdd(new Complex(2.3,2.4)));
        }
        //测试加法
        @Test
        public void testSub(){
            assertEquals(new Complex(-5.3,-2.4), complex.ComplexSub(new Complex(6.3,3.4)));
        }
        //测试减法
        @Test
        public void testMulti(){
            assertEquals(new Complex(3.0,2.0), complex.ComplexMulti(new Complex(3.0,2.0)));
        }
        //测试乘法
        @Test
        public void testDiv(){
            assertEquals(new Complex(1.0,1.0), complex.ComplexDiv(new Complex(1.0,1.0)));
            assertEquals(new Complex(0.0,0.0), complex.ComplexDiv(new Complex(1.0,0.0)));
            //assertEquals(new Complex(0.0,0.0), complex.ComplexDiv(new Complex(3,4)));
            //边缘测试
        }
        @Test
        public void testequals(){
            assertEquals(true, complex.equals(new Complex(1.0,1.0)));
        }
        //测试判断相等
    }
    

    测试成功截图如下:

    五、使用StarUML对实验二中的代码进行建模

    截图如下:

    步骤 耗时 百分比
    需求分析 2h 16%
    设计 1h 8%
    代码实现 2h 16%
    测试 2h 16%
    分析总结 3h 25%
  • 相关阅读:
    C/C++字符串函数之复制函数
    tesseract api C++使用例子
    error C2275: “XXX”: 将此类型用作表达式非法
    Socket通信原理探讨(C++为例)
    模拟按键,点击,滑动,在光标处输出字符
    安卓使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)
    【 转】__try,__except,__finally,__leave异常模型机制
    提高VS2010运行速度的技巧
    解决VS2010子目录中的.cpp文件引用上一级目录的stdafx.h找不到定义的问题
    1009MySQL数据库InnoDB存储引擎Log漫游
  • 原文地址:https://www.cnblogs.com/zjy1997/p/6747655.html
Copyright © 2011-2022 走看看