• 任务06——封装与单元测试(Markdown版)


    模块代码地址

    两个地址是一样的,为了方便,所以把测试的代码很模块代码放在一起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图,在尝试在学习中,算不上很规范,但能基本看懂大概的结构。
    因为之前的代码基于结构化编程,运用函数思想,所以在本次封装过程中很好的将功能抽象出来,这次完成的虽然不是很完美,但后期可以通过老师的指导不断改进。

    单元测试阶段

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

    
    	@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很方便,测试的时候,不能以编程时的思维方式去看待问题,否则有些问题永远测试不出来。
    需要打破常规的思路,不能认为自己的代码运行结果都是对的。

  • 相关阅读:
    教你如何让数据库支持emoji表情符存储
    PHP下载远程图片的3个方法
    CentOS7安装使用MySQL
    记录几个项目管理软件
    C++和C在linux下 和在windows下有什么区别?
    nginx配置location总结及rewrite规则写法
    A记录和CNAME记录的区别
    Nginx配置https的wordpress站点,wp-content目录下资源404解决方案
    清除chrome浏览器HSTS缓存
    面向对象基础----封装数据库操作类
  • 原文地址:https://www.cnblogs.com/jinxiaohang/p/6773642.html
Copyright © 2020-2023  润新知