zoukankan      html  css  js  c++  java
  • 20175316 盛茂淞 2018-2019-2 《Java程序设计》实验二 面向对象程序设计 实验报告

    20175316 盛茂淞 2018-2019-2 《Java程序设计》实验二 面向对象程序设计 实验报告

    (一)单元测试

    • 在 IDEA中我们把产品代码放在src目录中,把测试代码放在test目录中,右键单击项目,在弹出的菜单中选择New->Directory新建一个目录;
    • test目录中放的也是Java代码,在弹出的菜单中选择Mark Directory as->Test Sources Root就可以了:

    TDD(测试驱动开发):

    • 伪代码(思路)
    • 测试代码(产品预期功能)
    • 产品代码(实现预期功能)
      基于TDD,可以有效避免过度开发的现象,因为我们只需要让测试通过即可。

    TDD的一般步骤如下:

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

    代码需求

    • 实现成绩的转换,百分制转五分制,并输出结果。

    伪代码

    • 根据上面的需求,可以先写出程序的伪代码,伪代码是一个程序最好的注释,有助于我们理解问题和解决问题,改程序伪代码如下:
    百分制转五分制:
    如果成绩小于60,转成“不及格”
    如果成绩在60与70之间,转成“及格”
    如果成绩在70与80之间,转成“中等”
    如果成绩在80与90之间,转成“良好”
    如果成绩在90与100之间,转成“优秀”
    其他,转成“错误”
    

    产品代码

    • 根据伪代码不难编出产品代码,通过老师给的关键方法提示,我定义了设定复数的方法,代码段如下:
    public class Main{
       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 "错误";
       }
    }
    
    • 测试代码
      1.正常情况测试
    public class Main {
            public static void main(String[] args) {
                 //测试正常情况
                 if(Main.percentage2fivegrade(55) != "不及格")
                     System.out.println("test failed!");
                 else if(Main.percentage2fivegrade(65) != "及格")
                     System.out.println("test failed!");
                 else if(Main.percentage2fivegrade(75) != "中等")
                     System.out.println("test failed!");
                 else if(Main.percentage2fivegrade(85) != "良好")
                     System.out.println("test failed!");
                 else if(Main.percentage2fivegrade(95) != "优秀")
                     System.out.println("test failed!");
                 else 
                     System.out.println("test passed!");
             }
         }
    

    运行结果:测试成功

    2.50分测试

    public class MainTest {
        public static void main(String[] args) {
                // 百分制成绩是50时应该返回五级制的“不及格”
                if(Main.percentage2fivegrade(50) != "不及格")
                    System.out.println("test failed!");
                else 
                    System.out.println("test passed!");
            }
        }
    

    运行结果:成功

    3.异常情况测试

    public class MyUtilTest {
            public static void main(String[] args) {
                //测试出错情况
                if(MyUtil.percentage2fivegrade(-10) != "错误")
                    System.out.println("test failed 1!");
                else if(MyUtil.percentage2fivegrade(115) != "错误")
                    System.out.println("test failed 2!");
                else 
                    System.out.println("test passed!");
            }
        }   
    

    测试结果:失败

    4.增加判断负分或大于100分情况

    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 "错误";
           }
        }
    

    运行结果

    5.测试边界情况

    public class MainTest {
            public static void main(String[] args) {
                //测试边界情况
                if(Main.percentage2fivegrade(0) != "不及格")
                   System.out.println("test failed 1!");
                else if(Main.percentage2fivegrade(60) != "及格")
                    System.out.println("test failed 2!");
                else if(Main.percentage2fivegrade(70) != "中等")
                    System.out.println("test failed 3!");
                else if(Main.percentage2fivegrade(80) != "良好")
                    System.out.println("test failed 4!");
                else if(Main.percentage2fivegrade(90) != "优秀")
                    System.out.println("test failed 5!");
                else if(Main.percentage2fivegrade(100) != "优秀")
                    System.out.println("test failed 6!");
                else 
                    System.out.println("test passed!"); 
            }
        }
    

    运行结果:

    学会 IDEA中配置单元测试工具JUnit

    • 打开IDEA,选择File->Setting打开设置对话框

    • 在设置对话框中选择Plugins, 单击Marketplace

    • 选择JUnitGenerator V2.0,点击Install安装

    • 安装完成后重启IDEA,要开始配置。

      • 我们在IDEA中新建一个项目,然后新建一个空类MyUtil:
      • 鼠标右击类名,选择go to->test->Create New Test
      • 弹出如下框框,选择JUnit3
    • 这时你会发现你的测试代码放在了src文件夹中,为了区分源代码和测试代码,所以我新建了的一个test文件夹存放测试代码,并将其设置为Test Sources Root,这样你的测试代码就可以自动的放在该文件夹中。

    • 注意:若显示TestCase是红色的,需要在IDEA中的项目中加入junit.jar包,junit.jar包:File->Project Structure->Dependancies->单击+->JARs or Directories

    单元测试用例

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

    运行结果:成功

    任务二

    • StringBuffer的方法

    产品代码

    public class StringBufferDemo {
    
        public StringBuffer setBuffer() {
            StringBuffer buffer = new StringBuffer();
            buffer.append('j');
            buffer.append("kjxlkjc");
            System.out.println(buffer.charAt(1));
            System.out.println(buffer.length());
            System.out.println(buffer.capacity());
            System.out.println(buffer.indexOf("jx"));
            System.out.println(buffer.toString());
            return buffer;
        }
    }
    

    对于这个程序,有五个方法需要测试,分别是:

    • charAt(int i):返回此序列中指定索引处的 char 值。第一个 char 值在索引 0 处,第二个在索引 1 处,依此类推,这类似于数组索引
    • capacity():返回当前容量。容量指可用于最新插入的字符的存储量,超过这一容量就需要再次进行分配
    • length():返回子浮窗的长度
    • indexOf(String s):返回输入的子字符串的第一个字母在母字符串的位置
    • toString(String s):返回此对象本身(它已经是一个字符串)

    测试代码

    import junit.framework.TestCase;
    import org.junit.Test;
    
    public class StringBufferDemoTest extends TestCase {
        StringBuffer buffer1 = new StringBuffer();
        StringBuffer buffer2 = new StringBuffer("i am a student");
        StringBuffer buffer3 = new StringBuffer("i like java");
        StringBufferDemo stringBufferDemo = new StringBufferDemo();
        @Test
        public void testcharAt() {
            buffer1.append('h');
            buffer1.append("ello java");
            assertEquals('l',buffer1.charAt(2));
            assertEquals('h',buffer1.charAt(0));
            assertEquals('k',stringBufferDemo.setBuffer().charAt(1));
        }
        @Test
        public void testlength(){
            assertEquals(0,buffer1.length());
            assertEquals(14,buffer2.length());
            assertEquals(11,buffer3.length());
            assertEquals(8,stringBufferDemo.setBuffer().length());
        }
        @Test
        public void testcapacity(){
            assertEquals(16,buffer1.capacity());
            assertEquals(30,buffer2.capacity());
            assertEquals(27,buffer3.capacity());
            assertEquals(16,stringBufferDemo.setBuffer().capacity());
        }
        public void testToString(){
            assertEquals("",buffer1.toString());
            assertEquals("i am a student",buffer2.toString());
            assertEquals("i like java",buffer3.toString());
            assertEquals("jkjxlkjc",stringBufferDemo.setBuffer().toString());
        }
        public void testIndexOf(){
            assertEquals(0,buffer1.indexOf(""));
            assertEquals(2,buffer2.indexOf("am a st"));
            assertEquals(7,buffer3.indexOf("java"));
            assertEquals(2,stringBufferDemo.setBuffer().indexOf("jxlk"));
        }
    
    }
    

    运行结果

    任务三

    • 题目:4.让系统支持Float类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
      产品代码
    // Server Classes
    abstract class Data {
        abstract public void DisplayValue();
    }
    class Integer extends  Data {
        int value;
        Integer() {
            value=5316;
        }
        public void DisplayValue(){
            System.out.println (value);
        }
    }
    class Float extends  Data {
        float value;
        Float() {
            value=1.23456F;
        }
        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 FloatFactory extends Factory {
        public Data CreateDataObject(){
            return new Float();
        }
    }
    class Document {    //Client classes
        Data pd;
        Document(Factory pf){
            pd = pf.CreateDataObject();
        }
        public void DisplayData(){
            pd.DisplayValue();
        }
    }
    //Test class
    public class MyDoc {
        static Document d,f;
        public static void main(String[] args) {
            d = new Document(new IntFactory());
            d.DisplayData();
            f = new Document(new FloatFactory());
            f.DisplayData();
        }
    }
    

    运行截图

    任务四

    产品代码

    abstract class Data {
        abstract public void DisplayValue();
    }
    
    class Float extends Data {
        float value;{
            value=20175316.4369f;
        }
        public void DisplayValue(){
            System.out.println (value);
        }
    }
    // Pattern Classes
    abstract class Factory {
        abstract public Data CreateDataObject();
    }
    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
      测试代码
    import junit.framework.TestCase;
    import org.junit.Test;
    public class ComplexTest extends TestCase {
        Complex c1 = new Complex(1.0, 2.0);
        Complex c2 = new Complex(2.0, 2.0);
        Complex c3 = new Complex(2.0, 0.0);
        @Test
        public void testComplexAdd() throws Exception {
            assertEquals("3.0+4.0i", c1.ComplexAdd(c2).toString());
            assertEquals("3.0+2.0i", c1.ComplexAdd(c3).toString());
            assertEquals("4.0+2.0i", c2.ComplexAdd(c3).toString());
        }
        @Test
        public void testComplexSub() throws Exception {
            assertEquals("-1.0", c1.ComplexSub(c2).toString());
            assertEquals("-1.0+2.0i", c1.ComplexSub(c3).toString());
            assertEquals("0.0+2.0i", c2.ComplexSub(c3).toString());
        }
        @Test
        public void testComplexMulti() throws Exception {
            assertEquals("-2.0+6.0i", c1.ComplexMulti(c2).toString());
            assertEquals("2.0+4.0i", c1.ComplexMulti(c3).toString());
            assertEquals("4.0+4.0i", c2.ComplexMulti(c3).toString());
        }
    
        @Test
        public void testComplexComplexDiv() throws Exception {
            assertEquals("0.75+0.75i", c1.ComplexDiv(c2).toString());
            assertEquals("1.0+0.5i", c1.ComplexDiv(c3).toString());
            assertEquals("1.0+1.0i", c2.ComplexDiv(c3).toString());
        }
    
    }
    
    

    运行结果:测试成功

    任务五

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

    • 点开StarUML程序后,在右下角的选项中选择Class选项建立一个类的UML图

    • 按照下图中提示分别创建对应的变量层和方法层

    • 在右下角选项中选择Generalization选项,创建类与类之间的调用关系

    UML类截图

    码云连接

    https://gitee.com/shengmaosong/java-besti-20175316/tree/master/shiyan2/src

    实验中遇到的问题

    -(1)junit.jar找不到

    实验感受

    本次实验较难较麻烦,需要细心耐心的一步步做,锻炼我的细心程度,从本次实验中学到了很多,希望以后继续努力。

  • 相关阅读:
    mysql where中如何判断不为空
    python- with和上下文管理器
    python-面向对象-多态
    python
    python魔术方法- __init__,_new_,_call_,_str_,_repr_,_add_,_getitem_,_getattr_,_bases_,_dict_,_slots_
    jmeter 改变字体大小
    如何提高onenote同步速度?
    win10 中添加快捷方式到开始菜单
    解决win10电脑连上wifi但是无internet访问故障
    安装office2019版本后, vb无法引用Microsoft excel object library和Microsoft word object library 解决办法
  • 原文地址:https://www.cnblogs.com/sms369/p/10733722.html
Copyright © 2011-2022 走看看