20150421 作业5 测试与封装 四则运算

大家写了不少四则运算的练习,这些代码都各有特色,大家写的 “软件” 也有一定的用处。 如果我们要把这个功能放到不同的环境中去 (例如,命令行,windows 图形界面程序,网页程序,手机App), 就会碰到困难, 因为目前代码的普遍问题是代码都散落在main() 函数或者其他子函数中,我们很难把这些功能完整地剥离出来,作为一个独立的模块满足不同的需求。

我们看到,不同的代码解决不同层面的问题,有些是内部数据的计算 (例如四则运算);有些是和用户输入相关的 (例如 scanf,cin,图形界面的输入字段),有些是和数据的展现相关的 (例如 printf ,cout,println),有些是和程序所在平台的架构相关的(例如 main 函数,并不是所有的程序都需要某个特定格式的main)。 这就需要我们对软件的架构做一些整理和优化。

所以,接下来我们要做的是:

在我们第三次练习中,还是采用结对编程的方式 ,但是大家必须换一个队友,我们会了解到模块化编程,信息隐藏,接口设计,TDD,等。

大家把四则运算的计算功能包装在一个模块中 (这个模块可以是一个类 Class, 一个DLL,等等), 为了方便起见,我们叫它 “计算核心” 模块, 这个模块至少在两个地方可以使用:

  • 测试程序,这个可以是一个命令行的程序,或者是JUnit 的框架,或者是Visual Studio 单元测试的框架。这样,我们在算法层级保证了这个模块的正确性。
  • 实际的软件,这是交付给最终用户的软件,有一定的界面和必要的辅助功能。

那么这个“计算核心”模块和使用它的其他模块之间是什么关系呢? 它们要通过一定的API (Application Programming Interface) 来和其他模块交流。 这个API 接口应该怎么设计呢(有经验和实力的童鞋可以考虑一下)? 为了简单,我们可以从下面的最简单的接口开始:

        Calc()

这个Calc 函数接受字符串的输入(字符串里就是运算式子,例如 “ 5+3.5“, “7/8 – 3/8 ”, “3 + 90 * (-0.3)“ 等等),这个模块的返回值是一个字符串,例如,前面几个例子的结果就是 ( ”17.5“, “ 1/2”, “-24“).

假设我们用的是类,我们的测试程序刚开始可以是非常简单的测试例子: (用伪代码表示)

        String  result  = Core.Calc(“1 + 1”) ;

        Assert ( result == “2”);  //我们断言 1 + 1 的结果一定是 2.

然后同学们实现自己 Core 的这个功能。

第一阶段目标 - 能把计算的功能封装起来,通过测试程序和API 接口测试其简单的加法功能。

加法成功之后,然后我们再做减法, 乘法,除法,我们假设目前为止都是两个操作数的运算,还是很容易实现的。 由于同学们已经在自己以前的程序中实现了各种算法,这时候只要把实现的算法搬过来就好了。 大家可以不断增加测试的数量,在每实现一个新的功能的时候,要保证以前运行正确的例子继续是正确的, 通过这样的 “回归测试“, 来保证自己实现的函数一直是正确的。 (请看书中关于单元测试,回归测试的内容)

第二阶段目标 - 通过测试程序和API 接口测试其简单的加减乘除功能。并能看到代码覆盖率。

对于多个运算符的运算,带负数的运算,我们这个模块有一些参数要设置,例如,最多几个运算符,数据范围是多少,还要设置计算的精度(保留几位小数,等等), 这是由什么API 来决定呢? 我们可以扩展 Calc() 的定义,让它接受一个新的参数 “precision”, 或者我们可以启用一个新的函数 Setting()。如果我想表示:

  • 最多4 个运算符
  • 数值范围是 -1000 到 1000
  • 精度是小数点后两位

怎么通过API 告诉我们的模块呢? 我们当然可以用函数的参数直接传递,但是参数的组合很多,怎么定义好参数的规范呢? 建议大家考虑用 XML 来传递这些参数(实际就是在XML定义好规则,然后程序读取XML规则来执行计算)。

增加了新的Setting() 函数之后,我们要让模块支持这样的参数,同时,还要保证原来的各个测试用例继续正确地工作。

第三阶段目标 - 通过测试程序和API 接口测试对于各种参数的支持。并能看到代码覆盖率。

这个时候,如果输入是有错误的,例如 “1 ++ 2”, 在数值范围是 -1000 .. 1000 的时候,传进去 “10000 + 32768”, 或者是 “ 248 / 0” 怎么办? 怎么告诉函数的调用者 “你错了”? 把返回的字符串定义为 “-1” 来表示? 那么如果真的计算结果是 “-1” 又怎么处理呢?

