一、单元测试和TDD

用程序解决问题时,要学会写以下三种代码:

伪代码

产品代码

测试代码

正确的顺序应为:伪代码(思路)测试代码(产品预期功能)产品代码(实现预期功能),这种开发方法叫“测试驱动开发”(TDD)。TDD的一般步骤如下:

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

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

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

编写产品代码

测试通过

基于TDD,可以有效避免过度开发的现象,因为我们只需要让测试通过即可。

一:



实现百分制成绩转成“优、良、中、及格、不及格”五级制成绩的功能

  • 首先用伪代码理思路:

    如果成绩小于60,转成“不及格”

    如果成绩在60与70之间,转成“及格”

    如果成绩在70与80之间,转成“中等”

    如果成绩在80与90之间,转成“良好”

    如果成绩在90与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 "错误";

}

}

  • 测试代码不就是多次调用System.out.println():

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!");

}

}

二、



以TDD的方式研究学习StringBuffer

  • 自己写JUnit测试用例:

    public static void main(String [] args){

    StringBuffer buffer = new StringBuffer();

    buffer.append('S');

    buffer.append("tringBuffer");

    System.out.println(buffer.charAt(1));

    System.out.println(buffer.capacity());

    System.out.println(buffer.length());

    System.out.println(buffer.indexOf("tring"));

    System.out.println("buffer = " + buffer.toString());

  • 对于这个程序,有有四个方面来测试,charAt()、capacity()、length()、indexOf产品代码如下:

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

}

}

  • 接下来我们需要对调用各种方法的返回值进行猜测:

    public class StringBufferDemoTest extends TestCase {

    StringBuffer a = new StringBuffer("StringBuffer");//测试12个字符(<=16)

    StringBuffer b = new StringBuffer("StringBufferStringBuffer");//测试24个字符(>16&&<=34)

    StringBuffer c = new StringBuffer("StringBufferStringBufferStringBuffer");//测试36个字符(>=34)

    @Test

    public void testcharAt() throws Exception{

    assertEquals('S',a.charAt(0));

    assertEquals('g',a.charAt(5));

    assertEquals('r',a.charAt(11));

    }

    @Test

    public void testcapacity() throws Exception{

    assertEquals(28,a.capacity());

    assertEquals(40,b.capacity());

    assertEquals(52,c.capacity());

    }

    @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(10,a.indexOf("er"));

    }

    }

三、对MyDoc类进行扩充,让其支持Short类,初步理解设计模式。

  • OCP是OOD中最重要的一个原则,要求软件实体(类,模块,函数等)应该对扩充开放,对修改封闭。同时,模块的源代码是不可改动的,任何人都不许修改已有模块的源代码。已有的支持Int型的代码如下:

    abstract class Data{

    public abstract void DisplayValue();

    }

    class Integer extends Data {

    int value;

    Integer(){

    value=100;

    }

    public void DisplayValue(){

    System.out.println(value);

    }

    }

    class Document {

    Data pd;

    Document() {

    pd=new Integer();

    }

    public void DisplayData(){

    pd.DisplayValue();

    }

    }

    public class MyDoc {

    static Document d;

    public static void main(String[] args) {

    d = new Document();

    d.DisplayData();

    }

    }

  • 要求支持Short类,Document类要修改构造方法,这还违反了OCP原则。封装、继承、多态解决不了问题了,这时需要设计模式了:

abstract class Data {

abstract public void DisplayValue();

}

class Integer extends Data {

int value;

Integer() {

value=100;

}

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 Short extends Data、class ShortFactory extends Factory即可使系统支持Short类型,测试代码如下:

public class MyDoc {

static Document d;

public static void main(String[] args) {

d = new Document(new ShortFactory());

d.DisplayData();

}

}

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

  • TDD的编码节奏是:增加测试代码,JUnit出现红条 - 修改产品代码 - JUnit出现绿条,任务完成

  • 测试代码:

    public class ComplexTest extends TestCase {

    Complex c1 = new Complex(0, 3);

    Complex c2 = new Complex(-1, -1);

    Complex c3 = new Complex(2,1);

    @Test

    public void testgetRealPart() throws Exception {

    assertEquals(-1.0, Complex.getRealPart(-1.0));

    assertEquals(5.0, Complex.getRealPart(5.0));

    assertEquals(0.0, Complex.getRealPart(0.0));

    }

    @Test

    public void testgetImagePart() throws Exception {

    assertEquals(-1.0, Complex.getImagePart(-1.0));

    assertEquals(5.0, Complex.getImagePart(5.0));

    assertEquals(0.0, Complex.getImagePart(0.0));

    }

    @Test

    public void testComplexAdd() throws Exception {

    assertEquals("-1.0+2.0i", c1.ComplexAdd(c2).toString());

    assertEquals("2.0+4.0i", c1.ComplexAdd(c3).toString());

    assertEquals("1.0", c2.ComplexAdd(c3).toString());

    }

    @Test

    public void testComplexSub() throws Exception {

    assertEquals("1.0+4.0i", c1.ComplexSub(c2).toString());

    assertEquals("-2.0+2.0i", c1.ComplexSub(c3).toString());

    assertEquals("-3.0 -2.0i", c2.ComplexSub(c3).toString());

    }

    @Test

    public void testComplexMulti() throws Exception {

    assertEquals("3.0 -3.0i", c1.ComplexMulti(c2).toString());

    assertEquals("-3.0+6.0i", c1.ComplexMulti(c3).toString());

    assertEquals("-1.0 -3.0i", c2.ComplexMulti(c3).toString());

    }

    @Test

    public void testComplexComplexDiv() throws Exception {

    assertEquals("-1.5 -1.5i", c1.ComplexDiv(c2).toString());

    assertEquals("1.2+0.6i", c1.ComplexDiv(c3).toString());

    assertEquals("-0.6 -0.6i", c2.ComplexDiv(c3).toString());

    }

    }

