• 任务06——封装与单元测试


    “最后,针对于本次任务,按照以下 Markdown 模板,发布一篇博客”

      对于这个要求,不是很明白怎么做,就照葫芦画瓢吧。。。

      博客会以md格式的文件上传到github一份。

    # 模块代码地址

    - [Core 模块代码地址](https://github.com/jinxiaohang/OperationUnitTest)

    - [单元测试代码地址](https://github.com/jinxiaohang/OperationUnitTest)

    两个地址是一样的,为了方便,所以把测试的代码很模块代码放在一起git了。

    # 封装阶段

    ##

    ```public class Core {```

    public static StringBuffer Suffix(StringBuffer infix){
    Stack<Character> stack=new Stack <Character>();
    StringBuffer suffix=new StringBuffer();
    int i=0;
    char tempchar=infix.charAt(i++);
    char tempchar2=' ';
    try {
    while (tempchar!='='){
    switch (tempchar){
    case '(':
    stack.push(tempchar);
    tempchar=infix.charAt(i++);
    break;
    case ')':
    while (stack.peek()!='('){
    tempchar2=stack.pop();
    suffix.append(tempchar2);
    suffix.append(' ');
    if (stack.empty()) {
    break;
    }
    }
    if (!stack.empty()) {
    stack.pop();
    }
    tempchar=infix.charAt(i++);
    break;
    case '+':
    case '-':
    while (!stack.empty()&&stack.peek()!='('){
    tempchar2=stack.pop();
    suffix.append(tempchar2);
    suffix.append(' ');
    }
    stack.push(tempchar);
    tempchar=infix.charAt(i++);
    break;
    case '×':
    case '*':
    case '/':
    case '÷':
    Character ch=new Character(' ');
    if (!stack.empty()) {
    while((ch=stack.peek()).equals('×')||(ch=stack.peek()).equals('÷'))
    {
    tempchar2=stack.pop();
    suffix.append(tempchar2);
    suffix.append(' ');
    if (stack.empty()) {
    break;
    }
    }
    }
    stack.push(tempchar);
    tempchar=infix.charAt(i++);
    break;
    case ' ':
    tempchar=infix.charAt(i++);
    break;
    default:
    while(tempchar<='9'&&tempchar>='0')
    {
    suffix.append(tempchar);
    tempchar=infix.charAt(i++);
    }
    suffix.append(' ');
    break;
    }


    }
    while(!stack.empty())
    {
    tempchar2=stack.pop();
    suffix.append(tempchar2);
    suffix.append(' ');
    }

    suffix.append('');
    } catch (Exception e) {
    e.printStackTrace();
    }
    return suffix;
    }

    //根据后缀表达式计算结果(小数格式的String类型)
    public static String Calculate(StringBuffer suffix){
    int i=0;
    char tempchar=suffix.charAt(i++);
    double []answer=new double[20];
    int top=0,d;
    String Answer= null;
    try {
    while (tempchar!=''){
    switch (tempchar){
    case '+':
    answer[top-1]=answer[top-1]+answer[top];
    top--;
    tempchar=suffix.charAt(i++);
    break;
    case '-':
    answer[top-1]=answer[top-1]-answer[top];
    top--;
    tempchar=suffix.charAt(i++);
    break;
    case '*':
    case '×':
    answer[top-1]=answer[top-1]*answer[top];
    top--;
    tempchar=suffix.charAt(i++);
    break;
    case '/':
    case '÷':
    try {
    if(answer[top]!=0)
    answer[top-1]=answer[top-1]/answer[top];
    else
    {
    System.out.println(" 除零错误! ");
    throw new InvalidExpression("无效的表达式");
    }
    } catch (InvalidExpression invalidExpression) {
    invalidExpression.printStackTrace();
    System.exit(0);
    }
    top--;
    tempchar=suffix.charAt(i++);
    break;
    case ' ':
    tempchar=suffix.charAt(i++);
    break;
    default:
    d=0;
    while(tempchar>='0'&&tempchar<='9')
    {
    d=10*d+tempchar-'0';//将数字字符转化为对应的数值
    tempchar=suffix.charAt(i++);
    }
    top++;
    answer[top]=d;
    break;
    }
    }
    Answer = null;
    if (top!=1){
    throw new InvalidExpression("无效的表达式");
    }
    Double an=new Double(answer[top]);
    Answer = new String(an.toString());

    }catch (InvalidExpression invalidExpression) {
    invalidExpression.printStackTrace();
    }catch (Exception e) {
    e.printStackTrace();
    }
    return Answer;
    }
    ```}```

    ## 在封装的过程中遇到的困难,以及是如何解决的:

    对于封装首先想到几天前学习的软件工程的知识,关于模块的分解、抽象,恰好与本次的任务吻合,可以理论用于实践。上图是我画的UML图,在尝试在学习中,算不上很规范,但能基本看懂大概的结构。
    因为之前的代码基于结构化编程,运用函数思想,所以在本次封装过程中很好的将功能抽象出来,这次完成的虽然不是很完美,但后期可以通过老师的指导不断改进。

    # 单元测试阶段

    ## 单元测试代码 此处粘贴单元测试代码(用一对 ``` 把代码括起来)
    public class CoreTest {

    @Before
    public void before() throws Exception {
    }

    @After
    public void after() throws Exception {
    }

    /**
    *
    * Method: Suffix(StringBuffer infix)
    *
    */
    @Test
    public void testSuffix() throws Exception {
    Core s=new Core();
    s.Suffix(new StringBuffer("1+2+3="));
    s.Suffix(new StringBuffer("1+2×3="));
    s.Suffix(new StringBuffer("1+2÷3="));
    s.Suffix(new StringBuffer("1÷2×3="));
    s.Suffix(new StringBuffer("1÷+2×3="));
    s.Suffix(new StringBuffer("1÷2*3="));
    s.Suffix(new StringBuffer("1÷0×3="));
    s.Suffix(new StringBuffer("1÷2×0="));

    }

    /**
    *
    * Method: Calculate(StringBuffer suffix)
    *
    */
    @Test
    public void testCalculate() throws Exception {
    Core s=new Core();
    s.Calculate(new StringBuffer("1 2 + 3 +"));
    s.Calculate(new StringBuffer("1 + 2 + 3 +"));
    s.Calculate(new StringBuffer("1 2 +"));
    s.Calculate(new StringBuffer("1 2 × 3 +"));
    s.Calculate(new StringBuffer("1+ + 2 × 3 +"));
    }


    }


    ## 单元测试运行结果(截图,含测试是否全部通过,代码覆盖率等)

    ## 在编写单元测试代码过程中遇到的困难,以及是如何解决的
    按照老师提供的教程,一开始看不懂,需要自己慢慢琢磨,Junit包,不知道是哪个,IDEA上找到有好多个,后来自己在网上找一个发现可以用。
    下面提供它的下载网址。
    链接:http://pan.baidu.com/s/1o84pWQQ 密码:1mda

    别的大问题没有,关于对Core的测试,计算表达式都是自己按照规则生成的,不会出现不规则的情况,
    所以对于测试情况的全面性没有更深一步进行。
    # 感受(小结)
    Junit很方便,测试的时候,不能以编程时的思维方式去看待问题,否则有些问题永远测试不出来。
    需要打破常规的思路,不能认为自己的代码运行结果都是对的。

  • 相关阅读:
    linux下tomcat权限的问题
    树莓派安装Tomcat服务器
    Javascript基础——Object对象和Object原型对象
    electron
    ES6-21:编程风格、ECMAScript规格
    番外篇01:angularJS最佳实战
    ES6-18:class类及其继承
    ES6-10:Promise
    ES6-09:新增API—Proxy、Reflect
    ES6-08:新增数据结构—Set、WeakSet、Map、weakMap
  • 原文地址:https://www.cnblogs.com/jinxiaohang/p/6741095.html
Copyright © 2020-2023  润新知