北京电子科技学院(BESTI)

实 验 报 告

课程:程序设计与数据结构
班级: 1623
姓名: 石亚鑫
学号:20162303

成绩: 2分
指导教师:娄家鹏 王志强
实验日期:4月14日

实验密级: 非密级
预习程度: 已预习
实验时间:10:10-12:00

必修/选修: 必修
实验序号: cs_03

实验内容

  1. 初步掌握单元测试和TDD

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

  3. 初步掌握UML建模

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

  5. 了解设计模式初步掌握单元测试和TDD

实验步骤

(一)单元测试

(1) 三种代码

编程是智力活动,不是打字,编程前要把干什么、如何干想清楚才能把程序写对、写好。当想用程序解决问题时,要会写三种码:
伪代码
产品代码
测试代码

练习:

伪代码

百分制转五分制:
如果成绩小于60,转成“不及格”
如果成绩在60与70之间,转成“及格”
如果成绩在70与80之间,转成“中等”
如果成绩在80与90之间,转成“良好”
如果成绩在90与100之间,转成“优秀”
其他,转成“错误”

产品代码
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 "错误";
}
}
测试代码

1、50分:

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

2、一般情况:

public class MyUtilTest {
public static void main(String[] args) {
    //测试正常情况
    if(MyUtil.percentage2fivegrade(55) != "不及格")
        System.out.println("test failed!");
    else if(MyUtil.percentage2fivegrade(65) != "及格")
        System.out.println("test failed!");
    else if(MyUtil.percentage2fivegrade(75) != "中等")
        System.out.println("test failed!");
    else if(MyUtil.percentage2fivegrade(85) != "良好")
        System.out.println("test failed!");
    else if(MyUtil.percentage2fivegrade(95) != "优秀")
        System.out.println("test failed!");
    else
        System.out.println("test passed!");
}
}

在Eclipse中运行结果如下,测试结果符合预期:

3、为负分或大于100的成绩:

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、运行程序发现负分时与期望不一致,原因是判断不及格时没有要求成绩大于零。增加对负分的判断:

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、测试边界情况,我们对输入为“0,60,70,80,90,100”这些边界情况进行测试:

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

测试结果如下:

6、我们发现边界情况中输入100时有一个Bug。把判断优秀的条件中包含输入为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 "错误";
}
}

(2)TDD

先写测试代码,然后再写产品代码的开发方法叫“测试驱动开发”(TDD)。
TDD的一般步骤如下:

  • 1、明确当前要完成的功能,记录成一个测试列表

  • 2、快速完成编写针对此功能的测试用例

  • 3、测试代码编译不通过(没产品代码呢)

  • 4、编写产品代码

  • 5、测试通过

  • 6、对代码进行重构,并保证测试通过(重构下次实验练习)

  • 7、循环完成所有功能的开发

TDD的编码节奏是:

  • 1、增加测试代码,JUnit出现红条

  • 2、修改产品代码

  • 3、JUnit出现绿条,任务完成

(二)练习

(1)以 TDD的方式研究学习StringBuffer,程序及运行结果如下



(2)用UML中的类图来描述类Dog:

在UML 里,一个类的属性能显示它的名字,类型,初始化值,属性也可以显示private,public,protected。 类的方法能显示它们的方法名,参数,返回类型,以及方法的private,public,protected属性。其中:

+表示public
表示 protected
-表示 private
使用UML可以让我们不必关注细节。

Dog类和Cat类都有Color属性和相应的set和get方法,明显违反了前面提到的DRY原则,我们可以通过继承解决这个问题,把Color属性和相应方法放到父类Animal中,如以下UML较图所示:

(3)使用TDD的方式设计关实现复数类Complex。

伪代码:
1.输入两个复数的四个参数
2.两参数分别为实部与虚部
3.实现两复数的加法、减法、乘法、除法。

代码托管

测试结果:

(4)对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式
OCP是OOD中最重要的一个原则,OCP的内容是:
software entities (class, modules, function, etc.) should open for extension,but closed for modification.
软件实体(类,模块,函数等)应该对扩充开放,对修改封闭。
DIP的内容是:
High level modules should not depend upon low level modules. Both should depend upon abstractions
Abstractions should not depend upon details. Details should depend upon abstractions
高层模块不应该依赖于低层模块。二者都应该依赖于抽象
抽象不应该依赖于细节。细节应该依赖于抽象