  • 产品代码:

public class Complex{

private double r;

private double i;

public Complex(double r, double i) {
this.r = r;
this.i = i;
} public static double getRealPart(double r) {
return r;
} public static double getImagePart(double i) {
return i;
} public Complex ComplexAdd(Complex c) {
return new Complex(r + c.r, i + c.i);
}
public Complex ComplexSub(Complex c) {
return new Complex(r - c.r, i - c.i);
}
public Complex ComplexMulti(Complex c) {
return new Complex(r * c.r - i * c.i, r * c.i + i * c.r);
}
public Complex ComplexDiv(Complex c) {
return new Complex((r * c.i + i * c.r)/(c.i * c.i + c.r * c.r), (i * c.i + r * c.r)/(c.i * c.i + c.r * c.r));
} public String toString() {
String s = " ";
if (i > 0)
s = r + "+" + i + "i";
if (i == 0)
s = r + "";
if (i < 0)
s = r + " " + i + "i";
return s;
}

}

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

20155307《Java程序设计》实验二实验报告的更多相关文章

  1. 20145120 《Java程序设计》实验二实验报告

    20145120 <Java程序设计>实验二实验报告 实验名称:Java面向对象程序设计 实验目的与要求: 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握U ...

  2. 2015526 《Java程序设计》实验二实验报告

    2015526 <Java程序设计>实验二实验报告 一.单元测试和TDD 用程序解决问题时,要学会写以下三种代码: 伪代码 产品代码 测试代码 正确的顺序应为:伪代码(思路)→ 测试代码( ...

  3. 20155301 《Java程序设计》实验二实验报告

    20155301 <Java程序设计>实验二实验报告 一.单元测试和TDD 用程序解决问题时,要学会写以下三种代码: 伪代码 产品代码 测试代码 正确的顺序应为:伪代码(思路)→ 测试代码 ...

  4. 20145314郑凯杰 《Java程序设计》实验二 实验报告

    20145314郑凯杰 <Java程序设计>实验二 实验报告 实验要求 完成实验.撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用 ...

  5. 20145328 《Java程序设计》实验二实验报告

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

  6. Java实验二实验报告:java面向对象程序设计

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

  7. 20155235 《Java程序设计》 实验二 实验三 敏捷开发与XP实践

    20155235 <Java程序设计> 实验二 实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验内容 没有Linux基础的同学建议先学习<Linux基础入 ...

  8. 20145240 《Java程序设计》第一次实验报告

    20145240 <Java程序设计>第一次实验报告 实验内容 一.命令行下java程序开发 1.建立Code目录,输入mkdir 20145240命令建立实验目录,并使用dir命令查看目 ...

  9. 20145330《Java程序设计》第一次实验报告

    20145330<Java程序设计>第一次实验报告 实验一Java开发环境的熟悉 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Ja ...

  10. 20145320《Java程序设计》第一次实验报告

    20145320<Java程序设计>第一次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.04.08 18: ...

随机推荐

  1. URAL-1019 Line Painting----暴力或线段树

    题目链接: https://cn.vjudge.net/problem/URAL-1019 题目大意: 一个0~1e9的区间,初始都是白的,现进行N次操作,每次将一段区间图上一中颜色.最后问说连续最长 ...

  2. BZOJ1079:[SCOI2008]着色方案(DP)

    Description 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块. 所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个 ...

  3. 【[SCOI2010]序列操作】

    好颓啊,我竟然来写了一道恶心的板子 旁边的魏佬嘲讽我,还用欺负我 嘤嘤嘤 那就不膜魏佬了 嘤嘤嘤 这是一道无聊的板子 看到这些操作,我们看到这些操作就知道我们需要维护的东西了 首先那个最长的连续的\( ...

  4. Window窗口布局 --- DecorView浅析

    开发中,通常都是在onCreate()中调用setContentView(R.layout.custom_layout)来实现想要的页面布局,我们知道,页面都是依附在窗口之上的,而DecorView即 ...

  5. bbs论坛浏览器兼容性问题

    一直都是在chrome上进行调试,今天终于把bbs论坛这个项目搭建完了,进入IE.Firefox看了看 吓哭了!!! 火狐 Edge chrome 特别是加了<!DOCTYPE html> ...

  6. python函数可变参数*args和**kwargs区别

    #*args(元组列表)和**kwargs(字典)的区别 def tuple_test(*args): for i in args: print 'hello'+i s=('xuexi','mili' ...

  7. 【luogu P4180 严格次小生成树[BJWC2010]】 模板

    题目链接:https://www.luogu.org/problemnew/show/P4180 这个题卡树剖.记得开O2. 这个题inf要到1e18. 定理:次小生成树和最小生成树差距只有在一条边上 ...

  8. web测试--数据分层测试

    转自:51Testing 测试效率低下?很多时间都在等程序开发功能,直到界面层展现出来数据后,我们才能介入测试,然后忙的焦头烂额,上线前心里还没底.亦或者发现一个Bug,发给程序猿A查,程序猿A说,可 ...

  9. 奇妙的CSS3—导航栏下划线跟随效果

    先来看一下效果: 1.基本效果就是这样的 ,鼠标悬停,下划线划入.鼠标离开,下划线划出 2.下划线的划入是有方向的,从左侧划入悬停,下划线由左向右伸长.从右侧划入,下划线由又往左伸长 实现思路 1.导 ...

  10. I、Python 环境搭建

    I.安装Python https://www.python.org/downloads/windows/ 下载路径总是变,认准那个名字 安装, 记住,所有语言都推荐安装在 默认路径,不要相信那些让你改 ...