建议这个时候,我们要定义各种异常 (Exception), 让 Core 在碰到各种异常情况的时候,能告诉调用者 - 你错了! 当然,这个时候,我们同样要进行下面的增量修改:

  • 定义要增加什么功能 - 例如:支持 “运算式子格式错误” 异常
  • 写好测试用例,传进去一个错误的式子,期望能捕获这个 异常。 如果没有,那测试就报错。
  • 在 Core 模块中实现这个功能
  • 测试这个功能
  • 同时测试所有以前的功能,保证以前的功能还能继续工作 (没有 regression)
  • 确认功能完成,继续下一个功能

第四阶段目标 - 通过增量修改改进程序, 完成对各种错误情况的处理。

参考资料:

截止时间:2015.4.30号晚7点。

时间: 2024-11-09 00:43:48

20150421 作业5 测试与封装 四则运算的相关文章

作业5 测试与封装 四则运算

package aaa; import java.text.DecimalFormat; import java.util.Scanner; public class Dada { public static void main(String[] args) { int condition=1 ; Dada dada = new Dada(); Scanner scanner = new Scanner(System.in); while(condition==1){ System.out.pr

作业三--测试与封装 5.1

实验内容: 1.第一阶段目标 - 把计算的功能封装成类. 2.设计测试用例:用白盒与黑盒测试设计技术,为计算核心设计测试用例. 3.在实验环境中(如MyEclipse集成开发环境+Junit测试框架)运行测试用例,分析测试结果,找出程序问题,给出改进前后的代码对照. 开发环境:Eclipse 结对子的同伴: 201306114448    练丽云   http://www.cnblogs.com/Lianliyun/ 201306114454  陈汝婷     http://home.cnblo

作业五 测试与封装

封装类 package com.szys.junit; public class Packaging { int m; int n; public T(int m,int n) { this.m=m; this.n=n; } public int add() { return m + n; } public int minus() { return m - n; } public int mul() { return m * n; } public int div()throws Excepti

作业5 四则运算 测试与封装 5.2

作业5 四则运算 测试与封装  5.2 开发环境:   Eclipse 开发人员:   欧其锋(201306114305) 余汉城(201306114317)(http://www.cnblogs.com/yuhancheng/) 分工:   欧其锋:异常处理 余汉城:重构 源代码: 1 package GongNengpk; 2 3 import GongNengpkTest.ChuShuLingException; 4 import GongNengpkTest.JCException; 5

【作业报告】作业5 四则运算 测试与封装 5.1

测试与封装 5.1 程序开发简介: [开发环境]:eclipse [开发人员]:Ives & 郑胜斌 [博客地址]:38郑胜斌 [开发时间]:2015-04-30 [版本]:5.1 [要求]: 封装 测试 封装: 概念 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象.封装是一种信息隐藏技术,在java中通过关键字private实现封装.什么是封装?封装把对象的所

四则运算,测试与封装。

测试与封装 5.1 程序开发简介: [开发环境]:eclipse [开发人员]:Ives & 郑胜斌 [博客地址]:http://www.cnblogs.com/IvesHe/ [开发时间]:2015-04-30 [版本]:5.1 [要求]: 封装 测试 [分工]: Ives:单元测试.界面.自定义异常. 郑胜斌:封装 Expression类. 封装: 概念 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对

测试与封装5.1

我的队友是52吴舒婷,博客内容主要是白盒黑盒的测试数据分析 我们通过简单的四则运算来进行程序的测试与封装 我们主要完成的是事情 (1)封装:将运算要运用的方法进行封装 文件主要有三个:Calculate(存放运算要用得到方法).CalcuTest(主要main方法).Test(测试) Calculate中主要的方法:Cal()运算.input()输入.judge判断() 代码如下:CalcuTest(主要main方法) package Test.src.src; import java.util

小学生四则运算程序的简单测试与封装

程序原型:之前写的小学生四运算程序 实验环境:java语言 封装代码如下: 1 package SuanFa; 2 3 public class Core { 4 public double jia(double a,double b) 5 { 6 double c=a+b; 7 return c; 8 } 9 public double jian(double a,double b) 10 { 11 double c=a-b; 12 return c; 13 } 14 public doubl

第4次作业类测试代码+101+谢艳敏

类测试代码的具体要求如下: 界面操作说明补充: 点击OK,如果输入有效,进行相应的数值计算:如果数值不满足约束,则弹出错误说明,统一为"输入有误,请重新输入",然后回到初始输入状态. 点击Cancle,表示重置,清空前面的数据,回到初始状态. (2)NextDate函数问题 String  nextdate(int m,int d,int y) 建立界面,至少包含以下元素,但不限于此: 完成上一天方法:String lastDay(int m,int d,int y) ,完成周几的方法