(三)统计自己的PSP(Personal Software Process)时间

步骤 耗时 百分比
需求分析 30min 11.5%
设计 30min 11.5%
代码实现 130min 50%
测试 50min 19.2%
分析总结 20min 7.7%

(四)总结单元测试的好处

1.伪代码、测试代码和产品代码分开,实现了程序的逻辑清晰和设计高效
2.有利于维护和修改代码
3.编程思维更加清晰

(五)实验体会

这次实验时间还是比较紧张的,主要原因就是上次实验中没有详细理解idea 的用法,导致花费了大量的时间在研究idea上面。同时,我也理解到了,编写代码与测试代码同样重要,好的代码需要反复的调试才能准确运行。

20162303实验二 Java面向对象程序设计实验报告的更多相关文章

  1. 20145213《Java程序设计》实验二Java面向对象程序设计实验报告

    20145213<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装,继承,多态 初步掌握UML建模 熟悉S.O. ...

  2. 20145206《Java程序设计》实验二Java面向对象程序设计实验报告

    20145206<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...

  3. 20145308刘昊阳 《Java程序设计》实验二 Java面向对象程序设计 实验报告

    20145308刘昊阳 <Java程序设计>实验二 Java面向对象程序设计 实验报告 实验名称 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面相对象三要素:封 ...

  4. 实验二Java面向对象程序设计实验报告(2)

    实验二 Java面向对象程序设计 实验概述: 课程:程序设计与数据结构 班级:1623班 姓名: 邢天岳 学号:2309 指导老师:娄老师 王老师 实验日期:2017.4.16 实验名称: Java面 ...

  5. 实验二 Java面向对象程序设计实验报告

    实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验 ...

  6. 20145326《Java程序设计》实验二Java面向对象程序设计实验报告

    20145326<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...

  7. 20155217 实验二 Java面向对象程序设计 实验报告

    20155217 实验二 Java面向对象程序设计 实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模 ...

  8. 20145219 《Java程序设计》实验二 Java面向对象程序设计实验报告

    20145219 <Java程序设计>实验二 Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S. ...

  9. 20162305 实验二 Java面向对象程序设计 实验报告

    20162305 实验二 Java面向对象程序设计 实验报告 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D ...

  10. 20145239杜文超 《Java程序设计》实验二 Java面向对象程序设计实验报告

    20145239 <Java程序设计>实验二 Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S. ...

随机推荐

  1. 制作Solaris系统的USB启动盘

    制作方法: 1. wget http://192.168.2.5/surefiler-installer/2011-12-09/devel-2011.12.9.tgz 2. cd /root tar  ...

  2. hdu 1087 Super Jumping! Jumping! Jumping!(动态规划DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1087 Super Jumping! Jumping! Jumping! Time Limit: 200 ...

  3. Vue组件-组件的属性

    在html中使用元素,会有一些属性,如class,id,还可以绑定事件,自定义组件也是可以的.当在一个组件中,使用了其他自定义组件时,就会利用子组件的属性和事件来和父组件进行数据交流. 比如,子组件需 ...

  4. hadoop入门学习

    hadoop入门学习:http://edu.csdn.net/course/detail/1397hadoop hadoop2视频:http://pan.baidu.com/s/1o6uy7Q6HDF ...

  5. 非 GUI 模式运行 JMeter 压力测试

    非 GUI 模式,即命令行模式,运行 JMeter 测试脚本能够大大缩减所需要的系统资源. 使用命令:jmeter -n -t <testplan filename> -l <lis ...

  6. xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance(xsi:schemaLocation详解)

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"中xsi的意思是 :本xml文件中要用到某些来自xsi代表的“http:/ ...

  7. 批量导出文件名 另存为bat文件

    @echo offdir /b *.* > 导出的文件名.txtexit

  8. ASPxgridview 编辑列初始化事件

    在初始化编辑咧的时候,给其赋值或者是disable等等.... 贴上代码 protected void master_CellEditorInitialize(object sender, ASPxG ...

  9. python_day7学习笔记

    类 1)创建一个类 #coding=utf-8 __author__ = 'Administrator' class Employee: '所有员工的基类' empCount = 0 def __in ...

  10. HDU-5384

    Danganronpa Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tot ...